最基本的构造HTTP请求的方法。
from urllib import request
response=urllib.request.urlopen('http://www.python.org')
print(response.read().decode('utf-8'))
note:
1:urllib.request.urlopen返回的是一个
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)
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模块里有一个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。
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)
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/
首先:如何获取网站的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文件。