scrapy抓取动态页面方法

时间:2022-05-22 09:21:54


http://chenqx.github.io/2014/12/23/Spider-Advanced-for-Dynamic-Website-Crawling/

1 pip install -U selenium

需要调用本地浏览器 (会打开浏览器)


javascript 动态页面

目前许多网站大量运用js脚本进行一些页面的处理,这些页面的抓取对爬虫是个挑战。这类页面的抓取,我用到了下面的方法

  1. 分析页面(firebug/chrome调试工具 等),找到ajax获取的数据源,看是否可以直接发请求获取
  2. 调用浏览器引擎(webkit)获取最后 js 执行过完成的页面
  3. 调用*面依赖的浏览器引擎(headless browser) casperjs,phantomjs 获取最后的页面

 

使用 webkit 抓取

安装需要的软件

# Xvfb 模拟 Xwindows 
sudo apt-get install xvfb
# 安装 python webkit包

添加增加下面的下载代码(增加的位置我后面说明)

webview = webkit.WebView()
webview.connect( 'load-finished', lambda v,f: gtk.main_quit() )
webview.load_uri( request.url )
gtk.main()
renderedBody = str(webview.execute_script('document.documentElement.innerHTML'))
# renderedBody 是执行后页面的内容

注意的上面的代码我没有说明写在哪里,网上很多例子都是说写 下载中间件(DownloaderMiddleware)里,这是有些问题的

  1. scrapy 是基于twisted的异步网络框架。如果下载中间件中长时间阻塞,就会阻塞整个异步处理流程
  2. scrapy 本身的下载 delay 功能,是在中间件下面一层生效(中间件和下载器之间),也就是说如果在下载中间件这里中断处理流程,下载时间间隔功能将失去作用。
  3. 还有一个问题就是 上面的方案需要启动模拟的 x-server (xvfb)

 

目前的方案

  1. casperjs,phantomjs *面浏览器(headless browser)
  2. 写一个 scrapy 的 下载handler,这是scrapy支持的插件,并且不影响其他框架功能的运行,下载器的开发我会在下一篇讲一下
动态网页抓取方案 spynner测试 pip install spynner
splash 过splash。开发者是开发来配合scrapy用的,但只是个渲染代理。


plantomjs安装  http://www.zhouhua.info/2014/03/19/phantomjs
http://www.zhouhua.info/2014/03/19/phantomjs
http://my.oschina.net/ushuaia/blog/361091
jumbo install plantomjs http://phantomjs.org/quick-start.html

evaluate函数是个新东西,其实很简单,就是在webpage环境下执行evaluate传入的回调函数,在这里面执行与phantom相关的操作可以避免web页面刺探phantom相关的设置信息。上面的代码就比较简单了,不啰嗦了。

模仿用户点击事件:

phantomJS提供了两种模仿点击事件的接口,一个是sendEvent,phantomJS事件触发器;一个是DOM事件触发器。

我们先看看第一个,语法如下



   可以js修改网页内容,执行js渲染页面 casperjs安装 http://www.open-open.com/lib/view/open1338375857589.html
$ git clone git://github.com/n1k0/casperjs.git
$ cd casperjs
$ git checkout tags/0.6.9
$ ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs

你也可以直接下载打包好的文件(0.6.9.zip),解压后执行上述脚本的第4个命令.

然后检查安装是否成功:

$ casperjs --version
0.6.9

安装完毕, 现在可以开始写我们的脚本了.

注: casperjs 命令是用 Python 脚本编写, 也可以使用 Python 来执行:

$ python /path/to/casperjs/bin/casperjs
CasperJS version 0.6.9 at /Users/niko/casperjs
Usage: casperjs script.(js|coffee) [options...]
Read the docs http://casperjs.org/

所以要确保你机器上的 Python 环境是OK的.


scrapyjs
pip install scrapy-splash
ghost方案
http://jeanphix.me/Ghost.py/
pip install Ghost.py


phatomjs + selenium 结合使用 http://blog.chinaunix.net/uid-22414998-id-3692113.html?page=3