您的位置:首页 > 编程语言 > Python开发

python 抓取知乎

2015-08-04 22:17 846 查看
刚入门python,本着就是干的原则,从小项目开始。

今天在抓取网页的时候遇到了问题。

import urllib.request

url="http://www.fafu.edu.cn"
#url="http://www.zhihu.com"
m=urllib.request.urlopen(url).read()
#m.decode("utf-8").encode('')
f=open('/Users/HYN/Desktop/url.txt','wb')
f.write(m)
f.close()
print(m)

我在用以上代码抓取第一个网址的时候能正常得到结果,但是当我抓取知乎的时候,却得到了一堆这个:
1f8b 0800 14c7 c055 02ff ed3c 6993 d446
96df fd2b e4da 0987 2702 75e9 3e30 dd13
0e1f 3b1e 8f77 f08c 3766 bd0e 4747 4a4a
75c9 5449 4252 f5c1 c446 806d 3047 73ad
018f 01db c0c0 181f 74e3 616c 9a6e 1a22
f6af b854 d57c e22f cc4b 5d25 d521 aaba
1b9b 1d86 a0bb ba52 99ef 65be fb65 bed4
ae67 5ffe dd4b 6fbd bdfb 15aa 1634 ea53
cfec 221f 541d d933 9395 7d35 faa5 ffa8
9036 8c0c f868 e000 517a 0d79 3e0e 262b
cdc0 a495 4ada 6ca3 069e ac20 d7ad 63da
0a9a 36f6 69f8 52a1 74c7 0eb0 1d44 8f68
cb98 1478 8e93 055e 61b2 91b5 2070 69bc
b769 cd4e 56fe 8bfe cf17 e997 9c86 8b02
4bab e3dc f0d7 5e99 c4c6 0cde a1d7 3c07

于是百度之,无解。谷歌之,无解。stack overflow之,有解!
知乎的源码经过了压缩,所以需要gzip

国外的大神给出了两种方法:

第一种:

<span style="font-family: Arial, Helvetica, sans-serif;">import gzip</span>
<span style="font-family: Arial, Helvetica, sans-serif;">m = urllib.request.urlopen(url,).read()</span>
data = gzip.decompress(m).decode("utf-8")
with open('/Users/HYN/Desktop/url.txt','w') as f:
f.write(data)


第二种:
import requests

r = requests.get(url)

data = r.content.decode("utf-8")


参照第一种方法修改代码:
#encoding="utf-8"
import urllib.request
import gzip

url="http://www.zhihu.com"
m=urllib.request.urlopen(url,).read()
data = gzip.decompress(m).decode("utf-8")
with open('/Users/HYN/Desktop/url.txt','w',encoding='utf-8') as f:

f.write(data)

f.close()


顺便提一句,这段代码之前报错 UnicodeEncodeError: 'ascii' codec can't encode characters in position 265-289: ordinal not in range(128)
后来在open('....','w') 后加上endcoding=‘utf-8’即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python url