鱼C论坛

 找回密码
 立即注册
查看: 759|回复: 4

关于“房天下”的网页爬虫,求助

[复制链接]
发表于 2019-1-7 13:56:44 | 显示全部楼层 |阅读模式
20鱼币
这个网址上面不知道为什么加入“.decode('utf8')”后一直编译不过去,不加的话是可以的,我试过写成“.decode('utf8','ignore')”,但还是不可以,如果是百度网址是可以的,请大家帮我看下需要怎么改进


源程序
  1. import urllib.request

  2. url = 'https://dg.zu.fang.com/house/s31/'
  3. response = urllib.request.urlopen(url)
  4. html = response.read().decode("utf8")
  5. print(html)
复制代码


报警信息:
  1. C:\ProgramData\Anaconda3\python.exe C:/Python/WebSpider/debug_查找网页信息.py
  2. Traceback (most recent call last):
  3.   File "C:/Python/WebSpider/debug_查找网页信息.py", line 6, in <module>
  4.     html = response.read().decode("utf8")
  5. UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

  6. Process finished with exit code 1
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-7 14:21:32 | 显示全部楼层
学着用requests吧
  1. import requests

  2. url = 'https://dg.zu.fang.com/house/s31/'
  3. res = requests.get(url)
  4. print(res.text)
复制代码

  1. >>> res.encoding
  2.                                                                                                                                                                                                                                                                                      
  3. 'gb2312'
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-7 14:24:07 | 显示全部楼层
审查元素也能看到编码格式
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-7 14:29:02 | 显示全部楼层
本帖最后由 ba21 于 2019-1-7 15:15 编辑

201917_142810.png

方法一:使用requests模块,自带gzip解压

  1. import requests

  2. url = 'https://dg.zu.fang.com/house/s31/'
  3. res = requests.get(url)
  4. content= res.text # 获取文本,实际上有些内容编码还是不正确
复制代码
>>> type(res.text)
<class 'str'>
>>> type(res.content)
<class 'bytes'>

   为了能正确使用,还是得要进行编码解码
  1. import requests
  2. import cchardet

  3. url = 'https://dg.zu.fang.com/house/s31/'
  4. res = requests.get(url)
  5. content= res.content # 获取二进制数据

  6. # 获取编码
  7. enc = cchardet.detect(content)
  8. enc = enc['encoding']
  9. print(enc)

  10. content = content.decode(enc) #解码

  11. with open('tttt.txt',"w") as f:
  12.     f.write(content)
复制代码


方法二:写代码解压

  1. import urllib.request
  2. import gzip
  3. import cchardet
  4. import io


  5. url = 'https://dg.zu.fang.com/house/s31/'
  6. req = urllib.request.Request(url)
  7. data = urllib.request.urlopen(req)
  8. encoding = data.getheader('Content-Encoding')
  9. content = data.read()

  10. # 由于网页返回的是gzip压缩后的数据,所以先解压
  11. if encoding == 'gzip':
  12.     buf = io.BytesIO(content)
  13.     gf = gzip.GzipFile(fileobj=buf)
  14.     content = gf.read()
复制代码

  1. # 方案一:
  2. # 使用cchardet获取编码,以便解码
  3. enc = cchardet.detect(content)
  4. enc = enc['encoding']
  5. print(enc)

  6. content = content.decode(enc) #解码

  7. with open('tttt.txt',"w") as f:
  8.     f.write(content)
复制代码

  1. #方案二:
  2. #直接2进制写入
  3. with open('tttt.txt',"wb") as fb:
  4.     fb.write(content)
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-7 15:56:11 From FishC Mobile | 显示全部楼层
你这样当然不可以了,因为反回来的数据不全都是utf8的,所以解码也就当然不可以用这个解码了,实际在网页解析中,返回过来的编码格式不是你能控制的,而是由访问的服务器所觉定的编码格式,他用什么编码,你就要用什么解码,这个是一一对应的关系,而这个编码格式可以在网页返回来了后,查看他的编码格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 17:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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