怎样使用scrapy爬取js动态生成的数据

JavaScript036

怎样使用scrapy爬取js动态生成的数据,第1张

解决方案:

利用第三方中间件来提供JS渲染服务: scrapy-splash 等。

利用webkit或者基于webkit库

Splash是一个Javascript渲染服务。它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT。Twisted(QT)用来让服务具有异步处理能力,以发挥webkit的并发能力。

下面就来讲一下如何使用scrapy-splash:

利用pip安装scrapy-splash库:

$ pip install scrapy-splash

scrapy-splash使用的是Splash HTTP API, 所以需要一个splash instance,一般采用docker运行splash,所以需要安装docker。

安装docker, 安装好后运行docker。

拉取镜像(pull the image):

$ docker pull scrapinghub/splash

用docker运行scrapinghub/splash:

$ docker run -p 8050:8050 scrapinghub/splash

配置splash服务(以下操作全部在settings.py):

1)添加splash服务器地址:

SPLASH_URL = 'http //localhost:8050'

2)将splash middleware添加到DOWNLOADER_MIDDLEWARE中:

DOWNLOADER_MIDDLEWARES = {

'scrapy_splash.SplashCookiesMiddleware': 723,

'scrapy_splash.SplashMiddleware': 725,

'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,

}

3)Enable SplashDeduplicateArgsMiddleware:

SPIDER_MIDDLEWARES = {

'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,

}

4)Set a custom DUPEFILTER_CLASS:

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

5)a custom cache storage backend:

HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

例子

获取HTML内容:

import scrapy

from scrapy_splash import SplashRequest

class MySpider(scrapy.Spider):

start_urls = ["http //example com", "http //example com/foo"]

def start_requests(self):

for url in self.start_urls:

yield SplashRequest(url, self.parse, args={'wait': 0.5})

def parse(self, response):

# response.body is a result of render.html callit

# contains HTML processed by a browser.

# ...

抓取js动态生成的内容的页面有两种基本的解决方案

1用dryscrape库动态抓取页面

js脚本是通过浏览器来执行并返回信息的,所以,抓取js执行后的页面,一个最直接的方式就是用python模拟浏览器的行为。WebKit 是一个开源的浏览器引擎,python提供了许多库可以调用这个引擎,dryscrape便是其中之一,它调用webkit引擎来处理包含js等的网页!

2 selenium web测试框架

selenium是一个web测试框架,它允许调用本地的浏览器引擎发送网页请求,所以,它同样可以实现抓取页面的要求。

太简单了,先清空网页缓存文件夹,windows XP默认: C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files 然后,用IE浏览器打开你要的网站,再回去看看,什么HTML JS CSS flash 图片都在里面了,你copy所有的东西...