我爬爬爬虫(1)-初识urllib模块

urllib库的使用


request.urlopen()函数

urlopen(url)可以发送请求,也可以加上data,timeout等参数。

response=request.urlopen(url)

timeout参数

设置timeout参数,如果响应时间超过timeout,则抛出异常。

response=request.urlopen(request,timeout=1)

这里设置timeout值为1,超过1s,就会抛出异常URLError,属于urllib.error模块。
我们可以用socket模块来判断异常类型。

request.Request()函数

Request()函数可以把请求实例化,这样配置相关参数更加灵活。

request=request.Request(url)
response=request.urlopen(request)

这里看到urlopen()函数的参数可以是url,也可以是request.

data参数

可以在请求中加入data参数,则传入方式应为post.
data={'name':'hello'}这里data是一个字典,可以用

str=urllib.parse.urlencode(data)

将其转换成字符串,然后

data_bytes=bytes(str,encoding='utf-8')

将其转换成bytes(字节流)类型。
这样可以将其加入到请求中一起发送给服务器

response=resquest.urlopen(url,data=data_bytes)

headers参数

headers参数也是个字典,包括
User-Agent 浏览器版本,我们配置它达到伪装成浏览器的目的。
host 服务器IP

method参数

method参数是一个字符串,表示请求的方法,比如get,put,post等。
get仅仅获得页面信息,如需传值,需显式的写在url里,故不安全。
post可以通过表单传值,不会显示在url里,故较安全。

代码实现


from urllib import request,parse,error
import socket
data={'name':'hello'}
str=parse.urlencode(data)
data_bytes=bytes(str,encoding='utf8')
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
    'Host':'httpbin.org'
}
url='https://httpbin.org/post'

req=request.Request(url,data=data_bytes,headers=headers,method='POST')
try:
    response=request.urlopen(req,timeout=1)
    print(response.read().decode('utf-8'))
except error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print('time out!')

这里写图片描述
试着把timeout的值调成0.1,一般来说0.1s这么短的时间是完不成响应的,所以会抛出超时异常。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_18831501/article/details/80315669