“Urllib”的版本间的差异
跳到导航
跳到搜索
docker>Evan (创建页面,内容为“<pre> Python2中的urllib、urllib2与Python3中的urllib以及第三方模块requests 先说说Python2中的url与urllib2(参考此处): 在python2中,u...”) |
小 (导入1个版本) |
2019年10月14日 (一) 13:55的版本
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的使用细节与抓站技巧]