使用scrapy的定制爬虫-第三章-爬虫的javascript支持

-.-编辑中.我语文是数学老师教的...
后续补充参考代码,链接.

很多网站都使用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时,有各种细节需要处理.
待续......

时间: 2024-11-10 00:27:02

使用scrapy的定制爬虫-第三章-爬虫的javascript支持的相关文章

爬虫第三章 模拟登录

模拟登录 为什么要进行模拟登录 - 有时候我们要进行登录之后,才能爬取到的数据 为什么要识别验证码 - 验证码往往是作为登录中发送的请求参数进行使用的 验证码识别: 借助于一些线上打码平台(超级鹰,云打码,打码兔) 超级鹰的使用流程: - 注册:注册一个<用户中心>身份的账号 - 登录:基于<用户中心>进行登录 - 点击 软件ID -->生成一个软件id - 下载示例代码:点击开发文档->选择python语言->点击下载 代理操作 cookle操作 线程池 实例:

轻松入门Python爬虫,三个爬虫版本,带你以各种方式爬取校花网

爬虫是什么? 如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛, 沿着网络抓取自己的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程序: 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片.视频) 爬到本地,进而提取自己需要的数据,存放起来使用: 为了帮助大家更轻松的学好Python开发,爬虫技术,Python数据分析等相关知识,给大家分享一套Python学习资料,小编推荐

Python爬虫进阶三之Scrapy框架安装配置

初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此整理如下. Windows 平台: 我的系统是 Win7,首先,你要有Python,我用的是2.7.7版本,Python3相仿,只是一些源文件不同. 官网文档:http://doc.scrapy.org/en/latest/intro/install.html,最权威哒,下面是我的亲身体验过程. 1.安装Python 安装过程我就不多说啦,我的电

爬虫学习之第三章数据存储

第三章 数据存储 第一节 json文件处理: 什么是json: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率.更多解释请见:https://baike.baidu.com/item/JS

第三章—Windows程序

这一章我都不知道该如何写了,呵呵~~ 毕竟,Win32是一个非常深奥的系统,目前还容不得我这种 小辈在这儿说三道四,不过,我既然是要写给那些入门阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的,所以,我也犯不着怕被人背后指着骂 本章的名字就叫<Windows程序>而不是<Windows程序设计>所以,我只是讲一些关于Windows程序运作的原理: Windows 为什么叫Windows,相信所有用过的朋友都可以明白,那桌面上一个一个的窗口,就是它名字的由来.也就是这一个又一个窗口

《增长黑客》阅读内容摘要(前三章)

<增长黑客>阅读内容摘要(前三章) 寒假无聊,偶然间看到<增长黑客>这本名气很大的书,顺便拿来读读.读到后来根本停不下来,这本书真的比电影还精彩.作者提倡的一种新的软件工程,令人叫绝. 以下是这本书前三章的内容摘要: 一.第一章 通常采用的手段包括A/B测试.搜索引擎优化.电子邮件召回.病毒营销等,而页面加载速度.注册转化率.E-mail到达水平.病毒因子这些指标成为他们日常关注的对象. 增长黑客:以数据驱动营销.以市场指导产品,通过技术化手段贯彻增长目标的人. 五个环节:1. 获

Android 渗透测试学习手册 第三章 Android 应用的逆向和审计

第三章 Android 应用的逆向和审计 作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0 在本章中,我们将查看 Android 应用程序或.apk文件,并了解其不同的组件. 我们还将使用工具(如 Apktool,dex2jar 和 jd-gui)来逆向应用程序. 我们将进一步学习如何通过逆向和分析源代码来寻找 Android 应用程序中的各种漏洞. 我们还将使用一些静态分析工具和脚本来查找漏洞并利用它们. 3.1 Android 应用程序拆解 Android 应

Python爬虫学习:三、爬虫的基本操作流程

本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将数据或信息存入数据库中: 3.数据展示,即在Web端进行显示,并有自己的分析说明. 这次我先介绍第一个功能中所需要实现的基本操作: 爬虫的基本操作:      表示必须步骤           表示可选步骤 导入爬虫所需要的库(如:urllib.urllib2.BeautifulSoup.Scrap

[email&#160;protected]第三章@编译Android版@V1.0.0

 驾驭开源库WebRTC 第三章-编译Android版 作者:adam 鸣谢:老张.aaalaniz 日期:2015-4-6 版本:1.0.0 欢迎转载,有问题反馈Q:2780113541,尽量完善系列教程. depot_tools代理设置参考老张<史上最牛逼的墙内下载webrtc代码说明_20150401> 编译定制参考aaalaniz的脚本: https://github.com/pristineio/webrtc-build-scripts/blob/master/android/b