爬取动态渲染网站scrapy接入splash

scrapy结合scrapy-splash

scrapy-splash 的安装

windows下安装并启动

# 拉取splash
docker pull scrapinghub/splash
# 运行splash 
docker run -p 8050:8050 --name splash scrapinghub/splash
docker run -itd --name splash  -p 8050:8050 scrapinghub/splash --disable-lua-sandbox  bash
docker run -itd --name splash  -p 8050:8050 scrapinghub/splash bash
# 宿主机网络
docker run -itd --name splash  -p 8050:8050 --network=host scrapinghub/splash bash
# -p 向外暴露端口
# -d 守护进程方式运行(后台运行)
# --name 自定义昵称
# --disable-lua-sandbox 关闭沙盒模式。如果是在测试环境上可以直接去体验一下,功能更全。如果是在开发环境的话那就直接用正式的,虽然花里胡哨,但安全性并不好

进入容器
docker exec -it [容器名] bash

kill所有容器进程
docker kill $(docker ps -a -q)
delete所有容器
docker rm $(docker ps -a -q) 
执行容器,传递环境变量 -e
docker run -itd --name splash -e http_proxy="127.0.0.1:10809" -e https_proxy="127.0.0.1:10809" -p 8050:8050 scrapinghub/splash bash

需要访问谷歌等网站

执行容器,传递环境变量 -e
docker run -itd --name splash -e http_proxy=127.0.0.1:10809 -p 8050:8050 scrapinghub/splash bash
或者
进入容器
docker exec -it [容器名] bash
export http_proxy=127.0.0.1:10809

问题:localhost:port无法访问,但在容器内 curl 可以访问


无法访问 splash,windows下可能是因为访问地址ip有问题

docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker
docker-machine ip default
显示 docker 机器的默认ip,一般是 192.168.99.100

https://github.com/Dreamacro/clash/releases/tag/v1.14.0

scrapy集成 scrapy-splash

pip安装

pip3 install scrapy-splash

项目 settings 配置

# splash
SPLASH_URL = 'http://192.168.99.100:8050'
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

代码中使用 SplashRequest 类

from scrapy_splash import SplashRequest
# 原本是yield Request()
yield SplashRequest()
yield SplashRequest(url, headers=headers, dont_filter=True)

命令行访问谷歌

windows 用 cmd 的 curl

set http_proxy=127.0.0.1:1080
set https_proxy=127.0.0.1:1080

全局配置

设置环境变量 HTTP_PROXY HTTPS_PROXY

你可能感兴趣的:(爬虫,Python,scrapy)