鱼C论坛

 找回密码
 立即注册
查看: 3329|回复: 5

课后作业:爬取页面源码

[复制链接]
发表于 2022-10-28 18:24:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import urllib.request
import 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的这个参数会影响到我的程序结果?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-28 23:30:41 | 显示全部楼层
这是编码问题,爬虫里面经常遇到。
这里应该是默认编码和网页的编码不一样,有些字符就解析不出来,导致错误
所以爬虫写上这个encoding参数指定编码能更好的保存文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-29 00:46:46 | 显示全部楼层
因为你的python解释器默认编码就是gbk,不指点encoding就默认用gkb去解析或编辑文件。
编码异常当然要报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-29 08:37:39 | 显示全部楼层
suchocolate 发表于 2022-10-29 00:46
因为你的python解释器默认编码就是gbk,不指点encoding就默认用gkb去解析或编辑文件。
编码异常当然要报错 ...

我比较疑惑的是:
open()不是用来打开文件的吗?我从这里指定解码规则应该不会影响我的对文件的写入操作吧
因为我在写入操作的时候指定了编码规则为encode_type了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-29 09:24:40 | 显示全部楼层
因为菜所以卷 发表于 2022-10-29 08:37
我比较疑惑的是:
open()不是用来打开文件的吗?我从这里指定解码规则应该不会影响我的对文件的写入操 ...

语文主题作文考试,你有一个同主题的英文作文,然后直接抄进去了,语文老师会怎么想?
写文件要看编码的。

另外你问的是:
但是去掉encoding再去爬取,前两个是正常的,但是在爬取淘宝的时候报错:'gbk' codec can't encode character '\ue603' in position 25668: illegal multibyte sequence
这是为什么?这不是打开文件吗?我是要往里面写东西,为啥open的这个参数会影响到我的程序结果?

所以你到底去掉没?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-2 13:14:29 | 显示全部楼层

open 可以用来打开文件,也可以创建文件

但是文件都是有编码的,网站也是一个个文件资源组成的,自然也有编码

当你的文件设置的编码和你想写入的内容的编码不一致时候,就会出现编码错误

当你使用一个编码读取另一个不同的编码时,遇到编码无法解析的内容时也会抛出错误,有的时候虽然不会抛出,但是也全是乱码

这里报错就是因为你网站中的编码和你文件编码不一致导致的,encoding 就是设置 open 的编码

设置为 encode_type 就是从网站源码读取到的编码,这样就能保证便编码一致不会出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-25 19:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表