一.安装Docker
MacOS Docker 安装
菜鸟教程中也有其他系统的安装教程,很详细
配置加速器 : https://blog.51cto.com/13673090/2092462
博主是从网上看的文章照扒了~
二.安装并运行splash
1. 拉取镜像
docker pull scrapinghub/splash
2.用docker运行scrapinghub/splash
docker run -p 8050:8050 scrapinghub/splash
3.查看效果
我们在8050端口上运行了Splash服务,打开 http://自己电脑的IP地址:8050/ 即可看到其Web页面
4.查看正在运行的服务
docker ps
执行可以看到刚刚开启的splash服务:
5.停止Splash服务
docker kill 4步骤中获取的服务ID
再次刷新网页会显示无法连接到服务器
三.splash与scrapy结合使用
- pip安装scrapy-splash库
pip install scrapy-splash
- scrapy-splash使用的是Splash HTTP API, 所以需要一个splash instance,一般采用docker运行splash,所以需要安装docker
- 安装docker, 安装好后运行docker
- 拉取镜像
docker pull scrapinghub/splash
- 用docker运行scrapinghub/splash
docker run -p 8050:8050 scrapinghub/splash
-
配置splash服务(以下操作全部在settings.py):
①. 使用splash解析,要在配置文件中设置splash服务器地址:
SPLASH_URL = 'http://192.168.99.100:8050/'
②. 将splash middleware添加到DOWNLOADER_MIDDLEWARE中
DOWNLOADER_MIDDLEWARES = { 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, }
③. Enable SplashDeduplicateArgsMiddleware
SPIDER_MIDDLEWARES = { 'scrapy_splash.SplashDeduplicateArgsMiddleware': 100 }
这个中间件需要支持cache_args功能; 它允许通过不在磁盘请求队列中多次存储重复的Splash参数来节省磁盘空间。如果使用Splash 2.1+,则中间件也可以通过不将这些重复的参数多次发送到Splash服务器来节省网络流量
④. 配置消息队列所使用的过滤类
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
⑤. 配置消息队列需要使用的类
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
如果出现返回504,延长超时时间(注意先kill之前的服务) :
docker run -it -p 8050:8050 scrapinghub/splash --max-timeout 36000
scrapy splash 504错误解决以及若干建议
然而我的问题并没有解决,如果有哪位看官知道为啥麻烦指教一下,感谢
案例一 :
# -*- coding: utf-8 -*-
import scrapy
from scrapy_splash import SplashRequest
from selenium import webdriver
class GuaziSpider(scrapy.Spider):
name = 'guazi'
allowed_domains = ['guazi.com']
# start_urls = ['https://www.guazi.com/bj/buy/']
def start_requests(self):
yield SplashRequest("https://www.guazi.com/bj/buy/", callback=self.parse, args={'wait': 1})
def parse(self, response):
print(response.text)
案例二 :
# -*- coding: utf-8 -*-
import scrapy
from scrapy_splash import SplashRequest
class GuaziSpider(scrapy.Spider):
name = 'guazi2'
allowed_domains = ['guazi.com']
# start_urls = ['https://www.guazi.com/bj/buy/']
def start_requests(self):
lua = '''
function main(splash, args)
assert(splash:go(args.url))
assert(splash:wait(1))
return splash:html()
end
'''
yield SplashRequest("https://www.guazi.com/bj/buy/", callback=self.parse, endpoint='execute',
args={'lua_source': lua})
def parse(self, response):
print(response.text)