一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 8 天,点击查看活动详情

写在前面

对于分布式爬虫学习来说,或者对于技术学习来说,没有捷径,两条路可以走,第一自己反复练习,孰能生巧;第二看别人分享的代码反复学习别人的写法,直到自己做到。

上篇博客相信你已经可以简单的将分布式爬虫运行起来,你可能会发现分布式爬虫是思想上的一个调整,从代码的写法上并没有过多的改变,但是要知道我们是使用 scrapy-redis 直接构建的分布式爬虫,相当于是站在了前辈的肩膀上去爬分布式那堵墙,不过作为了解分布式爬虫的第一步 “构建”,这个里程碑我们已经实现,接下来我们要把这个里程碑砸的更夯实一些,方便后面的攀爬。

接下来我将用 3 篇左右的案例,不断的重复分布式爬虫写法,直到无招。

今天找个网站做参考, 人人都是产品经理 ,声明下 不好意思,学习目的,爬来的数据会及时的删除滴

构建分布式爬虫

创建一个 scrapy 爬虫工程

scrapy.exe startproject woshipm

通过上述命令创建一个爬虫工程,注意如果你的 scrapy.exe 没有配置环境变量,请通过完整的路径定位到 scrapy.exe 然后在执行命令

创建一个基于 CrawlSpider 的爬虫文件

D:\python100\venv\Scripts\scrapy.exe genspider -t crawl pm xxx.com

通过上述命令创建爬虫文件的时候,一定要注意进入到爬虫工程中的 spider 文件夹内部,如果没有,需要拷贝一下生成的 pm.py 文件,粘贴到 spider 文件夹内部

上述两个步骤实施完毕,现在的目录结构如下

Python爬虫入门教程 - 图1

修改 pm.py 文件为分布式爬虫基础内容

最终的修改结果如下,注意注释部分内容

  1. import scrapy
  2. from scrapy.linkextractors import LinkExtractor
  3. from scrapy.spiders import CrawlSpider, Rule
  4. from scrapy_redis.spiders import RedisCrawlSpider
  5. class PmSpider(RedisCrawlSpider):
  6. name = 'pm'
  7. rules = (
  8. Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
  9. )
  10. redis_key = 'pm_url'
  11. def parse_item(self, response):
  12. item = {}
  13. return item

修改 setting.py 文件增加 redis 部分

最终的修改结果如下

  1. BOT_NAME = 'woshipm'
  2. SPIDER_MODULES = ['woshipm.spiders']
  3. NEWSPIDER_MODULE = 'woshipm.spiders'
  4. USER_AGENT = 'Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)'
  5. ROBOTSTXT_OBEY = False
  6. SCHEDULER = "scrapy_redis.scheduler.Scheduler"
  7. DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
  8. SCHEDULER_PERSIST = True
  9. ITEM_PIPELINES = {
  10. 'scrapy_redis.pipelines.RedisPipeline': 300
  11. }
  12. REDIS_HOST = '127.0.0.1'
  13. REDIS_PORT = 6379
  14. REDIS_ENCODING = 'utf-8'
  15. DOWNLOAD_DELAY = 3

启动 redis 并向其中 lpush 首次抓取地址

启动 redis,进入到 redis 根目录,使用 redis-server.exe redis.windows.conf 即可启动 启动 redis-cli ,在根目录下,使用 redis-cli -h 127.0.0.1 -p 6379 进行连接,由于我本机 redis 未设置密码,故直连即可。

通过 lpush 命令添加地址 127.0.0.1:6379> lpush pm_url http://www.woshipm.com/archive/page/1

以上步骤完成,一个基本的分布式爬虫已经编写完毕

测试爬虫是否正常运行

打开 pm.py 文件,修改网址匹配规则如下

  1. rules = (
  2. Rule(LinkExtractor(allow=r'page/\d+'), callback='parse_item', follow=True),
  3. )
  4. redis_key = 'pm_url'
  5. def parse_item(self, response):
  6. item = {}
  7. item['titles'] = response.xpath('//h2[@class="post-title"]').get()
  8. return item

上述代码有个坑需要注意下,该问题其实是 python 基础知识问题

rules = (),该处 rules 是一个元组,请注意不要丢掉其中的逗号 , 如果丢掉会出现如下错误信息 'Rule' object is not iterable

Python爬虫入门教程 - 图2

启动爬虫,具体启动方式很多,此处请进入到 pm.py 所在文件夹,然后通过下述命令启动

D:\python100\venv\Scripts\scrapy.exe runspider pm.py

如果无问题,你将看到如下画面

Python爬虫入门教程 - 图3

调整下数据,确定无问题

核心看一下 pm.pyxpath 是否正确

  1. class PmSpider(RedisCrawlSpider):
  2. name = 'pm'
  3. rules = (
  4. Rule(LinkExtractor(allow=r'page/\d+'), callback='parse_item', follow=True),
  5. )
  6. redis_key = 'pm_url'
  7. def parse_item(self, response):
  8. links = response.xpath('//h2[@class="post-title"]/a')
  9. for title in links:
  10. item = WoshipmItem(
  11. title=title.xpath('./text()').get(),
  12. )
  13. print(item)
  14. yield item

运行结果如下

Python爬虫入门教程 - 图4

写在后面

程序运行起来爬取速度很快,300 多页数据不到 1 分钟就爬取完毕了,希望这篇博客能再次帮助你理解分布式爬虫
https://juejin.cn/post/7084062278643318820