很多网站都使用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. 在64位的UBUBTU 服务器 ***

    前言: 安装/重装系统,U盘启动盘不稳定,建议使用USB-CDROM启动 如果是重装系统,要记录好硬盘的信息和职能: fdisk -l lsblk blkid /etc/fstab mkfs.ext3 ...

  2. VS2003在vista/win7下搜索会出现僵死

    1.  VS2003在vista下搜索关键词的时候会出现僵死的问题的解决方案: VS2003快捷方式右击选中属性->兼容性页签 : 选中用兼容模式运行这个程序,下拉框中用windows xp2 ...

  3. Oracle事务的ACID特性

    Oracle事务的ACID特性 1.原子性(Atomicity) 事务的原子性是指事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的. 例如:A帐户向B帐户划账1000,则先将A减少1000 ...

  4. CSS各浏览器HACK

    /*firefox*/@-moz-document url-prefix(){.mainNews div.l ul{padding-bottom:12px}} /*ie6*/{_padding:2px ...

  5. Msys2+mingw-w64 编译VS2013使用的ffmpeg静态库注意事项

    1.环境准备 第一步:从http://sourceforge.net/projects/msys2/下载msys2的安装程序安装msys2; 第二步:通过msys2的包管理工具pacman安装ming ...

  6. bzoj4598: [Sdoi2016]模式字符串

    Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m 的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有 ...

  7. jQuery给控件赋值....

    1.jQuery给span取值:$("#id").html(); 2.jQuery给input取值:$("#id").val(); 3.jQuery给texta ...

  8. 深入 innodb

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

  9. 在Eclipse中使用Maven部署项目的Tomcat

    方式一:打war包到tomcat/webapps目录 点击在项目上面 -> 右键 -> Run As -> Maven install 之后查看Maven输出路径: D:\apach ...

  10. 详解华为交换机iStack特性

    iStack特性的产品支持 iStack也就是我们平时所说的“堆叠”,但是华为交换机的iStack功能与其他厂商的交换机堆叠功能相比又有许多不同.在最新的Sx700大系中,只有S2700.S3700. ...