概述
简介
urllib模块库是python自带的
注意事项
url中附带中文记得转码
POST请求的参数需要放到Request请求对象中
urlopen
urlopen
urlopen()是一个特殊的opener,传入的参数仅仅是url,data,timeout
from urllib.request import urlopen
resp = urlopen(url,data,timeout)
url:
data【可选】:传送的数据,默认为空None
timeout【可选】:设置超时时间,默认为socket._GLOBAL_DEFAULT_TIMEOUT
返回对象:响应对象
build_opener
urlopen()方法不支持代理、cookie等其他的HTTP/HTTPS高级功能,我们需要创建更一般的opener
from urllib.request import build_opener
resp = build_opener(handler).open(req)
handler【可选】:创建特定功能的处理器对象,如代理处理器:handler = ProxyHandler({'xxx'})
req:Request对象
响应对象
read():读取文件里的全部内容,返回bytes类型
getcode():返回 HTTP的响应码
geturl():返回实际数据的实际URL
info():返回服务器响应的HTTP报头
Request
Request
from urllib.request import Request
request = Request(url,data=xxx,headers=xxx)
url:
headers:请求头信息,如headers1 = {'User-Agent':'xxx'}
data:请求数据,data是一个字典,里面要匹配键值对,如:data1 = {'key1': 'value1','key2': 'value2'}
headers
User-Agent 客户机通过这个头告诉服务器客户机的软件环境
Accept 告诉服务器,客户端支持的数据类型
Accept-Charset 告诉服务器,客户端采用的编码
Accept-Encoding 告诉服务器,客户机支持的数据压缩格式
Accept-Language 告诉服务器,客户机的语言环境
Host 客户机通过这个头告诉服务器,想访问的主机名
If-Modified-Since 客户机通过这个头告诉服务器,资源的缓存时间
Referer 客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的。(一般用于防盗链)
Cookie 客户机通过这个头告诉服务器,可以向服务器带数据
Refresh 服务器通过这个头,告诉浏览器隔多长时间刷新一次
Content-Type 服务器通过这个头,回送数据的类型
Content-Language 服务器通过这个头,告诉服务器的语言环境
Server 服务器通过这个头,告诉浏览器服务器的类型
Content-Encoding 服务器通过这个头,告诉浏览器数据采用的压缩格式
Content-Length 服务器通过这个头,告诉浏览器回送数据的长度
中文转码
转换一个值
from urllib.parse import quote
url = f'https://www.baidu.com/s?wd={quote('中文')}'
转换键值对
from urllib.parse import urlencode
parms ={'wd':'中文'}
url = f'http://www.baidu.com/s?{urlencode(parms)}'
请求SSL证书验证
SSL证书:https开头的网站,如果网站的SSL证书是经过CA认证的,则能够正常访问
urllib可以为 HTTPS 请求验证SSL证书,就像web浏览器一样
忽略SSL安全认证
import ssl
context = ssl._create_unverified_context() # 忽略SSL安全认证
response = urlopen(request, context = context) # 添加到context参数里
伪造User-Agent
注意:fake-useragent在创建对象时,可能创建不了,多部分原因为服务器访问不到的原因
解决方案:拷贝fake-useragent_version.json 的配置文件到用户目录C:\Users\Feel\AppData\Local\Temp
pip install fake-useragent
from fake_useragent import UserAgent
headers = {'User-Agent':UserAgent()chrome}
Cookie
使用cookie
headers = {'Cookie':'xxx'}
保持cookie
from urllib.request import HTTPCookieProcessor
handler = HTTPCookieProcessor()
resp = build_opener(handler).open(req)
捕获cookie
from http.cookiejar import MozillaCookieJar
cookie_jar = MozillaCookieJar()
handler = HTTPCookieProcessor(cookie_jar)
resp = build_opener(handler).open(req)
cookie_jar.save('cookie.txt',ignore_discard=True,ignore_expires=True) #保存cookie到cookie.txt中
使用捕获的cookie
cookie_jar = MozillaCookieJar()
cookie_jar.load('cookie.txt',ignore_discard=True,ignore_expires=True)
handler = HTTPCookieProcessor(cookie_jar)
代理ip
from urllib.request import ProxyHandler
handler = ProxyHandler({'http':'http://398707160:[email protected]:16816'}) # 构建一个可以使用代理的控制器
resp = build_opener(handler).open(req)