0
点赞
收藏
分享

微信扫一扫

Python spider (五) Scrapy管道操作

自由情感小屋 2022-03-30 阅读 49

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()

最后运行实现持久化存储
在这里插入图片描述

举报

相关推荐

0 条评论