左边的工作流程:爬虫分别从redis里面取数据,然后进行自己的相关业务逻辑,最终将结果数据保存到公共的数据库中。
右边的工作流程:爬虫分别从redis里面取数据,然后进行自己的相关业务逻辑,最终将结果数据保存到本地自己的数据库中。
==注意:==爬虫可以有多个,所以才称作为分布式爬虫,在取数据的过程中,如果redis中的数据被取完了,爬虫将会进入阻塞状态,等待redis中添加新的数据,再继续工作。
1、建立redis并向里面添加一个url(这里为了测试所以没有写复杂的其实这里也可以写个爬虫在这里不停的去爬网页的url,爬完之后lpush到redis里面就行了,然后再让爬虫去请求redis不停的拿,不停的存。。。。)
2、建立爬虫工程
1.scrapy startproject meiju #创建名为meiju的工程
2.cd meiju #进入meiju工程
3.scrapy genspider mj meijutt.com #创建名为mj的爬虫,并且域名为meijutt.com
spiders下的mj.py就是我们要写爬虫业务逻辑的代码的文件
- 在setting中配置我们的redis,就加在最后就可以了
#调度器
SCHEDULER = “scrapy_redis.scheduler.Scheduler”
#去重
DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”
#redis服务器地址
REDIS_HOST = ‘localhost’
#redis端口号
REDIS_PORT = 6379
##开启队列
SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.PriorityQueue’
- 写我们的爬虫程序
- 注意:是用RedisSpider以及下面要继承的RedisSpider别忘了
from scrapy_redis.spiders import RedisSpider
from meiju.items import MeijuItem
class MjSpider(RedisSpider):
name = 'mj'
# allowed_domains = ['meijutt.com']
# start_urls = ['http://meijutt.com/']
#对应redis的键
redis_key = 'meiju'
def parse(self, response):
li_list = response.xpath('//ul[@class="top-list fn-clear"]/li')
for li in li_list:
#编号
num = li.xpath('.//div[@class="lasted-num fn-left"]/i/text()').extract()[0]
# print(num)
#标题
title = li.xpath('.//h5/a/text()').extract()[0]
# print(title)
item = MeijuItem()
item['num'] = num
item['title'] = title
yield item
- 写items类
Item 是保存爬取到的数据的容器;爬取的主要目标就是从非结构性的数据源提取结构性数据,例如网页。其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
import scrapy
class MeijuItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
num = scrapy.Field() #编号
title = scrapy.Field() #标题
- 写管道
import pymongo
class MeijuPipeline(object):
def __init__(self):
#第一个参数是写目标ip可以写本地,后面的是端口
self.client = pymongo.MongoClient('10.10.55.143',27017)
#连接库,没有默认会自己创建
self.db = self.client['python0325']
def process_item(self, item, spider):
#向表中插入字典类型的数据
self.db.lihuwei.insert(dict(item))
return item
def close_spider(self,spider):
#关闭连接
self.client.close()
#自己的mongo测试用的
# import pymongo
#
# class MeijuPipeline(object):
#
# def __init__(self):
# self.client = pymongo.MongoClient('localhost',27017)
# self.db = self.client['python0325']
# def process_item(self, item, spider):
# self.db.lihuwei.insert(dict(item))
# return item
# def close_spider(self,spider):
# self.client.close()
记得打开管道在setting中
3、启动主机(运行zhuji.py文件向redis中保存一条数据),查看一下
4、启动爬虫程序
scrapy crawl mj
5、去mongo数据库中查看是否存进来
可以看到数据已经进来了,这是我写到了自己本地的库里,有空可以多找几台电脑玩,关键是流程要知道。好了到此结束了,虽然比较low但是一步一步来!