scrapy-splash爬取动态网站

最近网站的进展受到了极大的阻挠,国内几大直播网站(斗鱼,虎牙,战旗,熊猫,龙珠)都用scrapy爬取成功了,但是还有两家(全民,火猫)一直都爬不出来。一开始我是很奇怪的,明明可以用firebug查看到、并且能用Xpath Checker找到所需的信息,为什么scrapy一直失败呢。问题的突破点在于,全民tv的spider并不是完全爬不出来,而是能爬出来一些我不知道是什么的东西。然而今天我无意中查看全民的源码时,发现源码里是没有当前直播的信息的,而恰好有scrapy爬出来的东西。顺藤摸瓜,我才意识的问题的关键在于全民和火猫是动态网站,更令我惊奇的是之前爬取的都是静态网站。好吧,原谅我这么菜,这么久才知道。

知道问题的原因就比较好解决了,关于scrapy爬取动态网站的方法网上有许多教程,这里就大概的说一下。主要有两种方法来获取js渲染之后的页面:

  1. Selenium
  2. Splash

第一种是模拟用户使用浏览器的操作,需要和浏览器配合使用,考虑到服务器上安装浏览器的问题,我选择了第二种。每次安装新的东西都要折腾一段时间,splash也是如此,反正先按官网的说明来,出现什么问题就搜什么问题。好在装好之后,配合scrapy还是比较简单的。首先在settings.py里添加一些属性,然后启动splash:

1
docker run -p 5023:5023 -p 8050:8050 -p 8051:8051 scrapinghub/splash

可以通过访问 (http://localhost:8050/) 来查看js渲染后的页面。
然后只需要在原有的spider上加上一段代码即可:

1
2
3
4
5
6
7
8
9
10
11
import scrapy
from scrapy_splash import SplashRequest
class MySpider(scrapy.Spider):
# ...
def start_requests(self):
splash_args = {
'wait': 0.5,
}
for url in self.start_urls:
yield SplashRequest(url, self.parse, endpoint='render.html', args=splash_args)
# ...

基本就是这样,接下来还要在服务器上再安装一下splash,祝我好运。