有缘网分布式爬虫案例

# clone github scrapy-redis源码文件
git clone https://github.com/rolando/scrapy-redis.git# 直接拿官方的项目范例,改名为自己的项目用(针对懒癌患者)
mv scrapy-redis/example-project ~/scrapy-youyuan

修改settings.py

下面列举了修改后的配置文件中与scrapy-redis有关的部分,middleware、proxy等内容在此就省略了。

# -*- coding: utf-8 -*-# 指定使用scrapy-redis的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 指定使用scrapy-redis的去重
DUPEFILTER_CLASS = 'scrapy_redis.dupefilters.RFPDupeFilter'# 指定排序爬取地址时使用的队列,
# 默认的 按优先级排序(Scrapy默认),由sorted set实现的一种非FIFO、LIFO方式。
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'
# 可选的 按先进先出排序(FIFO)
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderQueue'
# 可选的 按后进先出排序(LIFO)
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderStack'# 在redis中保持scrapy-redis用到的各个队列,从而允许暂停和暂停后恢复,也就是不清理redis queues
SCHEDULER_PERSIST = True# 只在使用SpiderQueue或者SpiderStack是有效的参数,指定爬虫关闭的最大间隔时间
# SCHEDULER_IDLE_BEFORE_CLOSE = 10# 通过配置RedisPipeline将item写入key为 spider.name : items 的redis的list中,供后面的分布式处理item
# 这个已经由 scrapy-redis 实现,不需要我们写代码
ITEM_PIPELINES = {'example.pipelines.ExamplePipeline': 300,'scrapy_redis.pipelines.RedisPipeline': 400
}# 指定redis数据库的连接参数
# REDIS_PASS是我自己加上的redis连接密码(默认不做)
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
#REDIS_PASS = 'redisP@ssw0rd'# LOG等级
LOG_LEVEL = 'DEBUG'#默认情况下,RFPDupeFilter只记录第一个重复请求。将DUPEFILTER_DEBUG设置为True会记录所有重复的请求。
DUPEFILTER_DEBUG =True# 覆盖默认请求头,可以自己编写Downloader Middlewares设置代理和UserAgent
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.8','Connection': 'keep-alive','Accept-Encoding': 'gzip, deflate, sdch'
}

查看pipeline.py

# -*- coding: utf-8 -*-from datetime import datetimeclass ExamplePipeline(object):def process_item(self, item, spider):#utcnow() 是获取UTC时间item["crawled"] = datetime.utcnow()# 爬虫名item["spider"] = spider.namereturn item

修改items.py

增加我们最后要保存的youyuanItem项,这里只写出来一个非常简单的版本

# -*- coding: utf-8 -*-from scrapy.item import Item, Fieldclass youyuanItem(Item):# 个人头像链接header_url = Field()# 用户名username = Field()# 内心独白monologue = Field()# 相册图片链接pic_urls = Field()# 年龄age = Field()# 网站来源 youyuansource = Field()# 个人主页源urlsource_url = Field()# 获取UTC时间crawled = Field()# 爬虫名spider = Field()

编写 spiders/youyuan.py

在spiders目录下增加youyuan.py文件编写我们的爬虫,之后就可以运行爬虫了。 这里的提供一个简单的版本:

# -*- coding:utf-8 -*-from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
# 使用redis去重
from scrapy.dupefilters import RFPDupeFilterfrom example.items import youyuanItem
import re#
class YouyuanSpider(CrawlSpider):name = 'youyuan'allowed_domains = ['youyuan.com']# 有缘网的列表页start_urls = ['http://www.youyuan.com/find/beijing/mm18-25/advance-0-0-0-0-0-0-0/p1/']# 搜索页面匹配规则,根据response提取链接list_page_lx = LinkExtractor(allow=(r'http://www.youyuan.com/find/.+'))# 北京、18~25岁、女性 的 搜索页面匹配规则,根据response提取链接page_lx = LinkExtractor(allow =(r'http://www.youyuan.com/find/beijing/mm18-25/advance-0-0-0-0-0-0-0/p\d+/'))# 个人主页 匹配规则,根据response提取链接profile_page_lx = LinkExtractor(allow=(r'http://www.youyuan.com/\d+-profile/'))rules = (# 匹配find页面,跟进链接,跳板Rule(list_page_lx, follow=True),# 匹配列表页成功,跟进链接,跳板Rule(page_lx, follow=True),# 匹配个人主页的链接,形成request保存到redis中等待调度,一旦有响应则调用parse_profile_page()回调函数处理,不做继续跟进Rule(profile_page_lx, callback='parse_profile_page', follow=False),)# 处理个人主页信息,得到我们要的数据def parse_profile_page(self, response):item = youyuanItem()item['header_url'] = self.get_header_url(response)item['username'] = self.get_username(response)item['monologue'] = self.get_monologue(response)item['pic_urls'] = self.get_pic_urls(response)item['age'] = self.get_age(response)item['source'] = 'youyuan'item['source_url'] = response.url#print "Processed profile %s" % response.urlyield item# 提取头像地址def get_header_url(self, response):header = response.xpath('//dl[@class=\'personal_cen\']/dt/img/@src').extract()if len(header) > 0:header_url = header[0]else:header_url = ""return header_url.strip()# 提取用户名def get_username(self, response):usernames = response.xpath("//dl[@class=\'personal_cen\']/dd/div/strong/text()").extract()if len(usernames) > 0:username = usernames[0]else:username = "NULL"return username.strip()# 提取内心独白def get_monologue(self, response):monologues = response.xpath("//ul[@class=\'requre\']/li/p/text()").extract()if len(monologues) > 0:monologue = monologues[0]else:monologue = "NULL"return monologue.strip()# 提取相册图片地址def get_pic_urls(self, response):pic_urls = []data_url_full = response.xpath('//li[@class=\'smallPhoto\']/@data_url_full').extract()if len(data_url_full) <= 1:pic_urls.append("");else:for pic_url in data_url_full:pic_urls.append(pic_url)if len(pic_urls) <= 1:return "NULL"# 每个url用|分隔return '|'.join(pic_urls)# 提取年龄def get_age(self, response):age_urls = response.xpath("//dl[@class=\'personal_cen\']/dd/p[@class=\'local\']/text()").extract()if len(age_urls) > 0:age = age_urls[0]else:age = "0"age_words = re.split(' ', age)if len(age_words) <= 2:return "0"age = age_words[2][:-1]# 从age字符串开始匹配数字,失败返回Noneif re.compile(r'[0-9]').match(age):return agereturn "0"

运行程序:

  1. Master端打开 Redis: redis-server
  2. Slave端直接运行爬虫: scrapy crawl youyuan
  3. 多个Slave端运行爬虫顺序没有限制。

将项目修改成 RedisCrawlSpider 类的分布式爬虫,并尝试在多个Slave端运行。

有缘网分布式爬虫案例相关推荐

  1. 有缘网分布式爬虫案例2

    有缘网分布式爬虫案例: 修改 spiders/youyuan.py 在spiders目录下增加youyuan.py文件编写我们的爬虫,使其具有分布式: # -*- coding:utf-8 -*-fr ...

  2. scrapy分布式爬虫案例

    关于 Redis Redis 是目前公认的速度最快的基于内存的键值对数据库 Redis 作为临时数据的缓存区,可以充分利用内存的高速读写能力大大提高爬虫爬取效率. 关于 scrapy-redis sc ...

  3. 问财网 股票信息爬虫案例

    股票爬虫案例 from selenium import webdriver from my_fake_useragent import UserAgent from lxml import etree ...

  4. [235]scrapy分布式爬虫scrapy-redis(二)

    ===============================================================Scrapy-Redis分布式爬虫框架================== ...

  5. Redis实现分布式爬虫

    redis分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的爬取 原生的scrapy是不可以实现分布式爬虫, 原因如下: 调度器无法共享 管道无法共享 scrapy-redis组件:专 ...

  6. 利用pyhton爬虫(案例3)--X房网的小房子们

    写了个小案例,顺便复习一下以前学的知识点. PS:复试之前绝不写爬虫案例了(对于现在的我来说,费脑又花时间),再写我吃XX. 文章目录 爬取X房网二手房信息 爬取步骤 URL特征 查看HTML页面源代 ...

  7. 中华英才网爬虫程序解析(4)-分布式爬虫redis

    欢迎来到爬虫高级兼实战教程,打开你的IDE,开始python之旅吧! redis数据库 redis也是一种数据库,我们用到他的一个数据类型,也就是list列表来进行我们的分布式爬虫,接下来截取部分代码 ...

  8. Scrapy分布式爬虫打造搜索引擎 - (三)知乎网问题和答案爬取

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 推荐前往我的个人博客进行阅读:http://blog.mtiany ...

  9. scrapy-redis分布式爬虫全站爬取顶点小说网

    scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单分布式爬虫程序,该组件本质上提供了三大功能: scheduler - 调度器 dupefilter - URL去重 ...

最新文章

  1. 欲精一行,必先通十行
  2. OKR能给公司和团队带来什么价值?
  3. H3C 思科华为 等网络设备配置文档自动备份思路及实现方法
  4. STM32 进阶教程 14 - 程序加密之FLASH读写保护
  5. 初识python代码
  6. php static method,php 类方法用static::hello(); 等同于 $this-hello();吗?
  7. Java连接微软ad_Java:连接到Active Directory(AD)?
  8. Mysql update 使用join更新字段
  9. 2019入门级云主机选型测试报告
  10. 设置不显示用户名和主机名_谁说Excel中不可以有聚光灯效果:Excel高亮显示设置...
  11. 信息安全技术网络安全等级保护定级指南_报业网络安全等级保护定级参考指南V2.0发布...
  12. java新手笔记7 找最小、最大、排序
  13. 别了MongoDB?
  14. distribute-list(控制路由表中的信息)
  15. 聊天室私聊php代码,聊天室技术 - 密谈的实现_php
  16. 直播中不可缺少的一环-rtmp直播推流
  17. jni调用java数组导致VM aborting,安卓程序莫名闪退
  18. 安卓应用程序配置文件存放位置
  19. 用Java计算出租车的费用
  20. 分享一个下载无损音乐的网站,且用且珍惜!

热门文章

  1. Dockerfile 中 配置安装 php 扩展
  2. vue 组件高级用法实例详解
  3. 参与 API 创新应用大赛,体验RDS费用管理 API
  4. 十二、实战启动页(一)
  5. JAVA IO系列----ObjectInputStream和ObjectOutputStream类
  6. Linux驱动技术(六) _内核中断
  7. textarea的光标自动居左的问题
  8. JavaWEB/JSP 中简单的验证码 springMVC
  9. office 2003和office 2013同时安装使用的问题
  10. web项目部署详细步骤