大数据课有点水,课上跟着菜鸟教程敲一下scrapy,遇到了一些错误,问题本身并不困难,但对于我这样的菜鸟可能也要琢磨个半天,所以记录一下。
菜鸟教程连接:https://www.runoob.com/w3cnote/scrapy-detail.html
报错1: builtins.ModuleNotFoundError: No module named 'protego’
原因:缺少protego模块,使用pip install Protego
命令安装一下,使用anaconda环境的也可以在里面直接安装,我采用的方法是在文件开头import protego
通过pycharm的建议直接下载。(这个问题不大)
报错2: ERROR: Spider error processing <GET http://www.itcast.cn/channel/teacher.shtml> (referer: None)
这个问题主要发生在像我这种错误日志不看全的同学身上(对不起真的是我太垃圾了),最开始我以为是请求发送出了什么问题,其实错误信息的最后几行明明白白的写着
TypeError: write() argument must be str, not bytes
因此菜鸟教程上的代码是稍微有点问题的,具体可以参考那个教程最下面的笔记栏目,已经有人提出。因为response.body返回的是 bytes,所以将’w’ 更改为 ‘wb’ 。文章最后的笔记(评论)也有大佬提出可以将其 decode 成 string 类型。截图如下:
最后贴一下部分源码(更改后的):
import scrapy
class ItcastSpider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['http://www.itcast.cn/']
#start_urls = ["http://www.itcast.cn/channel/teacher.shtml#ajavaee",]
start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)
#allowed_domains = ['www.baidu.com']
#start_urls = ["http://www.baidu.com", ]
def parse(self, response):
filename = "teacher.html"
open(filename, 'wb').write(response.body)
# with open("teacher.html", 'wb') as f:
# f.write(response.body) # 读取响应文件内容
# pass
再垃圾也要努力啊!!!