python基础知识整理——urllib2的高级使用

应对反爬的方法:
cookies池,更换cookie意味着更换用户
proxies池,更换proxy意味着更换IP
header中伪装浏览器,加入User-Agent及Referer (这两种是今天学习的)
设置延迟,time.sleep(1)

1.headers头域设置

有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性

有个Request URL,还有headers,那么这个头中包含了许许多多是信息,有文件编码啦,压缩方式啦,请求的agent啦等等。其中,agent就是请求的身份,如果没有写入请求身份,那么服务器不一定会响应,所以可以在headers中设置agent,例如下面的例子,这个例子只是说明了怎样设置的headers,小伙伴们看一下设置格式就好。

这样,我们设置了一个headers,在构建request时传入,在请求时,就加入了headers传送,服务器若识别了是浏览器发来的请求,就会得到响应。

import urllib
import urllib2
url="https://www.zhihu.com/signup?next=%2F"
user_agent="Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"
values={"username":"15901106477","password":"wq12341234"}
headers={"User-Agent":"user_agent"}
date=urllib.urlencode (values)
request=urllib2.Request(url,date,headers)
response=urllib2.urlopen(request)
print response.read()

http://blog.csdn.net/bone_ace/article/details/52476016此网站有各种浏览器版本信息

这样,我们设置了一个headers,在构建request时传入,在请求时,就加入了headers传送,服务器若识别了是浏览器发来的请求,就会得到响应。

referer

另外,我们还有对付”反盗链”的方式,对付防盗链,服务器会识别headers中的referer是不是它自己,如果不是,有的服务器不会响应,所以我们还可以在headers中加入referer

import urllib
import urllib2
url="https://www.zhihu.com/signup?next=%2F"
user_agent="Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"#疑问,对于这个地方,在Linux和windows中都没可使用,那么这个ua的配置规则是什么?
values={"username":"15901106477","password":"wq12341234"}
headers={"User-Agent":"user_agent",
         "Referer":"http://www.zhihu.com/"}
date=urllib.urlencode (values)
request=urllib2.Request(url,date,headers)
response=urllib2.urlopen(request)
print response.read()

referer简介

简言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器 籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

user_agent简介

  • UserAgent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,UserAgent也简称UA。
  • 它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。
  • 通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计,UA可以进行伪装。
  • 浏览器的UA字串的标准格式:浏览器标识(操作系统标识;加密等级标识;浏览器语言)渲染引擎标识版本信息。但各个浏览器有所不同。

字串说明:出于兼容及推广等目的,很多浏览器的标识相同,因此浏览器标识并不能说明浏览器的真实版本,真实版本信息在UA字串尾部可以找到。

加密等级标识

  • N:表示无安全加密
  • I:表示弱安全加密
  • U:表示强安全加密


浏览器语言

  • 在首选项>常规>语言中指定的语言


渲染引擎

  • 显示浏览器使用的主流渲染引擎有:Gecko、WebKit、KHTML、Presto、Trident、Tasman等
  • 格式为:渲染引擎/版本信息


版本信息

  • 显示浏览器的真实版本信息
  • 格式为:浏览器/版本信息

2.proxy代理设置

 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。假如一个网站它会检测某一段时间某个IP 的访问次数,如果访问次数过多,它会禁止你的访问。所以你可以设置一些代理服务器来帮助你做工作,每隔一段时间换一个代理。

一个免费IP示例:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib
import urllib2
#构建两个代理handler,一个有代理ip,一个没有代理ip
httpproxy_handler=urllib2.ProxyHandler({"http":"124.88.67.81:80"})
nullproxy_handler=urllib2.ProxyHandler({})
#定义一个代理开关
proxySwitch=True
#通过urllib2.build_opener()方法使用这些代理handler对象,创建自定义opener对象
#根据代理开关是否打开,使用不同的代理模式
if proxySwitch:
    opener=urllib2.build_opener(httpproxy_handler)
else:
    opener=urllib2.build_opener(nullproxy_handler)
request=urllib2.Request("http://baidu.com/")
#使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理
response=opener.open(request)
# 就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。
# urllib2.install_opener(opener)
#response = urlopen(request)

print response.read()

多个免费免费IP示例:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib
import urllib2
import random
proxy_list = [
    {"http" : "124.88.67.81:80"},
    {"http" : "124.88.67.81:80"},
    {"http" : "124.88.67.81:80"},
    {"http" : "124.88.67.81:80"},
    {"http" : "124.88.67.81:80"}
]
#随机选择一个代理
proxy=random.choice(proxy_list)
#使用选择的代理构建代理处理器对象
httpproxy_handler=urllib2.ProxyHandler(proxy)
opener=urllib2.build_opener(httpproxy_handler)
request=urllib2.Request("http://www.baidu.com/")
response=opener.open(request)
print response.read()

私密代码

上面使用的都是免费代理,不是很稳定,很多时候会出现无法使用的情况,这时候可以考虑使用私密代理。也就是向代理供应商购买代理,供应商会提供一个有效代理,并且有自己的用户名和密码,具体使用和免费代理一样,这是多了一个账户认证,如下:

# 构建具有一个私密代理IP的Handler,其中user为账户,passwd为密码
httpproxy_handler = urllib2.ProxyHandler({"http" : "user:[email protected]:80"})

3.timeout设置

上一节已经说过urlopen方法了,第三个参数就是timeout的设置,可以设置等待多久超时,为了解决一些网站实在响应过慢而造成的影响。

例如下面的代码,如果第二个参数data为空那么要特别指定是timeout是多少,写明形参,如果data已经传入,则不必声明

1

2

import urllib2

response = urllib2.urlopen('http://www.baidu.com', timeout=10)

1

2

import urllib2

response = urllib2.urlopen('http://www.baidu.com',data, 10)

#coding:utf-8
import urllib2
try:
    url = "http://www.baidu.com"
    f = urllib2.urlopen(url, timeout=0) #timeout设置超时的时间
    result = f.read()
    print result
except Exception,e:
    print 'a',str(e)
#输出结果

a <urlopen error [Errno 115] Operation now in progress>

猜你喜欢

转载自my.oschina.net/u/3754854/blog/1623300
今日推荐