很多网站都使用javascript...网页内容由js动态生成,一些js事件触发的页面内容变化,链接打开.甚至有些网站在没有js的情况下根本不工作,取而代之返回你一条类似"请打开浏览器js"之类的内容.

对javascript的支持有四种解决方案:
1,写代码模拟相关js逻辑.
2,调用一个有界面的浏览器,类似各种广泛用于测试的,selenium这类.
3,使用一个无界面的浏览器,各种基于webkit的,casperjs,phantomjs等等.
4,结合一个js执行引擎,自己实现一个轻量级的浏览器.难度很大.

对于简单的有限爬取任务,若可以通过代码模拟js逻辑,首选这种方案,例如,在duckduckgo搜索引擎中,翻页这个动作是靠js触发的.模拟似乎还是很难,然后我注意到他页面的第二个form,似乎submit后就可以翻页,试了一下果然如此.
在写代码模拟相关js逻辑时,首先试下关闭浏览器的js,看下是否能获取到需要的东西.有些页面提供了没有js的兼容.不行再开chrome的控制台或firebug观察js逻辑,可能是ajax这类收发包.用urllib2(推荐requests库)模拟即可,也可能是修改dom之类,用lxml这类对应修改即可.说来就是js执行了什么,就用python代码对应模拟执行.

也可选择使用selenium这类,缺点是效率很低,你应当先测试一下selenium启动一个浏览器实例所需时间你是否可接受.这个时间一般在秒级别.再考虑到浏览器打开页面渲染,就更慢了.在效率可接受的前提下,这个方案也不错.
这个方案的另一个问题是在没有桌面环境的服务器上,selenium目测无法运行.

对规模不小,模拟js不可行,selenium效率太低,或需要在无桌面环境上执行的情况.有无界面浏览器,几个无界面浏览器大体情况如下:
1,casperjs,phantomjs:非py,可以通过命令行调用,功能基本满足,推荐先看下这两个是否满足.比较成熟.phantomjs还有一个非官方的webdriver协议实现,由此可通过selenium调phantomjs实现无界面.
2,ghost,spynner等:py定制的webkit,个人觉得spynner代码乱,ghost代码质量不错.但有bug.我看过几个这类库后自己改了一个.
这种方案的详细情况见下面.

最后还有一种选择,在js执行引擎的基础上,自己实现一个轻量级的支持js的无界面浏览器.除非你有非常非常非常多需要爬取的内容,效率十分十分十分重要.若你有这个想法,可以看下pyv8,在v8的示例代码中有一个基于v8实现的简易浏览器模型.是的,只是个模型,并不完全可用,你要自己填充里面的一些方法.实现这些你需要在js引擎(v8),http库(urllib2)之上实现这些功能,1,当网页打开时获取其包含的js代码,2,构建一个浏览器模型,包括各种事件与dom树.3,执行js.除此之外可能还有其他一些细节.难度较大.
网上可以找到一淘所用购物比价爬虫的一篇相关ppt.该爬虫也仅使用的第三种方案.可以看下这篇ppt.该爬虫大概是用的webkit,scrapy,另外把scrapy的调度队列改为基于redis的,实现分布式.

如何实现:

回头谈点背景知识,scrapy使用了twisted.一个异步网络框架.因此要留意潜在的阻塞情况.但注意到settings中有个参数是设置ItemPipeline的并行度.由此推测pipeline不会阻塞,pipeline可能是在线程池中执行的(未验证).Pipeline一般用于将抓取到的信息保存(写数据库,写文件),因此这里你就不用担心耗时操作会阻塞整个框架了,也就不用在Pipeline中将这个写操作实现为异步.
除此之外框架的其他部分.都是异步的,简单说来就是,爬虫生成的请求交由调度器去下载,然后爬虫继续执行.调度器完成下载后会将响应交由爬虫解析.

网上找到的参考例子,部分将js支持写到了DownloaderMiddleware中,scrapy官网的code snippet也是这样
.若这样实现,就阻塞了整个框架,爬虫的工作模式变成了,下载-解析-下载-解析,而不在是并行的下载.在对效率要求不高的小规模爬取中问题不大.
更好的做法是将js支持写到scrapy的downloader里.网上有一个这样的实现(使用selenium+phantomjs).不过仅支持get请求.

在适配一个webkit给scrapy的downloader时,有各种细节需要处理.

http://www.qytang.com/cn/list/28/463.htm
http://www.qytang.com/cn/list/28/458.htm
http://www.qytang.com/cn/list/28/455.htm
http://www.qytang.com/cn/list/28/447.htm
http://www.qytang.com/cn/list/28/446.htm
http://www.qytang.com/cn/list/28/445.htm
http://www.qytang.com/cn/list/28/444.htm
http://www.qytang.com/cn/list/28/442.htm
http://www.qytang.com/cn/list/28/440.htm
http://www.qytang.com/cn/list/28/437.htm
http://www.qytang.com/cn/list/28/435.htm

scrapy定制爬虫-爬取javascript——乾颐堂的更多相关文章

  1. 使用scrapy爬虫,爬取17k小说网的案例-方法一

    无意间看到17小说网里面有一些小说小故事,于是决定用爬虫爬取下来自己看着玩,下图这个页面就是要爬取的来源. a 这个页面一共有125个标题,每个标题里面对应一个内容,如下图所示 下面直接看最核心spi ...

  2. 爬虫系列5:scrapy动态页面爬取的另一种思路

    前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考<scrapy动态页面爬取>).但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓 ...

  3. 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  4. node:爬虫爬取网页图片

    代码地址如下:http://www.demodashi.com/demo/13845.html 前言 周末自己在家闲着没事,刷着微信,玩着手机,发现自己的微信头像该换了,就去网上找了一下头像,看着图片 ...

  5. Python爬虫爬取全书网小说,程序源码+程序详细分析

    Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...

  6. Scrapy持久化存储-爬取数据转义

    Scrapy持久化存储 爬虫爬取数据转义问题 使用这种格式,会自动帮我们转义 'insert into wen values(%s,%s)',(item['title'],item['content' ...

  7. Node.js 爬虫爬取电影信息

    Node.js 爬虫爬取电影信息 我的CSDN地址:https://blog.csdn.net/weixin_45580251/article/details/107669713 爬取的是1905电影 ...

  8. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

  9. python爬虫爬取京东、淘宝、苏宁上华为P20购买评论

    爬虫爬取京东.淘宝.苏宁上华为P20购买评论 1.使用软件 Anaconda3 2.代码截图 三个网站代码大同小异,因此只展示一个 3.结果(部分) 京东 淘宝 苏宁 4.分析 这三个网站上的评论数据 ...

随机推荐

  1. 封装与继承(PHP学习)

    什么是封装? 答:封装时不知道内部构造,对外部只展现功能的这种行为.例如:收音机,你不知道收音机内部的构造,但是你知道收音机是能用来听广播的. 在PHP中,封装是,不对外公布,属性和方法,这些属性和方 ...

  2. Java堆栈解析

    1.RAM和ROM区别RAM-RamdomAccessMemory随机存取存储器(断电后数据会丢失),高速存取,读写时间相等,且与地址无关,如计算机内存等. ROM-Read Only Memory只 ...

  3. Paramiko,数据库

    Paramiko 该模块基于SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 import paramiko # 创建SSH对象 ssh = paramik ...

  4. 深入 innodb

    深入innodbInnoDB表为IOT,采用了B+树类型,故每个页面至少要存储2行数据,如果行过大则会产生行溢出:理论上InnoDB表中varchar可存储65535字节,但对于InnoDB其实际上限 ...

  5. supervisor 管理

    Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管理的进程 ...

  6. OD 实验(五) - 对 PE 结构的简单分析

    载入程序,按 Alt+M 查看内存空间 双击进入程序的 PE 头 这些为 DOS 环境下才会运行的 这个执行 PE 的地址,PE 结构的偏移地址为 C0 找到这个地址 以 PE 开头 SizeOfCo ...

  7. MySQL的安装和基本管理

    ---恢复内容开始--- MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle(甲骨文)旗下公司.MySQL最流行的关系型数据库管理系统.在web应用方面MySQ ...

  8. nginx 代理http配置实例

    #user nginx; worker_processes ; #error_log /var/log/nginx/error.log warn; #pid /var/run/nginx.pid; e ...

  9. 关于1.0.0版Backbone.js调用validate

    网上的调用这个方法的例子都是老版本的,新版本的调用方法有所变化,首先错误绑定事件error换成了invalid,其次设置数据时应传入{validate: true} var Chapter = Bac ...

  10. EDAS字体嵌入问题解决方法

    提交IEEE EDAS文章时出现:“The paper PDF file cannot be accepted: Publishers require that PDF fonts are embed ...