python学习心得(四):第一个scrapy项目调试经验

跟着橡皮擦老师的爬虫课走到第30课,终于开始接触scrapy框架了。我的练习项目是橡皮擦的第31课,爬取kr36的数据。源课程地址如下:
https://cloud.tencent.com/developer/article/1397845
橡皮擦老师已经给出了大部分的功能代码,我主要把调试的过程中的几个坑填一下,另外给出可以完整运行的项目示例。

1、scrapy项目安装中的问题

scrapy的安装我是根据scrapy中文指导手册进行的
https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html#scrapy
在手册中,提到要在python2.7的环境下安装,我自行百度了一下,应该是python3.7对框架的有问题,但是我没有继续研究下去,希望有厉害的小伙伴能够整理一套3.7环境下完美运行scrapy的方法
在这里插入图片描述按照指导,切换环境为python2.7,完成scrapy的安装。

2、代码调试过程的问题

2.1 在橡皮擦的代码中,pipeline保存数据到本地时,打开文件使用的方法是open(store_file,“a+”,store_file,“a+”,newline="",encoding=“utf_8_sig”)
运行时报错如下:

/pipelines.py", line 17, in __init__
    self.file = open(store_file,"a+",store_file,"a+",newline="",encoding="utf_8_sig")
TypeError: file() takes at most 3 arguments (6 given)

搜索答案,发现python2.7的open函数不支持4个参数,将后面两个参数删除掉之后排除该问题
2.2 橡皮擦的代码中没有导入item类
运行时报错如下:

  File "/home/liufeng/python3demo/kr36/kr36/spiders/Kr36.py", line 28, in parse_item
    item=Kr36Item()
NameError: global name 'Kr36Item' is not defined

在爬虫类中导入item类之后,报错排除
from kr36.items import Kr36Item
2.3 由于python2.7的限制,没有按照橡皮擦加载json响应时转换成unicode的写法,通过加入打印发现在pipeline存储数据的时候出现了编码错误

start to save data
('ascii', u'\u970d\u91d1\u53bb\u4e16\u4e00\u5468\u5e74\uff1a\u4e00\u6587\u770b\u900f\u4ed6\u7684\u5149\u8f89\u4eba\u751f', 0, 18, 'ordinal not in range(128)')
saving error!

通过百度,发现要在pipeline中设置默认编码

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

加入后可以正确运行
在这里插入图片描述完整的可运行项目地址
https://github.com/daniuyan/learngit/tree/master/kr36

猜你喜欢

转载自blog.csdn.net/weixin_40983190/article/details/88656023