python爬虫网络请求超时_Python爬虫入门 :扩展知识点(超时设置、HTTP协议请求实战:)...

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于腾讯云 作者:py3study

( 想要学习Python?Python学习交流群:1039649593,满足你的需求,资料都已经上传群文件流,可以自行下载!还有海量最新2020python学习资料。 )

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80OTM0NTU5MA==,size_16,color_FFFFFF,t_70#pic_center

超时设置

有时候访问网页时长时间未响应,系统就会判断网页超时,无法打开网页。如果需要自己设置超时时间则:

通过urlopen()打开网页时使用timeout字段设置importurllib.requestfor i in range(1,100): #循环99次

try:

file= urllib.request.urlopen("http://yum.iqianyue.com",timeout=0.1) #设置超时时间为0.1s

data=file.read()print(len(data))exceptException as e:print("出现异常:"+str(e))#网站服务器性能不好的时候可能出现异常

一般我们不想出现超时异常就可以把时间设置长一点如:30。

HTTP协议请求实战:

在客户端和服务器端之间消息传递可以使用http协议请求进行

http六种类型:

get请求:通过url地址传递信息。

post请求:可以向服务器提交数据,比较主流比较安全。

put请求:请求服务器存储一个资源,通常要指定存储的位置。

head请求:请求获取报头信息。

delete请求:请求服务器删除一个资源。

options请求:获取当前url所支持的请求类型。

一般使用get和post较多只介绍这两种:

get请求:

例如我们想在百度上查询一个关键词,如何用爬虫进行处理呢?

步骤:首先我们打开百度输入关键词如“xpath”之后回车,我们观察一下url的变化:

https://www.baidu.com/s?wd=xpath&rsv_spt=1&rsv_iqid=0xdb261ac900003e2f&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_n=2&rsv_sug3=1

我们分析一下:字段wd是我们查询的值,也就是说wd就是存储用户要检索的关键词

我们简化下网址 “https://www.baidu.com/s?wd=关键词”

这时我们把https://www.baidu.com/s?wd=xpath 也加入浏览器刷新一下,也能出现关键词,这说明我们在百度上查询关键词会用get请求进行。

接着我们实现

importurllib.request

keywd= "xpath"url= "http://www.baidu.com/s?wd=" +keywd

req=urllib.request.Request(url)

data=urllib.request.urlopen(req).read()

fhandle= open("D:/crawler/6.html", "wb")

fhandle.write(data)

fhandle.close()

如果要检索的关键词是中文,则要对上述代码进行优化:

importurllib.request

keywd= "xpath"keywd="杨守鹤"url= "http://www.baidu.com/s?wd=" #注意不是https

key_code=urllib.request.quote(keywd)#这里对关键词部分进行编码

url_all=url+key_code

req= urllib.request.Request(url_all)#通过url参数构建Request对象

data= urllib.request.urlopen(req).read()#通过urlopen打开构建的Request对象

fhandle= open("D:/crawler/7.html", "wb")

fhandle.write(data)

fhandle.close()

这里我们学习到满足get请求的url格式:“http://网址?字段名1=字段内容1&字段名2=字段内容2 …”

post请求

我们在进行注册登录的时候时常用到post请求

我们先打开一个网页:http://www.iqianyue.com/mypost/

输入数据提交后会显示信息。

如何使用爬虫自动实现呢?

步骤:

首先设置url地址,我们分析一下,在点击了提交之后会传递到当前页面进行处理,所以处理的页面应该是:

http://www.iqianyue.com/mypost/,我们设为url。之后我们在网页右击选择查看页面源代码,找到对应的form表单部分

,进行分析。

name:
passwd:

我们看到属性值

我们使用字典形式 格式:{字段名1:字段值1,字段名2:字段值2…}

如:{"name":"yang","pass":"a123456"}

之后我们还要对数据进行编码处理:使用urllib.parse.urlencode

然后创建Request对象传入url和数据,接着我们可以使用之前学过的add_header()添加头信息,模拟浏览器爬取。之后就按以往进行处理即可。

importurllib.requestimporturllib.parse

url= "http://www.iqianyue.com/mypost/"postdata=urllib.parse.urlencode({"name":"yang","pass":"a123456"}).encode('utf-8')#将编码设置为utf-8

req=urllib.request.Request(url,postdata)

req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')

data=urllib.request.urlopen(req).read()

fhandle= open("D:/crawler/8.html", "wb")

fhandle.write(data)

fhandle.close()

代理服务器设置

有时候使用同一个ip去爬取同一个网站,久了就会被对方服务器屏蔽,怎么办??

这时我们就要使用一招:“瞒天过海、暗度陈仓”,也就是使用代理服务器。

这里有一个网址:http://yum.iqianyue.com/proxy 里面有更新很多代理ip

我们选择一个: 格式:"网址:端口号"即:110.52.235.249:9999

#实现使用代理服务器爬取url网页功能

defuse_proxy(proxy_addr,url):importurllib.request

proxy=urllib.request.ProxyHandler({'http':proxy_addr})

opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)

urllib.request.install_opener(opener)

data=urllib.request.urlopen(url).read().decode('utf-8')returndata

proxy_addr="58.219.8.8:1080"data=use_proxy(proxy_addr,"http://www.baidu.com")#传递ip和要爬取的url

print(len(data))#//后续处理

如果:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。>

说明IP可能失效了,要换一个试试,实际上我们可以实现多个ip用程序实现一个不行自动切换为下一个。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值