Scrapy+Splash爬取豆瓣电影评论

鳄鱼君

发表文章数:642

热门标签

, , , ,

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Scrapy+Splash爬取豆瓣电影评论

Scrapy框架也可以与Splash模块结合使用。使用Splash比Selenium更有优势,因为Splash是一个异步框架,它与Scrapy框架能完美结合。

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:

  1. cache.py:定义SplashAwareFSCacheStorage类,并继承Scrapy的FilesystemCacheStorage缓存类,scrapy_splash的缓存功能是在Scrapy原有的缓存功能上进行修改。
  2. cookies.py:定义了多个Cookies格式转换函数,比如将HAR格式转化成字典格式。
  3. middleware.py:分别定义了一个SpiderMiddleware中间件和两个DownloaderMiddleware中间件,这是scrapy_splash的核心功能。
  4. request.py:定义HTTP的GET请求和POST请求,以SplashRequest和SplashFormRequest类表示,这是改变Scrapy原有的HTTP请求方式。
  5. 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简介及安装方法

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Scrapy+Splash爬取豆瓣电影评论》 发布于2020-07-11

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

4 + 7 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册