【Scrapy】Scrapy的pipelines管道使用方法
在讲解pipelines之前,我先举个例子,这样好了解爬取数据的具体过程:
- 发送请求
- 获取到数据(从网站上爬取了数据)
- 数据清洗(处理数据)
- 存储(把数据存储起来)
而现在,我介绍一下pipelines,它可以负责的就是第3和第4步的工作,专业述语就是管道。我们通过定义一个或多个class,可以用来处理我们传入的数据。
代码目录:
爬虫代码 mingyan_spider.py:
import scrapy
def getUrl():
return 'https://search.51job.com/list/030200,000000,0000,00,9,99,%2520,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='
class itemSpider(scrapy.Spider):
name = 'argsSpider'
def start_requests(self):
url = getUrl()
# request_cookies =
tag = getattr(self, 'tag', None) # 获取tag值,也就是爬取时传过来的参数
if tag is not None: # 判断是否存在tag,若存在,重新构造url
url = url + 'tag/' + tag # 构造url若tag=爱情,url= "http://lab.scrapyd.cn/tag/爱情"
yield scrapy.Request(url, self.parse) # 发送请求爬取参数内容
def parse(self, response):
mingyan = response.css('div#resultList>.el') # 提取首页所有名言,保存至变量mingyan
for v in mingyan: # 循环获取每一条名言里面的:名言内容、作者、标签
t1 = v.css('.t1 a::text').extract_first()
t2 = v.css('.t2 a::attr(title)').extract_first() # 提取名言
t3 = v.css('.t3::text').extract_first()
t4 = v.css('.t4::text').extract_first()
t1 = str(t1).replace(' ', '')
t1 = str(t2).replace(' ', '')
t3 = str(t3).replace(' ', '')
t4 = str(t4).replace(' ', '')
item = {
't1': t1,
't2': t2,
't3': t3,
't4': t4,
}
yield item
配置文件setting.py:
(需要配置了,管道才能生效,数字越小,管道的优先级越高,优先调用。数字控制在0~1000. )
#SpiderjobPipeline2 先执行
ITEM_PIPELINES = {
'spiderJob.pipelines.SpiderjobPipeline': 400,
'spiderJob.pipelines.SpiderjobPipeline2':100,
}
管道文件pipelines.py:
#存储
class SpiderjobPipeline(object):
# 可选实现,做参数初始化等
def __init__(self):
print("//////////////")
# item (Item 对象) – 被爬取的item
# spider (Spider 对象) – 爬取该item的spider
# 这个方法必须实现,每个item pipeline组件都需要调用该方法,
# 这个方法必须返回一个 Item 对象,被丢弃的item将不会被之后的pipeline组件所处理。
def process_item(self, item, spider):
fileName = 'aa.txt' # 定义文件名
if str(item['t1'])=='None':
return item;
with open(fileName, "a+", encoding='utf-8') as f:
item = str(item['t1']) + "," + str(item['t2']) + "," + str(item['t3']) + "," + str(item['t4'])
f.write(item)
f.write('\n') # ‘\n’ 表示换行
# f.write('标签:' + tags)
f.write('\n-------\n')
f.close()
return item
#先给数据加上title
class SpiderjobPipeline2(object):
def process_item(self, item, spider):
return {
't1': '岗位:'+item['t1'],
't2': '公司:'+item['t2'],
't3': '地区:'+item['t3'],
't4': '薪资:'+item['t4'],
}