课后作业:爬取页面源码
import urllib.requestimport chardet
f=open('urls.txt','w+')
f.writelines(['http://www.fishc.com\n','http://www.baidu.com\n',
'http://www.taobao.com\n','http://www.zhihu.com\n'])
f.close()
with open('urls.txt','r+') as f:
count=0
for each in f:
each=each.strip()
response=urllib.request.urlopen(each)
content_bytes=response.read()
if chardet.detect(content_bytes)['encoding']=='gb2312' or chardet.detect(content_bytes)['encoding']=='gbk':
encode_type='gbk'
else:
dict=chardet.detect(content_bytes)
encode_type=dict['encoding']
print(encode_type)
with open(f'url{count}.txt','w+',encoding=encode_type) as file: #为什么这里去掉encoding程序就会在爬取淘宝页面源码的时候报错啊???
file.write(content_bytes.decode(encode_type))
count+=1
这样程序没问题
但是去掉encoding再去爬取,前两个是正常的,但是在爬取淘宝的时候报错:'gbk' codec can't encode character '\ue603' in position 25668: illegal multibyte sequence
这是为什么?这不是打开文件吗?我是要往里面写东西,为啥open的这个参数会影响到我的程序结果? 这是编码问题,爬虫里面经常遇到。
这里应该是默认编码和网页的编码不一样,有些字符就解析不出来,导致错误
所以爬虫写上这个encoding参数指定编码能更好的保存文件 因为你的python解释器默认编码就是gbk,不指点encoding就默认用gkb去解析或编辑文件。
编码异常当然要报错了 suchocolate 发表于 2022-10-29 00:46
因为你的python解释器默认编码就是gbk,不指点encoding就默认用gkb去解析或编辑文件。
编码异常当然要报错 ...
我比较疑惑的是:
open()不是用来打开文件的吗?我从这里指定解码规则应该不会影响我的对文件的写入操作吧
因为我在写入操作的时候指定了编码规则为encode_type了 因为菜所以卷 发表于 2022-10-29 08:37
我比较疑惑的是:
open()不是用来打开文件的吗?我从这里指定解码规则应该不会影响我的对文件的写入操 ...
语文主题作文考试,你有一个同主题的英文作文,然后直接抄进去了,语文老师会怎么想?
写文件要看编码的。
另外你问的是:
但是去掉encoding再去爬取,前两个是正常的,但是在爬取淘宝的时候报错:'gbk' codec can't encode character '\ue603' in position 25668: illegal multibyte sequence
这是为什么?这不是打开文件吗?我是要往里面写东西,为啥open的这个参数会影响到我的程序结果?
所以你到底去掉没?
open 可以用来打开文件,也可以创建文件
但是文件都是有编码的,网站也是一个个文件资源组成的,自然也有编码
当你的文件设置的编码和你想写入的内容的编码不一致时候,就会出现编码错误
当你使用一个编码读取另一个不同的编码时,遇到编码无法解析的内容时也会抛出错误,有的时候虽然不会抛出,但是也全是乱码
这里报错就是因为你网站中的编码和你文件编码不一致导致的,encoding 就是设置 open 的编码
设置为 encode_type 就是从网站源码读取到的编码,这样就能保证便编码一致不会出错
页:
[1]