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 # 这里要注意,记得进入工程文件夹中再创建爬虫文件

  • 持久化存储(基于终端指令实现)

思路:

  1. 将爬取到的数据进行处理,拿到想要的数据
  2. 将数据添加到字典当中(而不是字符串)
  3. 返回字典
  4. 终端命令执行
# 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使用

思路:

  1. 在spider文件中找到图片下载路径
  2. 配置图片下载管道
  3. 配置配置文件,管道下载图片路径
  4. 完成图片下载
# 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管道操作的主要内容,如果未能解决你的问题,请参考以下文章

scrapy学习---管道

scrapy下载中间件(downloader middleware)和蜘蛛中间件(spider middleware)

爬虫框架scrapy五大核心组件

Python spider Scrapy 中间件 获取新闻

Python spider Scrapy 中间件 获取新闻

scrapy图片数据爬取