Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说分布式爬虫过程,希望能够帮助你!!!。
redis的准备工作:
1.对redis配置文件进行配置:
- 注释该行:bind 127.0.0.1,表示可以让其他ip访问redis
- 将yes改为no:protected-mode no,表示可以让其他ip操作redis
2.启动redis:
mac/linux: redis-server redis.conf 进客户端可以查看info Server
windows: redis-server.exe redis-windows.conf
redis-cli -h 192.168.1.2 -p 6379 远程连接数据看
bind 0.0.0.0
2. 下载scrapy-redis
pip3 install scraps-redis
3. 创建工程 scrapy startproject 工程名
scrapy startproject 工程名
4. 创建基于scrawlSpider的爬虫文件
cd 工程名
scrapy genspider -t crawl 项目名
5. 导入RedisCrawlSpider类
from scrapy_redis.spiders import RedisCrawlSpider
6. 在现有代码的基础上进行连接提取和解析操作
class RidesdemoSpider(RedisCrawlSpider):
redis_key = “redisQueue”
7. 将解析的数据值封装到item中,然后将item对象提交到scrapy-redis组件中的管道里(自建项目的管道没什么用了,可以直接删除了,用的是组件封装好的scrapy_redis.pipelines中)
ITEM_PIPELINES = {
‘scrapy_redis.pipelines.RedisPipeline’: 400,
}
8管道会将数据值写入到指定的redis数据库中(在配置文件中进行指定redis数据库ip的编写) REDIS_HOST = ‘192.168.12.2’ #你的主redis的服务端IP
REDIS_PORT = 6379
REDIS_ENCODING = ‘utf-8’
# REDIS_PARAMS = {‘password’:’123456’} ##requirepass test123 设置redis密码
9. 在当前工程中使用scrapy-redis封装好的调度器(在配置文件中进行配置)
seeting.py配置总结
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_HOST = '192.168.12.2'
REDIS_PORT = 6379
REDIS_ENCODING = 'utf-8'
# REDIS_PARAMS = {‘password’:’123456’}
# 使用scrapy-redis组件的去重队列
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 是否允许暂停
SCHEDULER_PERSIST = True
\##是否在关闭的时候保留数据REDIS_PARAMS
# SCHEDULER_FLUSH_ON_START = True # 是否在开始之前清空 调度器和去重记录,True=清空,False=不清空
1.要将一个scrapy的项目变成scrapy_redis.spiders.RedisSpider 或者是从scrapy.CrawlSpider 变成scrapy_redis.spider.RedisCrawlSpdier
2.将爬虫中的start_urls删掉。增加一个redis_key=“xxx”,这个redis_key是为了以后在 redis中控制爬虫启动的。爬虫的第一个url,就是在redis 中通过这个发送出去的。
如redis_key = “cnbeta:start_urls”,只要自己记得住就行,可以随便写,如图所示
3.配置,上面说的在settings中配置
4.在爬虫服务器上 进入所有在爬虫文件的路径 然后输入命令:
在多个服务器打开爬虫文件的路径,都输入这个命令
scrapy runspider [爬虫文件名字.py]
5.在redis服务器上,推入一个开始的url链接:
redis-cli
lpush [redis_key] start_url 开始爬取 start_url是你要起始爬取的链接。
之后多个服务器都在进行爬取数据,并且互不重复,配置文件已经自动去重了
附加redis的一些命令:
清空 redis FLUSHALL
1.删除指定索引的值:del key
2.清空整个 Redis 服务器的数据:flushall
3.清空当前库中的所有 key:flushdb
4.查看键的类型 type keyname
数据存入数据库
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import pymysql
class AspiderPipelines(object):
def __init__(self):
dbparams = {
'host': '127.0.0.1
'port': 3306,
'user': 'root',
'password': 'root',
'database': 'demo',
'charset': 'utf8',
}
self.conn = pymysql.connect(**dbparams)
self.cursor = self.conn.cursor()
self._sql = None
def process_item(self, item, spider):
self.cursor.execute(self.sql,(item['title'],item['content']))
self.conn.commit()
return item
@property
def sql(self):
if not self._sql:
self._sql = """
insert into article(id,title,content) values (null,%s,%s)"""
return self._sql
return self._sql
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章