Urllib

来自linux中国网wiki
跳到导航 跳到搜索
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的使用细节与抓站技巧]