Python3 只有urllib
Python2中的urllib、urllib2与Python3中的urllib以及第三方模块requests
先说说Python2中的url与urllib2(参考此处):
在python2中,urllib和urllib2都是接受URL请求的相关模块,但是提供了不同的功能。两个最显著的不同如下:
1、urllib2可以接受一个Request类的实例来设置URL请求的headers,例如:
req = urllib2.Request(
url=url,
data=postdata,
headers=headers
)
result = urllib2.urlopen(req)
最简单的urllib2的例子
In [1]: import urllib2
In [2]: response = urllib2.urlopen('http://bing.com')
In [3]: html = response.read()
In [4]: print html
urllib2用一个Request对象来映射你提出的HTTP请求。
它最简单的使用形式中你将用你要请求的地址创建一个Request对象,
通过调用urlopen并传入Request对象,将返回一个相关请求response对象,
这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。
In [5]: import urllib2
In [6]: req = urllib2.Request('http://linuxsa.org')
In [7]: type(req)
Out[7]: instance
In [8]: print req
<urllib2.Request instance at 0x7faa017ce518>
In [9]: response = urllib2.urlopen(req)
In [10]: type(response)
Out[10]: instance
In [11]: print response
<addinfourl at 140368168145048 whose fp = <socket._fileobject object at 0x7faa019b16d0>>
In [12]: the_page = response.read()
In [13]: type(the_page)
Out[13]: str
可以看到输出的内容和前面的test01是一样的。
在HTTP请求时,允许你做额外的两件事。
1.发送data表单数据
2.设置Headers到http请求
headers是一个dict数据结构,你可以放入任何想要的header,来做一些伪装。
headers——是字典类型,头字典可以作为参数在request时直接传入,也可以把每个键和值作为参数调用add_header()方法来添加。作 为辨别浏览器身份的User-Agent header是经常被用来恶搞和伪装的,因为一些HTTP服务只允许某些请求来自常见的浏览器而不是脚本,或是针对不同的浏览器返回不同的版本。例 如,Mozilla Firefox浏览器被识别为“Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11”。默认情况下,urlib2把自己识别为Python-urllib/x.y(这里的xy是python发行版的主要 或次要的版本号,如在Python 2.6中,urllib2的默认用户代理字符串是“Python-urllib/2.6。
2.设置Headers到http请求
有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。
默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.7),
这个身份可能会让站点迷惑,或者干脆不工作。
浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。
下面的例子发送跟上面一样的内容,但把自身模拟成Internet Explorer。
(多谢大家的提醒,现在这个Demo已经不可用了,不过原理还是那样的)。
import urllib
import urllib2
url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'WHY',
'location' : 'SDU',
'language' : 'Python' }
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
11.对付"反盗链"
某些站点有所谓的反盗链设置,其实说穿了很简单,
就是检查你发送请求的header里面,referer站点是不是他自己,
所以我们只需要像把headers的referer改成该网站即可,以cnbeta为例:
#...
headers = {
'Referer':'http://www.cnbeta.com/articles'
}
#...
headers是一个dict数据结构,你可以放入任何想要的header,来做一些伪装。
例如,有些网站喜欢读取header中的X-Forwarded-For来看看人家的真实IP,可以直接把X-Forwarde-For改了。
参考
Python2中的urllib、urllib2与Python3中的urllib以及第三方模块requests
深入理解urllib、urllib2及requests
urllib与urllib2的学习总结(python2.7.X)
网络爬虫(二):利用urllib2通过指定的URL抓取网页内容
[Python网络爬虫(五):urllib2的使用细节与抓站技巧]