python urllib2_python中urllib和urllib2库的使用

请求与响应

d340eb649150

request,response:

d340eb649150

http协议解析网页过程

爬虫爬取信息的过程实质上是一个请求与相应的模型,即:

建立连接,发出请求信息,回送响应信息,关闭连接

python中的urllib,urllib2库中可以实现http功能,urllib2为主

那么接下来,我们可以尝试一下用python实现一下http协议过程:

import urllib2

request = urllib2.Request('http://www.zhihu.com')

response = urllib2.urlopen(request)

html = response.read()

print html

这是一段获取知乎网站html信息的代码,

d340eb649150

咦,是不是发现哪里不对劲,出现了乱码……

没有关系,需要做的就是要decode一下:

html = response.read().decode('utf-8')

d340eb649150

看,一个简单的http过程就好了。

当然,在这一个过程中,主要是用到了Get请求,即从服务器端获取数据,但是我们知道,除了Get请求,还有一种请求是Post请求,就好比client和Server端在恋爱,有所获得也要有所付出,这样关系才更为牢靠,当然这不是绝对的,在这里只是打了一个比方,帮助更好理解。

来看一下下面的例子:

import urllib2

import urllib

url = 'http://www.zhihu.com/login'

postdata = {'username':'frank'

'password':'123456'

}

data = urllib.urlencode(postdata)#编码用到了urllib库,为了使urllib2能看懂

request = urllib2.Request(url,data)#在request过程中实现了post过程,把用户名和密码传过去

response.urllib2.urlopen(request)

html = response.read()

print html

可是,站在Server端考虑,我希望我的用户是用户的正常访问,即通过浏览器正常访问,而不是程序强行刚入,所以大部分网站服务器都会检查请求头,所以嘛,我们需要伪装一下,就像使看特工影视剧,我们要潜伏之前,都要有一个身份,这样才能够方便我们通过检验。于是乎,就有了

headers处理

其实做法也很简单:

user_agent = 'Mozilla/4.0 (compatible;MSIE 5.5;Windows NT)'

然后在

request = urllib2.Request(url, data,user_agent)

这里是举一个例子,很多地方是这样写,

headers = {‘user_agent’:user_agent,'Referer':referer}

user_agent和Referer的定义写在前面

还有另外一种,就是用add_header方法

request = urllib2.Request(url)

request.add_header('User-Agent',user_agent)

cookie处理

d340eb649150

我对cookie的理解并不深刻,所以从网上找到了一种解释:

d340eb649150

由此我们可以看出cookie的作用,鉴于此:

import urllib2

import cookielib

cookie = cookielib.CookieJar()

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))

response = opener.open('http://www.zhihu.com')

for item in cookie:

print item.name+':'+item.value

之后还需要设置time超时,就像我们等人不能一直等,需要有一个时间限制一样

只需要在urlopen(request,timeout=3)

在一些情况下,我们可能还需要用到HTTP响应码来判断,以及当返回的是HTTP3XX时候,要进行重定向操作

最后一部分要强调的是代理服务:

为啥要用代理,Server也不傻,一个地方频繁的多次不合理的访问,人家肯定就会注意到了,所以我们要伪装一下。

import urllib2

proxy = urllib2.ProxyHandler({'http':'127.0.0.1:8087'})

opener = urllib2.build_opener([proxy,])

urllib2.install_opener(opener)

response =opener.open('http://www.zhihu.com/')

print response.read()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值