scrapy-splash初步学习

版权声明:本文real_Rickys原创文章,未经real_Rickys允许不得转载。 https://blog.csdn.net/real_Rickys/article/details/79901757

初步学习使用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

猜你喜欢

转载自blog.csdn.net/real_Rickys/article/details/79901757