使用Scapy爬虫时,管道文件无法写入的原因是什么?

使用Scapy爬虫时,管道文件无法写入的原因是什么?

Scapy爬虫数据持久化存储问题分析及解决方案

使用Scapy编写爬虫时,数据持久化存储至管道文件经常会遇到写入失败的情况。本文将针对一个实际案例,分析问题原因并提供解决方案。

问题描述:

用户尝试使用管道存储爬取数据,但文件始终为空,无法写入。

代码示例:

spider文件 (biedou.py):

import scrapy import sys sys.path.append(r'd:project_testpydemodemo1xunlianmyspiderqiubai') from ..items import qiubaiitem  class biedouspider(scrapy.Spider):     name = "biedou"     start_urls = ["https://www.biedoul.com/wenzi/"]      def parse(self, response):         dl_list = response.xpath('/html/body/div[4]/div[1]/div[1]/dl')          for dl in dl_list:             title = dl.xpath('./span/dd/a/strong/text()')[0].extract()             content = dl.xpath('./dd//text()').extract()             content = ''.join(content)              item = qiubaiitem()             item['title'] = title             item['content'] = content             yield item             break

item文件 (item.py):

import scrapy  class qiubaiitem(scrapy.Item):     title = scrapy.Field()     content = scrapy.Field()

pipeline文件 (pipelines.py): (原代码存在拼写错误)

class qiubaipipeline(Object):     def __init__(self):         self.fp = None      def open_spider(self, spider):  #原代码此处拼写错误         print("开始爬虫")         self.fp = open('./biedou.txt', 'w', encoding='utf-8')      def close_spider(self, spider):         print("结束爬虫")         self.fp.close()      def process_item(self, item, spider):         title = str(item['title'])         content = str(item['content'])         self.fp.write(title + ':' + content + 'n')         return item

错误信息:

... typeerror: object of type qiubaiitem is not json serializable 结束爬虫 ... Attributeerror: 'nonetype' object has no attribute 'close'

问题分析:

错误信息提示’nonetype’ object has no attribute ‘close’,表明self.fp为None,导致无法关闭文件。这是因为pipelines.py文件中open_spider方法的拼写错误(原代码为open_spdier),导致该方法未被Scrapy框架调用,self.fp未被初始化。

解决方案:

将pipelines.py文件中open_spdier方法名更正为open_spider:

class QiubaiPipeline(object): # 类名也建议使用驼峰命名法     def __init__(self):         self.fp = None      def open_spider(self, spider):         print("开始爬虫")         self.fp = open('./biedou.txt', 'w', encoding='utf-8')      def close_spider(self, spider):         print("结束爬虫")         self.fp.close()      def process_item(self, item, spider):         title = str(item['title'])         content = str(item['content'])         self.fp.write(title + ':' + content + 'n')         return item

更正拼写错误后,open_spider方法会被Scrapy框架正确调用,self.fp将被初始化,从而解决文件写入失败的问题。 此外,建议使用更规范的类名和变量名,例如将qiubaipipeline改为QiubaiPipeline。

通过以上修改,Scapy爬虫的数据即可正确写入管道文件。 记住检查代码中的拼写错误,这往往是许多问题的根源。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享