初步学习使用scrapy-splash
由于静态页面的局限性,学习动态页面的爬取也是必然的选择,这里就需要使用到splash。
步骤
1. 步骤1:安装docker
2. 步骤2:安装splash
3. 步骤3:没有splash时的淘宝页面爬取
4. 步骤4:使用splash的淘宝页面爬取测试
docker对win的支持问题
docker对win的支持并不好,docker ce似乎解决了这个问题,不过docker toolbox似乎问题还是比较多。在pull镜像的时候如果中途断网就可能会有证书过期的问题,在重新生成证书后docker-machine regenerate-certs似乎也不能解决问题。使用docker-machine ls中查看出来的问题有多种可能,且描述并不是非常清除。本人由于win10的网络防护的问题,导致tcp错误层出不穷,最后关闭防火墙重装了一次docker才解决。建议还是使用linux环境吧。
docker的镜像拉取速度
对于中国网络访问海外流量的限制,docker已经做出了很好的支持,如这个splash可以采用如下代码快速拉取:docker pull registry.docker-cn.com/scrapinghub/splash
步骤1
下载docker可去如下页面 https://docs.docker.com/toolbox/overview/ ,注意,可下载的最新的版本是CE,不过CE对系统是有要求的,所以还是下toolbox版本妥当。
下载完毕后安装会让你安装如下内容:
1. docker客户端
2. oracle VM虚拟机
3. docker toolbox的管理工具
4. git工具
虚拟机和git工具如果之前已经安装过了就可以忽略
安装完了后找到Docker Quickstart Terminal就是docker啦,此时会分配给你一个ip号,这个ip号在用splash时会用到
注意:
有可能出现打不开Docker的情况此时需要运行安装目录下start.sh来解决这个问题
ps:
如果上述方法还是不能解决问题可能是由于之前安装过git的原因,打开docker Quickstart Terminal的属性,在目标中把git的bash路径改为你安装的git的bash的路径(不知道路径的可用where git命令)
步骤2
在docker终端中输入如下代码拉取splash镜像
docker pull scrapinghub/splash
安装完成后,用如下命令启动splash,这里的意思是用8050端口来启用splash
docker run -p 8050:8050 scrapinghub/splash
完成后进入浏览器输入:分配给你的ip号:8050就可以开始渲染
完成之后在anaconda中输入pip install scrapy-splash就可以正式完成安装
步骤3
在tao.py文件下有如下代码,观察结果
# -*- coding: utf-8 -*-
import scrapy
class TaoSpider(scrapy.Spider):
name = 'tao'
#allowed_domains = ['www.taobao.com']
start_urls = ['https://s.taobao.com/search?q=%E6%98%BE%E7%A4%BA%E5%B1%8F%E5%8F%AF%E6%97%8B%E8%BD%AC&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20180411&ie=utf8']
def parse(self, response):
title = response.xpath('.//div[@class="row row-2 title"]/a/text()').extract()
print('结果如下:', title)
发现输出为空list知道request爬不到此代码
步骤4
在使用scrapy时需要对爬虫的setting进行设置,在setting.py文件中输入如下代码(注意splash_url一定要写对否则会出现‘由于目标计算机积极拒绝,无法连接。’错误。)
SPLASH_URL = 'http://192.168.99.100:8050'
#改变启用下载中间件
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
#设置去重过滤器
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
#启用并改变splash的http缓存
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
在爬虫文件中写下如下代码发现爬取到了信息,大功告成
# -*- coding: utf-8 -*-
import scrapy
from scrapy_splash import SplashRequest
class TaoSpider(scrapy.Spider):
name = 'tao'
#allowed_domains = ['www.taobao.com']
def start_requests(self):
start_urls = [
'https://s.taobao.com/search?q=%E6%98%BE%E7%A4%BA%E5%B1%8F%E5%8F%AF%E6%97%8B%E8%BD%AC&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20180411&ie=utf8']
for url in start_urls:
yield SplashRequest(url=url, callback = self.parse, args = {'wait':1}, endpoint='render.html')
def parse(self, response):
title = response.xpath('.//div[@class="row row-2 title"]/a/text()').extract()
print('结果如下:', title)
#args包含了发往Splash的参数。
#endpoint指定了Splash所使用的endpoint