现在越来越多的网站的使用ajax来动态加载数据,scrapy只能获取静态html中的数据,对于动态加载的就无能为力了
spynner是一个模拟浏览器加载的工具,可以在后台模拟ajax加载后的网页,然后再通过scrapy进行爬取
原理就是在scrapy的中间件设置spynner模块加载
微信公众号里面的内容,文字可以直接加载出来,但是图片使用的是ajax技术,如果我们成功获取到了图片的src则我们就实现了对网页的动态页面的获取
环境: Ubuntu16 Python2.7
1 spynner安装
pip install spynner
安装的时候会出现各种依赖包,如果没有安装的话会报错,可以通过apt-file来定位需要的依赖http://blog.csdn.net/lcyong_/article/details/72904275
2创建scrapy工程,编写中间件,添加spynner模块
scrapy stratproject testSpynner
cd testSpynner
scrapy genspider weixin qq.com
现在成功创建了一个名为wx的scrapy爬虫
编写中间件 middlewares 在这里我添加了随机更换浏览器头的模块代码如下:
# -*- coding: utf-8 -*-
# Define here the models for your spider middleware
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/spider-middleware.html
import random
import spynner
import pyquery
from scrapy.http import HtmlResponse
from scrapy import signals
class WebkitDownloaderTest(object):
def process_request(self, request, spider):
print "创建spynner"
browser = spynner.Browser()
browser.create_webview()
browser.set_html_parser(pyquery.PyQuery)
browser.load(request.url, 20)
print "打开网页"
try:
browser.wait_load(10)
except:
pass
string = browser.html.encode('utf-8')
print "打开网页"
renderedBody = str(string)
print "读取数据"+string