2025年3月29日 星期六 甲辰(龙)年 月廿八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

爬虫--分布式爬虫(实例+存入Mysql)

时间:08-16来源:作者:点击数:25

安装模块

  • pip install scrapy scrapy-redis -i https://pypi.doubanio.com/simple

创建分布式爬虫环境

  • 链接:https://pan.baidu.com/s/16aXPHtePiarEIFATwcILbw 提取码:hhhh
  • 复制example_project文件,可自行更改名称
  • 保留自己需要用的爬虫文件(这里留mycrawler_redis.py)

项目目录结构如下

在这里插入图片描述

主机和从机

  • 主机(master) 启动redis-server
  • 从机(salve)保证可以成功连接上主机的redis(从机不需要启动redis,只需要保证可以成功连接)

第一个分布式爬虫(从机)

  • #在mycrawler_redis.py
  • from scrapy.spiders import Rule
  • from scrapy.linkextractors import LinkExtractor
  • from scrapy_redis.spiders import RedisCrawlSpider
  • class MyCrawler(RedisCrawlSpider):
  • # 爬虫名
  • name = 'mycrawler_redis'
  • # redis_key: 类似start_url,但是只是redis的一个key
  • # 监听redis中的key
  • redis_key = 'mycrawler:start_urls'
  • # 允许的域名
  • allowed_domains = ['baike.baidu.com']
  • rules = [
  • Rule(LinkExtractor(allow=('item/.*?',)),callback='parse_page',follow=True),
  • ] #定义规则
  • def parse_page(self, response):
  • # 标题
  • title = response.xpath('//dd[@class="lemmaWgt-lemmaTitle-title"]/h1/text()').get()
  • print(title)
  • # item
  • item = BaikeItem()
  • item['title'] = title
  • yield item
  • #items.py中
  • from scrapy.item import Item, Field
  • class BaikeItem(Item):
  • title = Field()
  • #pipelines.py管道中
  • class ExamplePipeline(object):
  • def process_item(self, item, spider):
  • return item
  • #settings.py中
  • SPIDER_MODULES = ['example.spiders']
  • NEWSPIDER_MODULE = 'example.spiders'
  • USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
  • # dupefilter: 去重
  • DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
  • # 使用scrapy_redis的调度器
  • SCHEDULER = "scrapy_redis.scheduler.Scheduler"
  • # 是否允许暂停
  • SCHEDULER_PERSIST = True
  • #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
  • #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
  • #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
  • ITEM_PIPELINES = {
  • 'example.pipelines.ExamplePipeline': 300,
  • # 使用redis管道:自动存入redis,默认存入本机的redis
  • 'scrapy_redis.pipelines.RedisPipeline': 400,
  • }
  • LOG_LEVEL = 'DEBUG'
  • DOWNLOAD_DELAY = 1
  • #配置远程连接redis
  • #方法1
  • REDIS_URL = "redis://:密码@IP地址:端口"
  • #方法2
  • # REDIS_HOST = 'IP地址'
  • # REDIS_PORT = 6379
  • #REDIS_PARAMS = {
  • # 'password': '123456',
  • # }

执行分布式爬虫(从机)

  • cd 到爬虫文件路径
  • scrapy runspider mycrawler_redis.py --监听主机redis

Redis添加URL(主机)

  • lpush mycrawler:start_urls https://baike.baidu.com
  • 注意:需要和爬虫文件中 redis_key 相对应 ,url对应需要爬取的网址即可
  • (添加成功后,从机开始爬取,因为写的代码是深度爬取,所以爬虫会一直运行)

爬虫运行后Redis中

  • 在Redis中自动产生下面3key
  • 1) "mybaike:requests"
  • 要爬取的url请求队列
  • 2) "mybaike:items"
  • 会自动存储到redis中的数据(在爬虫文件中yield的那个item)
  • 3) "mybaike:dupefilter"
  • 过滤器: 过滤重复的request

存入Mysql

  • 在mysql中创建一个表 id(int ,自增) 和 title(varchar)字段
  • 在主项目中新建py文件夹Redis_to_MySQL.py
  • import redis
  • import pymysql
  • import time
  • import json
  • # 连接redis
  • r = redis.Redis()
  • # 连接MySQL
  • db = pymysql.connect(
  • host='localhost', port=3306,
  • user='root', password='root',
  • database='spider88', charset='utf8'
  • )
  • cursor = db.cursor()
  • while True:
  • # 1. 从redis中取数据
  • # blpop: 会等待mybaike:items有数据才会执行,否则会暂停一直等待
  • keys, values = r.blpop('mycrawler_redis:item')
  • # print(keys, values)
  • item = json.loads(values.decode())
  • # 2.存入MySQL数据库
  • sql = 'insert into baike(title1) values("%s")' % item['title']
  • cursor.execute(sql)
  • db.commit()
  • print(f'--- {item["title"]} 存入MySQL成功 ---')
  • time.sleep(0.1)
  • #这个文件需要单独执行
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐