scrapy-redis实现全站分布式数据爬取
需求
- scrapy+redis分布式爬取58同城北京全站二手房数据
环境
- win10
- pycharm2019.2
- python3.7
- scrapy模块| scrapy_redis模块|redis数据库
需求
- 基于Spider或者CrawlSpider进行二手房信息的爬取
- 本机搭建分布式环境对二手房信息进行爬取
- 搭建多台机器的分布式环境,多台机器同时进行二手房数据爬取
编码流程
step1:创建项目工程,在终端输入如下指令
Copyscrapy startproject bj58Pro
step2:进入工程,创建基于CrawlSpider的爬虫文件
Copycd bj58Pro scrapy genspider -t crawl bj2sh www.xxx.com Copy# items.py import scrapy class Bj58ProItem(scrapy.Item): title = scrapy.Field() # 二手房信息标题 desc = scrapy.Field() # 详细信息描述 addr = scrapy.Field() # 地址 price = scrapy.Field() # 价格
step4:在bj2sf.py文件中解析数据
- a 导包
from scrapy_redis.spiders import RedisCrawlSpider
- b 修改Bj2sfSpider的父类为RedisCrawlSpider
- c 注释allowed_domains和start_urls
- d 定义
redis_key = 'bj2sf'
- e rules中定义解析全站数据爬取的链接提取器
link = LinkExtractor(allow=r'/ershoufang/pn\d+')
- f
parse_item()
方法定定义数据解析规则
Copy# bj2sf.py import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapy_redis.spiders import RedisCrawlSpider from bj58Pro.items import Bj58ProItem class Bj2sfSpider(RedisCrawlSpider): name = 'bj2sf' # allowed_domains = ['www.xxx.com'] # start_urls = ['https://bj.58.com/ershoufang/'] redis_key = 'bj2sf' link = LinkExtractor(allow=r'/ershoufang/pn\d+') rules = ( Rule(link, callback='parse_item', follow=True), ) def parse_item(self, response): item = Bj58ProItem() li_list = response.xpath('/html/body/div[5]/div[5]/div[1]/ul/li') for li in li_list: item["title"] = li.xpath('./div[2]/h2/a/text()').get() item["desc"] = li.xpath('./div[2]/p[1]/span/text()').getall() item["addr"] = li.xpath('./div[2]/p[2]/span/a/text()').getall() item["price"] = li.xpath('./div[3]/p//text()').getall() yield item
step5:配置文件设置scrapy_redis
分布式爬虫的参数
Copy# settings.py BOT_NAME = 'bj58Pro' SPIDER_MODULES = ['bj58Pro.spiders'] NEWSPIDER_MODULE = 'bj58Pro.spiders' USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36' # Obey robots.txt rules ROBOTSTXT_OBEY = False # LOG_LEVEL = 'ERROR' ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400, } #增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" #使用scrapy-redis组件自己的调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" #配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据 SCHEDULER_PERSIST = True # 指定redis数据库的连接参数 REDIS_HOST = '127.0.0.1' REDIS_PORT = 6379 REDIS_ENCODING = "utf-8"
step6:开启Redis服务器的服务端和客户端
step7:运行项目,进入spiders目录下,终端输入如下指令
Copyscrapy runspider bj2sf.py
step8:找到任意redis客户端,输入:lpush redis_key 起始url
Copylpush bj2sf https://bj.58.com/ershoufang/
参考https://www.cnblogs.com/liuxu2019/p/12112728.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)