热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

scrapy定制爬虫-爬取javascript内容

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时,有各种细节需要处理.

推荐阅读
  • 前言对于从事技术的人员来说ajax是这好东西,都会使用,而且乐于使用。但对于新手,开发一个ajax实例,还有是难度的,必竟对于他们这是新东西。leo开发一个简单的ajax实例,用的是 ... [详细]
  • 用JavaScript实现的太空人手表
    用JavaScript实现的太空人手表-JS写的太空人手表,没有用canvas、svg。主要用几个大的函数来动态显示时间、天气这些。天气的获取用到了AJAX请求。代码中有详细的注释 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • XMLhttpREquest_Ajax技术总结之XmlHttpRequest
    Ajax1、 什么是ajax   ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 表单提交前的最后验证:通常在表单提交前,我们必须确认用户是否都把必须填选的做了,如果没有,就不能被提交到服务器,这里我们用到表单的formname.submit()看演示,其实这个对于我们修炼道 ... [详细]
  • 文章目录简介HTTP请求过程HTTP状态码含义HTTP头部信息Cookie状态管理HTTP请求方式简介HTTP协议(超文本传输协议)是用于从WWW服务 ... [详细]
  • xpath helper 可以获取到但是打印不出来_用Python里面的Xpath完成一个在线汇率转换器...
    在之前的语法里面,我们记得有一个初识Python之汇率转换篇,在那个程序里面我们发现可以运用一些基础的语法写一个汇率计算,但是学到后面的小 ... [详细]
  • from:http:www.myquickphp.comarchives147(请求的跨域服务器不支持常规”?”查询请求时的解决方案)昨天第一次做VIP需求时,发现一 ... [详细]
  • 用了一年多Flex,感触多多。偶尔有同行的朋友问我啥是Flex,说实话,一时半会儿我还真说不清楚。尤其是对于一个从未接触过Flex的朋友,想要由浅入深地只用嘴巴不用电脑给他讲明白,这确实难为 ... [详细]
  • 前端图片合成技术_靠谱的前端需要做哪些准备?
    Web前端开发源于传统的互联网,互联网普及让人才需求量居高不下,随着移动互联网的高速发展,移动终端的前端开发也越来越受到重视, ... [详细]
  • JavaScript与DOM(上)——也适用于新手 – 深入理解JavaScript系列 23
    本文是《JavaScript深度解析》系列文章第23篇(共51篇)文档对象模 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
author-avatar
php麟状
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有