Scrapy_Splash实现原理
scrapy_splash是Scrapy的功能扩展包,它为开发者提供了Splash中间件及相应的HTTP请求方式。首先使用pip命令安装:pip install scrapy_splash。
在Python安装目录下查看scrapy_splash(Lib\site-packages\scrapy_splash)源码文件。scrapy_splash共有5个功能模块,分别是数据缓存cache.py、用户Cookies信息cookies.py、中间件middleware.py、HTTP请求方式request.py和响应内容response.py:
- cache.py:定义SplashAwareFSCacheStorage类,并继承Scrapy的FilesystemCacheStorage缓存类,scrapy_splash的缓存功能是在Scrapy原有的缓存功能上进行修改。
- cookies.py:定义了多个Cookies格式转换函数,比如将HAR格式转化成字典格式。
- middleware.py:分别定义了一个SpiderMiddleware中间件和两个DownloaderMiddleware中间件,这是scrapy_splash的核心功能。
- request.py:定义HTTP的GET请求和POST请求,以SplashRequest和SplashFormRequest类表示,这是改变Scrapy原有的HTTP请求方式。
- response.py:定义响应内容的数据格式,以SplashTextResponse和SplashJsonResponse类表示,这也是改变Scrapy原有的HTTP响应方式。
Scrapy+Splash的代码跟Scrapy+Selenium爬取豆瓣电影评论的代码基本差不多。Scrapy+Splash需要将spider程序提取到的URL都交给scrapy_splash处理,并获取响应。这里主要整理下使用方法,不在定义管道存储。
1.settings.py配置文件import os
BOT_NAME = 'douban_splash'
SPIDER_MODULES = ['douban_splash.spiders']
NEWSPIDER_MODULE = 'douban_splash.spiders'
ROBOTSTXT_OBEY = False
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'User-AgentMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0'
}
# 注册scrapy_splash中间件
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
# 注册scrapy_splash和scrapy内置的中间件
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 732,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
# 设置scrapy_splash配置属性
SPLASH_URL = 'http://192.168.99.100:8050'
# 去重过滤器
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
# 自定义HTTP缓存机制
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
# 设置Cookie,记录所有请求发送和接收的Cookies
SPLASH_COOKIES_DEBUG = True
# 数据库连接信息
MYSQL_CONNECTION = 'mysql+pymysql://root:123@localhost/spider?charsetutf8mb4'
# 配置文件conf.ini路径
BASE_DIR = os.path.dirname(os.path.realpath(__file__))
CONF = os.path.join(BASE_DIR, 'conf.ini')
2.spider.py文件import scrapy
from scrapy_splash import SplashRequest
import configparser
from scrapy.selector import Selector
class MovieSpider(scrapy.Spider):
name = 'movie'
start_urls = 'https://movie.douban.com/subject/%s/reviews?start=%s'
# 将Scrapy的request修改为SplashRequest
def start_requests(self):
urls_list = []
# 读取配置文件conf.ini
conf = configparser.ConfigParser()
# 获取conf.ini路径
conf.read(self.settings.get('CONF'))
tem=conf['config']
if 'movieId' in tem.keys():
urls_list = conf['config']['movieId'].split(',')
for i in urls_list:
for page in range(1):
url = self.start_urls % (str(i), str(page*20))
headers={
'User-Agent': 'User-AgentMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0'
}
# 设置请求信息
args = {
'wait': '3',
'headers': headers,
# 设置Cookies
# 'Cookies': {'name': 'eyujun'},
# 设置代理
# 'proxy': 'https://127.0.0.1:8080'
}
# splash访问URL地址
yield SplashRequest(url, meta={'movieId': str(i)}, callback=self.parse, args=args)
def parse(self, response):
# response是scrapy_splash定义的中间件生成的
se=Selector(response)
comment = se.xpath('//div[contains(@class,"main review-item")]')
for i in comment:
item ={ }
item['movieId'] = response.meta['movieId']
content = i.xpath('./div/div/div//text()').extract()
item['comment'] = ''.join([q.strip() for q in content if len(q.strip()) > 0]).replace('\n', '')
print(item)
代码运行之前,还需要开启Splash服务器,启动Docker,输入Splash指令docker run-p 8050:8050 scrapinghub/splash并按回车键,如果不会参考:Splash简介及安装方法
声明:1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!