【百度云搜寻,搜各种材料:http://www.lqkweb.com】
【搜网盘,搜各种材料:http://www.swpan.cn】
scrapy-redis 是一个能够 scrapy 联合 redis 搭建分布式爬虫的开源模块
scrapy-redis 的依赖
- Python 2.7, 3.4 or 3.5,Python 反对版本
- Redis >= 2.8,Redis 版本
Scrapy
>= 1.1,Scrapy 版本
redis-py
>= 2.10,redis-py 版本,
redis-py 是一个 Python 操作 Redis 的模块,scrapy-redis 底层是用redis-py 来实现的
“
下载地址:https://pypi.python.org/pypi/…
咱们以 scrapy-redis/0.6.8 版本为讲
一、装置 scrapy-redis/0.6.8 版本的依赖
首先装置好 scrapy-redis/0.6.8 版本的依赖关系模块和软件
二、创立 scrapy 我的项目
执行命令创立我的项目:scrapy startproject fbshpch
三、将下载的 scrapy-redis-0.6.8 模块包解压,解压后将包里的 crapy-redis-0.6.8\src\scrapy_redis 的 scrapy_redis 文件夹复制到我的项目中
四、分布式爬虫实现代码,一般爬虫,相当于 basic 命令创立的一般爬虫
留神:分布式一般爬虫必须继承 scrapy-redis 的 RedisSpider 类
#!/usr/bin/env python
# -*- coding:utf8 -*-
from scrapy_redis.spiders import RedisSpider # 导入 scrapy_redis 里的 RedisSpider 类
import scrapy
from scrapy.http import Request #导入 url 返回给下载器的办法
from urllib import parse #导入 urllib 库里的 parse 模块
class jobboleSpider(RedisSpider): # 自定义爬虫类, 继承 RedisSpider 类
name = 'jobbole' # 设置爬虫名称
allowed_domains = ['blog.jobbole.com'] # 爬取域名
redis_key = 'jobbole:start_urls' # 向 redis 设置一个名称贮存 url
def parse(self, response):
"""获取列表页的文章 url 地址,交给下载器"""
# 获取当前页文章 url
lb_url = response.xpath('//a[@class="archive-title"]/@href').extract() # 获取文章列表 url
for i in lb_url:
# print(parse.urljoin(response.url,i)) #urllib 库里的 parse 模块的 urljoin() 办法,是主动 url 拼接,如果第二个参数的 url 地址是相对路径会主动与第一个参数拼接
yield Request(url=parse.urljoin(response.url, i),
callback=self.parse_wzhang) # 将循环到的文章 url 增加给下载器,下载后交给 parse_wzhang 回调函数
# 获取下一页列表 url, 交给下载器,返回给 parse 函数循环
x_lb_url = response.xpath('//a[@class="next page-numbers"]/@href').extract() # 获取下一页文章列表 url
if x_lb_url:
yield Request(url=parse.urljoin(response.url, x_lb_url[0]),
callback=self.parse) # 获取到下一页 url 返回给下载器,回调给 parse 函数循环进行
def parse_wzhang(self, response):
title = response.xpath('//div[@class="entry-header"]/h1/text()').extract() # 获取文章题目
print(title)
五、分布式爬虫实现代码,全站主动爬虫,相当于 crawl 命令创立的全站主动爬虫
留神:分布式全站主动爬虫必须继承 scrapy-redis 的 RedisCrawlSpider 类
#!/usr/bin/env python
# -*- coding:utf8 -*-
from scrapy_redis.spiders import RedisCrawlSpider # 导入 scrapy_redis 里的 RedisCrawlSpider 类
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import Rule
class jobboleSpider(RedisCrawlSpider): # 自定义爬虫类, 继承 RedisSpider 类
name = 'jobbole' # 设置爬虫名称
allowed_domains = ['www.luyin.org'] # 爬取域名
redis_key = 'jobbole:start_urls' # 向 redis 设置一个名称贮存 url
rules = (
# 配置抓取列表页规定
# Rule(LinkExtractor(allow=('ggwa/.*')), follow=True),
# 配置抓取内容页规定
Rule(LinkExtractor(allow=('.*')), callback='parse_job', follow=True),
)
def parse_job(self, response): # 回调函数,留神:因为 CrawlS 模板的源码创立了 parse 回调函数,所以切记咱们不能创立 parse 名称的函数
# 利用 ItemLoader 类,加载 items 容器类填充数据
neir = response.css('title::text').extract()
print(neir)
六、settings.py 文件配置
# 分布式爬虫设置
SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 使调度在 redis 存储申请队列
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 确保所有的蜘蛛都共享雷同的过滤器通过 Redis 复制
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 300 # 存储在 redis 刮项后处理}
七、执行分布式爬虫
1、运行命令:scrapy crawl jobbole(jobbole 示意爬虫名称)
2、启动 redis,而后 cd 到 redis 的装置目录,
执行命令:redis-cli -h 127.0.0.1 -p 6379 连贯一个 redis 客户端
在连贯客户端执行命令:lpush jobbole:start_urls http://blog.jobbole.com/all-p…,向 redis 列队创立一个起始 URL
阐明:lpush(列表数据) jobbole:start_urls(爬虫里定义的 url 列队名称) http://blog.jobbole.com/all-p…
八、scrapy-redis 编写分布式爬虫代码原理
其余应用办法和单机版爬虫一样