使用urllib的request模块

一:urlopen

最基本的构造HTTP请求的方法。

from urllib import request
response=urllib.request.urlopen('http://www.python.org')
print(response.read().decode('utf-8'))

note:

1:urllib.request.urlopen返回的是一个<class 'http.client.HTTPResponse'>,read()之后是<class 'bytes'>。decode()之后是<class 'str'>

2:urlopen返回一个HTTPResponse类型的对象,包含:read(),readinto(),getheader(name),getheaders(),fileno()等方法,msg,version,status,reason,debuglevel,closed等属性。

3:url参数的API:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

二:Request

Resquest是request模块中的一个类,可以实现在请求中加入headers等信息。

from urllib import request
request=request.Request('http;//python.org')
response=urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

note:

1:我们依然用urlopen()方法来发送请求,只不过这次我们不直接把url作为参数,而是一个Resquest的对象。作用;把请求独立成一个对象,丰富灵活地配置参数。

2:Resquest的参数列表:

class urllib.request.Request ( ur1, data=None, headers={}, origin_req_host=None, unverifiable=False, method =None)

3;

下面我们用四个参数构造了一个请求,url即URL,headers中指定了User-Agent和Host,参数data用urlencode()和bytes()方法转换成字节流。(和read(),decode()正好反过来)还指定了请求方法为POST。

from urllib import request,parse
url='http://httpbin.org/post'
headers={
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
    'Host':'httpbin.org'
}
dict={
    'name':'lingxiaoyun'
}
data=bytes(parse.urlencode(dict),encoding='utf-8')
req=request.Request(url=url,data=data,headers=headers,method='POST')
response=request.urlopen(req)
print(response.read().decode('utf-8'))



输出:
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "name": "lingxiaoyun"
  },
  "headers": {
    "Accept-Encoding": "identity",
    "Content-Length": "16",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
    "X-Amzn-Trace-Id": "Root=1-5e632f08-460bfac8eda3a85c06b9b917"
  },
  "json": null,
  "origin": "119.134.98.185",
  "url": "http://httpbin.org/post"
}

三:request模块的高级用法。

request模块里有一个BaseHandler类,这个类有很多Handler子类,它的这些子类Handler是各种各样的“处理器”,有专门处理Cookies登录验证的,也有专门处理代理设置的。

HITPDefaultErrorHandler :用于处理HTTP 响应错误,错误都会抛出HTTP Error 类型的异常。
HTTPRedirectHandler :用于处理重定向。
HTTPCookieProcessor : 用于处理Coo kies 。
ProxyHandler :用于设置代理, 默认代理为空。
HπPPasswordMgr :用于管理密码,它维护了用户名和密码的表。
HTTPBasicAuthHandler : 用于管理认证,如果一个链接打开时需要认证,那么可以用它来解
决认证问题。
另外,还有其他的Handler 类,这里就不一一列举了,详情可以参考官方文档: htφs:// docs.python .
org/3/library/urllib.request.html#urllib.request.BaseHandler。

要使用上面这些handler来处理相关的事情,我们要使用一个OpenerDirector类,简称opener。我们把handler作为参数构建一个opener,再使用opener的open()方法(open()方法返回的结果类型和urlopen()一样)。简而言之,就是利用handler来构建opener,再利用open()来请求html。

例子1:验证

from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError
username='这里放用户名'
password='这里填密码'
url='这里放购物车的url(要登录才能进的网址)'
p=HTTPPasswordMgrWithDefaultRealm()#创建一个HTTPPasswordMgrWithDefaultRealm对象
p.add_password(None,url,username,password)#给这个对象添加用户名和密码
auth_handler=HTTPBasicAuthHandler(p)#创建一个HTTPBasicAuthHandler实例,参数为HTTPPasswordMgrWithDefaultRealm对象
opener=build_opener(auth_handler)#构建一个opener

try:
    result=opener.open(url)
    html=result.read().decode('utf-8', errors='ignore')
    print(html)
except URLError as e:
    print(e.reason)

例子2:代理

from urllib.error import URLError
from urllib.request import ProxyHandler,build_opener

proxy_handler=ProxyHandler(
    {
        'http':'http://70.165.64.33:48678',
        'https':'https://70.165.64.33:48678'
    }
)
opener=build_opener(proxy_handler)
try:
    response=opener.open('https://www.baidu.com')
    print(response.read().decode('utf-8'))
except URLError as e:
    print(e.reason)

构建好handler,然后创建opener,然后open。

可以在这个网址找到你想要的代理:https://ip.ihuan.me/

例子3:cookies

首先:如何获取网站的cookies:

from http import cookiejar
from urllib import request
cookie=cookiejar.CookieJar()#先创建一个CookieJar对象
handler=request.HTTPCookieProcessor(cookie)#构建handler
opener=request.build_opener(handler)#构建opener
response=opener.open('http://www.baidu.com')
for item in cookie:
    print(item.name+'='+item.value)

我们也可以输出成一个文件:

#生成一个存有cookie的文件txt
filename='cookies.txt'
cookie=cookiejar.MozillaCookieJar(filename)
handler=request.HTTPCookieProcessor(cookie)
opener=request.build_opener(handler)
response=opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True)

这时候CookieJar就需要换成MozillaCookieJar,它在生成文件时会用到,属于CookieJar的子类,可以处理和cookies相关的事情,比如读取和保存cookies,可以将cookies保存成Mozilla型浏览器的Cookies格式。

也可以生成一个cookies样式为LWP的文件,在创建cookiejar时改为:

 cookie=cookiejar.LWPCookieJar(filename)

从文件中读取并利用cookies:

cookie=cookiejar.LWPCookieJar()
cookie.load('cookies.txt',ignore_discard=True,ignore_expires=True)
handler=request.HTTPCookieProcessor(cookie)
opener=request.build_opener(handler)
response=opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))

上面使用了LWPCookieJar,前提是已经生成了一个LWOCookieJar格式的cookies。

当然也可以:

cookie=cookiejar.MozillaCookieJar()

前提也是已经在程序相同的文件夹里有一个对应类型的cookies文件。

发布了55 篇原创文章 · 获赞 36 · 访问量 1522

猜你喜欢

转载自blog.csdn.net/weixin_45850939/article/details/104713085