原文出处: 崔庆才的博客(@崔庆才丨静觅)
1.设置Headers
有些网站,不会同意程序,以上面那种方式,去进行访问,要是识别存在问题,那么站点,根本就不会响应,所以,为了完全模拟浏览器的工作,我们,需要设置一些Headers的属性。
首先,开启我们所用의浏览器,调试浏览器时按下F12,我使用의是Chrome,开启网络监听,情况如下示,比方说知乎,点击登录之后啦,我们会发觉登录之后界面已然变化,出现一个全新의界面,实际上这个网页包含了数目众多의内容,这些内容并非一次性就加载完成되,实际上是执行了好多轮请求,通常是首先请求HTML文件,之后加载JS、CSS等等,历经多次请求之后,网页의骨架与肌肉齐全了,整个网页의效果就呈现出来了。
对这些需求进行拆分,我们仅仅去审看那首项需求,你能够瞧见,存在一个请求统一资源定位符,并且还有消息包首部,紧接着的便是响应,图像呈现得并不完整,各位小伙伴能够亲自去做一下试验。如此这般,这个首部之中涵盖了特别多非常多的信息啦,有文件编码呀,解压缩办法啊,提出申请的服务者啦等诸如此类。
当中,agent即为请求的身份,要是未写入请求身份,那么服务器不见得会去响应,故而能够于headers里设置agent,比如下面的实例,此实例仅仅阐明了怎样予以设置的headers,小伙伴们瞧瞧设置格式便行。
import urllib
import urllib2
链接地址等于这个,那是用于连接服务器的网址,网址详细到具体页面,是登录页面的专用网址,其形式为,由http开头,接着是冒号双。
user_agent等于,‘Mozilla/4.0 (兼容的;MSIE 5.5;Windows NT)’ 。
values等于这个大括号,大括号里面有这样的内容,‘username’对应着‘cqc’,‘password’对应着‘XXXX’ 。
将冒号左侧的内容包起来作为一个变量名,把冒号右侧的内容包起来作为另外一个变量名,此处是将名为单一引号起始User-Agent单一引号结束的内容包起来作为。
资料等于,通过urllib,转格式编码变量值后的的结果,。
把“request”设定为,经由“urllib2”里的“Request”,这个东西要基于“url”、“data”以及“headers”这些来进行创建 。
首先,把urllib2里的urlopen方法拿来,用它去执行request这个请求,然后将得到的结果赋值给response 。
page = response . read ( )
如此这般,我们设定了一个headers,并于构建request之际将其传入,在进行请求的过程当中,此headers就会被加入继而完成传送,倘若服务器能够识别这是源于浏览器所发出的请求,那么便会获取到响应。
此外,我们存在应对 “反盗链” 的举措。对于防盗链,服务器会判别 headers里边的referer否为自身,若不是,部分服务器不会予以响应,因而我们还能够于headers之中添加referer 。
例如我们可以构建下面的headers
把这句话拆分成两个小分句:headers等于{‘User - Agent’,‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)’}, , 。 (这里原句最后有一个多余的逗号,推测可能是输入错误,在拆分时纠正了标点使用的不合理性,使其符合正常句子结构。) 但需注意,原句结构。
参照者,指向:“http://www.zhihu.com/articles” ,此为一种标识。 }。
按照上面那种方式,于传送请求之际,将head ers放进Request参数当中,如此这般便能够应对防盗链的情况了。
另外headers的一些属性,下面的需要特别注意一下:
有些服务器会依据该值判断是否为浏览器发出的请求,有些Proxy也会凭借此值来做这样的判断 。
使用 REST 接口时,服务器会进行检查,检查该值,通过检查该值来确定 HTTP Body 中的内容该如何解析,Content-Type 就是这个值 。
application/xml,于XML RPC之时,像RESTful/SOAP调用这一情形底下予以使用,。
application/json,其在用于JSON RPC调用之际予以使用 。
将浏览器提交Web表单时所使用的格式设为application/x-www-form-urlencoded , 。
当运用服务器所提供的 RESTful 或 SOAP 服务之际,若 Content-Type 设置出了差错,那么便会致使服务器对服务予以拒绝 。
别的,有必要的话是能够审查浏览器的headers这个内容的,在进行构建的时候,写入相同的数据就行。
2. Proxy(代理)的设置
urllib2 会依照环境变量 http_proxy 来对 HTTP Proxy 进行默认设置。假设有一个网站,它能够检测某段时间内某个 IP 的访问次数,要是访次过多,就会禁止访问。因而可以设置一些代理服务器来予以协助,每隔一段时间更换一个代理,如此网站便无从知晓究竟是谁在搞鬼了,这般感觉真够奇特!
下面一段代码说明了 代理 的设置用法

import urllib2
enable_proxy = True
proxy_handler等于urllib2的ProxyHandler,其参数是一个字典,此字典里键为“http”,对应的值是一个字符串,该字符串内容是'http://some - proxy.com:8080' 。
空代理处理器等于 urllib2 的代理处理器,其参数为一个空字典 。
if enable_proxy :
opener等于,由urllib2构建的,调用proxy_handler的,一种打开器工具 。
else :
opener等于,用于构建一个开启器的urllib2,通过null_proxy_handler来构建,。
urllib2 , 使用install_opener 方法 , 第一个参数设置为opener , 调用该方法 。
3.Timeout 设置
在上一节当中,已然讲过了urlopen方法,第三个参数,那便是timeout的设置,能够设置等待多长时间会超时,目的是为了解决某些网站实在响应过于缓慢进而造成的影响。
举例来说,如下这般的代码,要是第二个参数data处于为空的情形,那么就得专门去指定timeout究竟是多少,把形参写清楚,要是data已然被传入,那么就无需进行声明 。
import urllib2
将“response”赋值,通过“urllib2”调用“urlopen”方法,对网址“http://www.baidu.com”进行操作,设置超时时间为“10” 。, 。
import urllib2
把“response”赋值为通过“urllib2.urlopen”,使用的数据和超时时间设置去访问“http://www.baidu.com”所返回的东西,并且超时时间设置为10啊 的结果,分别依次明确给定后,所通过”urllib2.urlopen“得到的返回值 , 。
4.使用 HTTP 的 PUT 和 DELETE 方法
HTTP协议存在六种请求方法,分别为GET、HEAD、PUT、DELETE、POST、OPTIONS,我们有时会要用到PUT方式来进行请求或者用到DELETE方式来进行请求。
PUT:此方法颇为罕见,HTML表单亦不支持它。从本质上来说,PUT与POST极为相像,皆是向服务器发送数据,然而它们之间存在一个关键区别,PUT通常指明了资源的存储位置,而POST却没有,POST的数据存储位置由服务器自行决定 。DELETE:执行删除某一个资源的操作,基本上这也十分少见,不过仍存在一些地方,比如amazon的S3云服务里面就运用这个方法来实施资源删除 。
倘若要运用 HTTP PUT 以及 DELETE ,就只能选用较为底层的 httplib 库。即便这样,我们依旧能够经由下面的方式 ,让 urllib2 发出 PUT 或者 DELETE 的请求,然而使用的次数确实是少之又少,于此提及一下 。
import urllib2
组建一个请求对象,这个请求对象名称是request ,它是通过urllib2模块里的Request函数得到的 ,函数参数里的uri是请求的地址 ,并且还设置了data参数 ,data参数。
进行请求,获取方法,使其等于一个匿名函数,该匿名函数会返回 ’PUT‘ 这个值,或者返回 ’DELETE‘ 这个值且带有注释。
response = urllib2 . urlopen ( request )
5.使用DebugLog
能够借助下面所讲的方式将Debug Log予以开启,如此一来收发包的相关内容便会于屏幕之上进行打印呈现,从而便利调试,这一种方式也并非十分常用,仅仅只是提及一下 。
import urllib2
urllib2里,那包含着特定参数设置的HTTPHandler被创建出来,该特定参数设置为debuglevel等于1,这个被创建出来HTTPHandler被给到,httpHandler这个变量 。
执行httpsHandler的赋值操作,此赋值操作是将urllib2的HTTPSHandler进行创建,创建过程中设置debuglevel为1 。
opener等于,由urllib2构建的,用于启用httpHandler和httpsHandler的,这样一个opener 。
urllib2 . install_opener ( opener )
进行相应操作,通过urllib2,打开网址('http://www.baidu.com'),得到响应,赋值给名为response的变量。
以上这些就是部分高级特性内容了,其中前三个属于重要部分情况。而在往后的内容里,存在着关于cookies的相关合理设置与妥善处理方面的情况,各位小伙伴们加油努力推进呀!