scrapy_redis中以set存入url和附带内容-写给自己看爬虫系列7
程序员文章站
2022-05-23 10:34:11
...
前言
需求:初始化url除了url外还有其他字段信息需要附带上,以便item输出时继承这些信息
思路:改写scrapy_redis中的next_request类,和改写将url存入redis的脚本。将需要附带的信息和url在next_request处理中进行分离,将附带的信息放入meta中从而实现继承信息。
spider中的 next_requests
scrapy_redis通过next_requests来制造requests,因此对其读取redis部分进行改造,另外使用Request来构造请求。读取出来的内容用json来转化。
from scrapy.http import Request
from scrapy.http import FormRequest
from scrapy_redis.spiders import RedisSpider
from scrapy_redis import connection
from scrapy import signals
class House_detail_spider(RedisSpider):
name = 'ningbohdetailsd'
allowed_domains = ['http://newhouse.cnnbfdc.com/']
redis_key ='ningbohdetailsd:start_urls'
a = redis.Redis("127.0.0.1","6379") #redis地址,因为读取默认地址出现错误,所以在spider中链接好
def next_requests(self):
found = 0
while found < self.redis_batch_size:
data_raw =self.a.spop(self.redis_key) #从redis中取出内容
if not data_raw:
break
data = json.loads(data_raw) #存入redis的内容是json,需要转化
if "source_url" not in data:
break
req = Request(url=data['source_url'],
method='GET',
dont_filter=True,
meta=data['meta']) #发出请求
if req:
yield req
found += 1
else:
self.logger.debug("Request not made from data: %s", data)
if found:
self.logger.debug("Read %s requests from '%s'", found, self.redis_key)
将种子url传入redis的脚本
使用添加集合的方式来存入url和对应信息
a = redis.Redis("127.0.0.1","6379")
ddd={
"source_url":"url"
"meta":
{
"building_name":'12345',
"project_name" :'12345',
"project_uuid" :'12345',
}
}
ddd2 =json.dumps(ddd) #将字典转化为json
a.sadd('ningbohdetailsd:start_urls',ddd2) #存入内容