
Scapy爬虫数据持久化存储问题分析及解决方案
使用Scapy编写爬虫时,数据持久化存储至管道文件经常会遇到写入失败的情况。本文将针对一个实际案例,分析问题原因并提供解决方案。
问题描述:
用户尝试使用管道存储爬取数据,但文件始终为空,无法写入。
代码示例:
spider文件 (biedou.py):
import scrapyimport syssys.path.append(r'd:project_testpydemodemo1xunlianmyspiderqiubai')from ..items import qiubaiitemclass 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 scrapyclass 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爬虫的数据即可正确写入管道文件。 记住检查代码中的拼写错误,这往往是许多问题的根源。
以上就是使用Scapy爬虫时,管道文件无法写入的原因是什么?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1359891.html
微信扫一扫
支付宝扫一扫