一起养成写作习惯!这是我参与「掘金日新计划 · 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 文件夹内部
上述两个步骤实施完毕,现在的目录结构如下

修改 pm.py 文件为分布式爬虫基础内容
最终的修改结果如下,注意注释部分内容
import scrapyfrom scrapy.linkextractors import LinkExtractorfrom scrapy.spiders import CrawlSpider, Rulefrom scrapy_redis.spiders import RedisCrawlSpiderclass PmSpider(RedisCrawlSpider):name = 'pm'rules = (Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),)redis_key = 'pm_url'def parse_item(self, response):item = {}return item
修改 setting.py 文件增加 redis 部分
最终的修改结果如下
BOT_NAME = 'woshipm'SPIDER_MODULES = ['woshipm.spiders']NEWSPIDER_MODULE = 'woshipm.spiders'USER_AGENT = 'Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)'ROBOTSTXT_OBEY = FalseSCHEDULER = "scrapy_redis.scheduler.Scheduler"DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"SCHEDULER_PERSIST = TrueITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 300}REDIS_HOST = '127.0.0.1'REDIS_PORT = 6379REDIS_ENCODING = 'utf-8'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 文件,修改网址匹配规则如下
rules = (Rule(LinkExtractor(allow=r'page/\d+'), callback='parse_item', follow=True),)redis_key = 'pm_url'def parse_item(self, response):item = {}item['titles'] = response.xpath('//h2[@class="post-title"]').get()return item
上述代码有个坑需要注意下,该问题其实是 python 基础知识问题
rules = (),该处 rules 是一个元组,请注意不要丢掉其中的逗号 , 如果丢掉会出现如下错误信息 'Rule' object is not iterable

启动爬虫,具体启动方式很多,此处请进入到 pm.py 所在文件夹,然后通过下述命令启动
D:\python100\venv\Scripts\scrapy.exe runspider pm.py
如果无问题,你将看到如下画面

调整下数据,确定无问题
核心看一下 pm.py 中 xpath 是否正确
class PmSpider(RedisCrawlSpider):name = 'pm'rules = (Rule(LinkExtractor(allow=r'page/\d+'), callback='parse_item', follow=True),)redis_key = 'pm_url'def parse_item(self, response):links = response.xpath('//h2[@class="post-title"]/a')for title in links:item = WoshipmItem(title=title.xpath('./text()').get(),)print(item)yield item
运行结果如下

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