Scrapy+Redis爬取豆瓣电影评论

鳄鱼君

发表文章数:615

热门标签

, , , ,

Vieu四代商业主题

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

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

分布式爬虫就是将一个爬虫任务分给多个相同的爬虫程序同时执行,而且每个爬虫程序所爬取的内容各不相同。

Scrapy_Redis是Scrapy框架的一个扩展功能,使用pip安装:pip install scrapy-redis。Python安装目录下查看scrapy_Redis(Lib\site-packages\scrapy_redis)源码文件。Scrapy_Redis共有10个源码文件,每个文件负责实现不同的功能,文件之间存在相互调用的关系,从而实现整个分布式功能:

  1. __init__.py:初始化文件,在Scrapy调用Scrapy_Redis的时候,首先执行Redis数据库连接。数据库连接的函数在connection.py里定义。
  2.  connection.py:通过Redis模块实现Redis数据库连接。函数get_redis_from_settings()是从Scrapy的配置文件settings.py读取配置信息,再调用函数get_redis()实现数据库连接。
  3.  defaults.py:设置Scrapy-Redis的基本配置。如果在Scrapy项目没有配置相关属性,则使用该文件的配置信息。
  4.  dupefilter.py:重写了Scrapy原有的判断重复爬取功能。RFPDupeFilter是继承BaseDupeFilter,父类是Scrapy原有的判重功能类,RFPDupeFilter类是在此基础上与Redis数据库结合,将已爬取的URL地址按一定的规则写入Redis数据库。
  5.  picklecompat.py:定义了loads()和dumps()函数,这是将数据转化成序列化格式,再将其存储在Redis数据库,这样可以解决Redis数据库写入数据的格式问题。
  6.  pipelines.py:定义一个item pipieline类,它与Scrapy的item pipeline类是同一个对象,并且调用了connection.py的函数,实现Redis数据库连接和数据入库。
  7.  queue.py:定义分布式爬虫的任务队列,任务队列的方式有队列、栈和优先级队列,主要为调度器提供调度方式。
  8.  scheduler.py:定义分布式爬虫的时候,其他也随之变化,因此可以将多个调度器看成一个调度池,每台计算机的爬虫程序由调度池统一管理,从而实现分布式爬虫之间的统一调度。
  9.  spiders.py:重写Scrapy原有的Spider爬取方式,通过connection.py的函数将自定义Spider连接到Redis数据库,然后由next_requests()函数从Redis中取出URL地址进行爬取,Spider从Redis中去除URL地址须经过调度器统一调度才能执行。
  10.  utils.py:定义Scrapy_Redis的编码格式,使其兼容Python2和Python3版本。

Scrapy_Redis通过重写Scrapy原有的调度器Scheduler和Spider,使Scheduler、Spider和Redis数据库实现相互连接,并以Redis数据库的数据为准,由Scheduler统一调度各个Spider执行数据爬取,调度器的调度方式和判重功能分别由queue.py和dupefilter.py实现。通过一个简单的例子就可以掌握分布式,这里还是以豆瓣影评为例!

1.settings.py文件

BOT_NAME = 'douban_redis'

SPIDER_MODULES = ['douban_redis.spiders']
NEWSPIDER_MODULE = 'douban_redis.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-redis的管道RedisPipeline
ITEM_PIPELINES = {
   'scrapy_redis.pipelines.RedisPipeline': 300,
}
# 启用redis调度存储请求队列
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
# 确保所有的爬虫通过redis去重
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
# 允许暂停,redis数据不会丢失
SCHEDULER_PERSIST=True
# 默认的请求队列顺序
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'
# # 队列形式,请求先进先出
# SCHEDULER_QUEUE_CLASS ='scrape_redis.queue.SpiderQueue'
# # 栈形式,请求先进先出
# SCHEDULER_QUEUE_CLASS = 'scrape_redis.queue.SpiderStack'

# 设置数据库连接信息
REDIS_URL = 'redis://localhost:6379/'
#  设置密码
# REDIS_PARAMS = {
#     'password': 'redisredis'
# }
# MySQL数据库连接信息
MYSQL_CONNECTION = 'mysql+pymysql://root:1897745389hunj.@localhost/spider?charsetutf8mb4'

其中配置属性SCHEDULER是改变Scrapy原有的调度器。当项目运行的时候,Scrapy从配置文件读取配置信息,根据配置信息运行Scrapy_Redis的功能,使得整个项目的调度器Scheduler和Spider皆由Scrapy_Redis定义,从而实现分布式爬虫。

2.spider.py文件

items.py和pipelines.py文件跟豆瓣电影的代码一样,这里不再整理了,主要整理spider.py爬虫文件:

import scrapy


class MovieSpider(scrapy.Spider):
    name = 'movie'
    allowed_domains = ['douban.com']
    start_urls = 'https://movie.douban.com/subject/1292052/reviews?start=%s'

    # 重写start_requests方法
    def start_requests(self):
        for page in range(100):
            url = self.start_urls % str(page * 20)
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        # 将响应内容内容生成Selector对象,用于数据清洗
        comment = response.xpath('//div[contains(@class,"main review-item")]')
        for i in comment:
            item = dict()
            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)

爬虫文件基本上也没有变化,这里只是打印数据,没有存储操作。代码运行需要开启redis-server,如果配置有reids密码需要配置密码。

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

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

评论 抢沙发

6 + 5 =


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

支付宝扫一扫打赏

微信扫一扫打赏

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

登录

忘记密码 ?

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

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

注册