快捷搜索:  as

scrapy定制爬虫-爬取javascript内容

很多网站都应用javascript...网页内容由js动态天生,一些js事故触发的页面内容变更,链接打开.以致有些网站在没有js的环境下根本不事情,取而代之返回你一条类似"请打开浏览器js"之类的内容.

对javascript的支持有四种办理规划:

1,写代码模拟相关js逻辑.

2,调用一个有界面的浏览器,类似各类广泛用于测试的,selenium这类.

3,应用一个无界面的浏览器,各类基于webkit的,casperjs,phantomjs等等.

4,结合一个js履行引擎,自己实现一个轻量级的浏览器.难度很大年夜.

对付简单的有限爬取义务,若可以经由过程代码模拟js逻辑,首选这种规划,例如,在duckduckgo搜索引擎中,翻页这个动作是靠js触发的.模拟彷佛照样很难,然后我留意到他页面的第二个form,彷佛submit后就可以翻页,试了一下公然如斯.

进修Python中的小伙伴,必要进修资料的话,可曩昔往我的微信"民众,"号:速学Python,后台回覆:简书,即可拿Python进修资料

这里有我自己收拾了一套最新的python系统进修教程,包括从根基的python脚本到web开拓、爬虫、数据阐发、数据可视化、机械进修等。送给正在进修python的小伙伴!这里是python进修者凑集地,迎接初学和进阶中的小伙伴!

在写代码模拟相关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时,有各类细节必要处置惩罚.

您可能还会对下面的文章感兴趣: