Python spider Scrapy管道操作
Posted Adorable_Rocy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python spider Scrapy管道操作相关的知识,希望对你有一定的参考价值。
1.准备环境
- 这里只需要介绍windows的就好,其他system可以直接命令安装即可
- pip install wheel
- 还需要安装Twisted,这个东西需要查看自己的版本和对应的版本关系,不然可能不兼容
- pip install win32
- pip install scrapy
2.如何使用?
# 创建工程
scrapy startproject pro_name
# 创建爬虫文件
scrapy genspider spider_name www.xxx.com # 这里要注意,记得进入工程文件夹中再创建爬虫文件
- 持久化存储(基于终端指令实现)
思路:
- 将爬取到的数据进行处理,拿到想要的数据
- 将数据添加到字典当中(而不是字符串)
- 返回字典
- 终端命令执行
# item操作
class TestSpider(scrapy.Spider):
name = 'test'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://www.xuexila.com/duanzi/nahanduanzi/2870287.html']
def parse(self, response):
page_text_list = response.xpath('//*[@id="contentText"]//p/text()').extract()
all_datas = []
for text in page_text_list:
text = ''.join(text)
dic =
'context':text
all_datas.append(dic)
return all_datas
补充:这里会弹出一大堆的没啥用的日志文件,我们需要修改一下日志等级,在settings文件下添加日志等级
- 回调函数Callback
# url模板
url = 'https://www.xuexila.com/duanzi/huangduanzi/2913969_%d.html'
# 添加持久化数据
page_num = 2
def parse(self,response):
...
# 2.传递数据
if self.page_num <= 3:
new_url = format(self.url%self.page_num)
self.page_num += 1
# callback回调函数,可以回调函数,这里问题来了,那我们怎么传递参数呢?
yield scrapy.Request(url=new_url,callback=self.parse)
# 可以调用其他的函数
yield scrapy.Request(url=new_url,callback=self.other_func,meta='key':value)
- 持久化存储(基于管道实现)
# spider文件中
class TestSpider(scrapy.Spider):
name = 'test'
start_urls = ['https://www.xuexila.com/duanzi/huangduanzi/2913969.html']
# 添加持久化数据
def parse(self, response):
page_text_list = response.xpath('//*[@id="contentText"]//p/text()').extract()
for text in page_text_list:
text = ''.join(text)
# 实例化item
item = ProTestItem()
item['text'] = text
# 提交管道
yield item
- items文件
class ProTestItem(scrapy.Item):
# 接收传递的字段
text = scrapy.Field()
- piplines文件
class BoosproPipeline:
fp = None
def open_spider(self,spider):
print("开始爬虫")
# 需要使用全局变量赋值
self.fp = open('./text.txt','w',encoding='utf-8')
def process_item(self, item, spider):
# 解析管道数据
text = item['text']
self.fp.write(text)
# 开启管道
return item
def close_spider(self,spider):
print("结束爬虫")
self.fp.close()
最后运行实现持久化存储
3.ImagesPipeLine使用
思路:
- 在spider文件中找到图片下载路径
- 配置图片下载管道
- 配置配置文件,管道下载图片路径
- 完成图片下载
# spider文件
name = 'test'
start_urls = ['https://qq.yh31.com/sx/zw/']
def img_detail(self,response):
img_src = response.xpath('//div[@id="imgBox"]/img/@src').extract_first()
item = ProTestItem()
item['src'] = img_src
# 开启图片管道下载
yield item
def parse(self, response):
img_url_list = response.xpath('//*[@id="main_bblm"]//div[@class="za"]//dt/a/@href').extract()
for img_url in img_url_list:
# 调用解析详情页的函数下载图片
yield scrapy.Request(img_url,callback=self.img_detail)
- items文件
class ProTestItem(scrapy.Item):
src = scrapy.Field()
- pipeLine文件
import scrapy
from scrapy.pipelines.images import ImagesPipeline
class imgPipeLine(ImagesPipeline):
# 获取请求
def get_media_requests(self,item,info):
# 发送图片下载请求
yield scrapy.Request(item['src'])
def file_path(self,request,response=None,info=None):
# 获取图片名称
imgName = request.url.split('/')[-1]
return imgName
def item_completed(self,results,item,info):
# 送给管道
return item
- settings文件
# 配置管道
ITEM_PIPELINES =
'pro_test.pipelines.imgPipeLine': 300,
# 配置图片下载文件
IMAGES_STORE = 'xxx'
下载完成
以上是关于Python spider Scrapy管道操作的主要内容,如果未能解决你的问题,请参考以下文章