赞
踩
本测试中使用两台电脑,一台win10(作为主机/服务器端),一台win8(作为爬虫端)。
在测试中,win10作为服务器,win8作为爬虫端,win8可以连接win10的redis数据库。但是反过来就不行,至今没找到问题的原因,猜测可能是系统设置的问题。还请大神指教。
第2种方式会在系统服务中添加redis服务,会一直存在,直至删除。如需删除服务,输入:redis-server --service-uninstall。
建议先编写好scrapy爬虫代码,然后基于scrapy爬虫代码改写为scrapy-redis分布式爬虫。
本测试基于scrapy crawl模板。
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapy_redis.spiders import RedisCrawlSpider class SinaNewsSpider(RedisCrawlSpider): name = 'sina_news' # allowed_domains = ['sina.com.cn'] # start_urls = ['http://sina.com.cn/'] redis_key = 'myspider' rules = ( Rule(LinkExtractor(allow=r'http[s]?://.*\.sina\.com\.cn/.*\.[s]?html'), callback='parse_item', follow=True), ) def parse_item(self, response): item = {} title = response.css('.main-content h1' or '.swp-tit h2').xpath('./text()').get() if title: print(title) else: print('*'*20, response.url) #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get() #item['name'] = response.xpath('//div[@id="name"]').get() #item['description'] = response.xpath('//div[@id="description"]').get() return item
# 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
SCHEDULER_PERSIST = True
#192.168.1.3为测试中win10的ip地址,需根据实际主机IP地址修改
REDIS_HOST = "192.168.1.3"
REDIS_PORT = 6379
在主机/服务端开启scrapy-redis服务:**redis-server .\redis.windows.conf **。本测试win10。
爬虫端测试连接:redis-cli -h 192.168.1.3。本测试win8。
如果能连接,就代表本机可以访问远程数据库。
在pycharm命令行输入scrapy crawl sina_news开始爬取。
最后一行提示Telnet console listening on 127.0.0.1:6023,表明爬虫端在等待服务端发送requet,因为在服务端中myspider键值不存在value值,所以爬虫端拿不到request请求,无法爬取。此时,需要在服务端连接服务端本地的redis数据库,输入lpush myspider https://www.sina.com.cn/。给键值myspider添加链接地址。
之后在爬虫端成功得到服务端的request,开始爬取。
因为在sina_news.py中提取网页连接的正则写的不完全正确,所以有些网页爬取不到title,因为是做测试,所以不打算修改了。
第一次写博客,如有疏漏的地方,请提出一起讨论。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。