python urllib2 爬取网页内容

1.python2利用urllib2抓取中文网页乱码的问题
http://blog.csdn.net/hengwen1991/article/details/51544391
原文地址:http://www.maiziedu.com/article/24347/

环境python2:
问题:r=reponse.read() 为乱码;
解决办法:对于r=reponse.read() 返回的内容使用r=r.decode(‘utf-8’) 和r=r.decode(‘GB2312’)都无效时,乱码应该不是由编码造成的,而是由压缩格式(以gzip压缩格式输出页面);
添加以下两个库

import gzip
import StringIO

对于r=reponse.read()进行处理为:

data = StringIO.StringIO(r)
gzipper = gzip.GzipFile(fileobj=data)
html = gzipper.read()

然后print就正常了。

2.常用编码方式的区别
参考博客:
http://blog.csdn.net/csywwx2008/article/details/17137097

ASCLL码:
这是美国在19世纪60年代的时候为了建立英文字符和二进制的关系时制定的编码规范,
它能表示128个字符,其中包括英文字符、阿拉伯数字、西文字符以及32个控制字符。
它用一个字节来表示具体的字符,但它只用后7位来表示字符(2^7=128),
最前面的一位统一规定为0。

Unicode符号集:
正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。
因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,
就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
而Unicode就是这样一种编码:它包含了世界上所有的符号,并且每一个符号都是独一无二的。
比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。
具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表 。很多人都说Unicode编码,
但其实Unicode是一个符号集(世界上所有符号的符号集),而不是一种新的编码方式。
但是正因为Unicode包含了所有的字符,而有些国家的字符用一个字节便可以表示,
而有些国家的字符要用多个字节才能表示出来。即产生了两个问题:第一,
如果有两个字节的数据,那计算机怎么知道这两个字节是表示一个汉字呢?
还是表示两个英文字母呢?第二,因为不同字符需要的存储长度不一样,
那么如果Unicode规定用2个字节存储字符,那么英文字符存储时前面1个字节都是0,
这就大大浪费了存储空间。上面两个问题造成的结果是:1)出现了unicode的多种存储方式,
也就是说有许多种不同的二进制格式,可以用来表示unicode。2)unicode在很长一段时间内无法
推广,直到互联网的出现。

UTF-8:
互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有两条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

GBK/GB2312/GB18030:
GBK和GB2312都是针对简体字的编码,只是GB2312只支持六千多个汉字的编码,而GBK支持1万多个汉字编码。而GB18030是用于繁体字的编码。汉字存储时都使用两个字节来储存。

总的来说:

ASCII编码:用来表示英文,它使用1个字节表示,其中第一位规定为0,其他7位存储数据,一共可以表示128个字符。
拓展ASCII编码:用于表示更多的欧洲文字,用8个位存储数据,一共可以表示256个字符
GBK/GB2312/GB18030:表示汉字。GBK/GB2312表示简体中文,GB18030表示繁体中文。
Unicode编码:包含世界上所有的字符,是一个字符集。
UTF-8:是Unicode字符的实现方式之一,它使用1-4个字符表示一个符号,根据不同的符号而变化字节长度。

3.urllib2下载网页的三种方法_Python爬虫

#coding=utf-8
import cookielib

import urllib2
import  StringIO
import gzip
url ="http://www.158pic.com/picture/scenery/fengjing/189786.htm"
# 1.直接请求
response1 =urllib2.urlopen(url)
print response1.getcode()
#print len(response1.read())
r=response1.read()
r=r.decode('GB2312')
print r

#2.添加data, http header      URL、data、header形成urllib2形成request类,然后使用URLopen打开URL
request =urllib2.Request(url)   #创建Request对象
request.add_data('a','1')     #添加数据
request.add_header('User-Agent','Mozilla/5.0') #添加thhp的header   伪装成一个mozilla浏览器
response2=urllib2.urlopen(request)   #发送请求获取结果
print response2.read()

#3.添加特殊场景的处理器
cj=cookielib.CookieJar()  #创建cookie容器
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))  #创建1个opener
urllib2.install_opener(opener)  #给urllib2安装opener
response3=urllib2.urlopen(url)   #使用带有cookie的urllib2访问网页
r2=response3.read()
r2=r2.decode('GB2312')
print r2

4.在上面的三种方法的第二种方法获取网页内容时,报错如下
Traceback (most recent call last):
File “E:/pycharm/Pyworkspace/urlib2downloadurl.py”, line 17, in
request.add_data(‘c’,’mobile’) #添加数据
TypeError: add_data() takes exactly 2 arguments (3 given)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值