urllib库--内置
1.urlopen函数——网络请求
创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据
- url:请求的url。
- data:请求的data,如果设置了这个值,那么将变成post请求。
- 返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines以及getcode等方法。
from urllib import request
resp = request.urlopen("https://www.baidu.com")
print(resp) # <http.client.HTTPResponse object at 0x000001DB58F87C10>
# 以下读取的是源代码
print(resp.read()) #读取全部
print(resp.read(2)) #读取指定数量
print(resp.readline()) #读取一行
print(resp.readlines()) # 读取多行
print(resp.getcode()) # 获取状态码 200
2.urlretrieve函数——数据保存方式
该函数可以很方便的将网页上的一个文件保存到本地
request.urlretrieve(url, 带后缀的文件名)
from urllib import request
request.urlretrieve("https://www.sogou.com", 'sogao.html')
3.urlencode函数编码
urlencode 可以把字典数据转换为url编码的数据
from urllib import parse
data = {"name":"石原里美", "age":18, "greet":"hello world"}
#编码
qs = parse.urlencode(data)
print(qs) # name=%E7%9F%B3%E5%8E%9F%E9%87%8C%E7%BE%8E&age=18&greet=hello+world
```
# urlencode 只能编码字典类型的,quote可以编码字符串类型的
a = "石原里美"
b = parse.quote(a)
print(b)
4.parse_qs函数解码
from urllib import parse
data = {"name":"石原里美", "age":18, "greet":"hello world"}
#编码
qs = parse.urlencode(data)
print(qs) # name=%E7%9F%B3%E5%8E%9F%E9%87%8C%E7%BE%8E&age=18&greet=hello+world
# 解码
print(parse.parse_qs(qs))
5.urlparse和urlsplit函数:解析url
urlparse和urlsplit两者唯一的区别就是urlsplit没有parems这个选项
from urllib import parse
url = "http://www.baidu.com/index.html;user?id=S#comment"
result = parse.urlparse(url)
# ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=S', fragment='comment')
print(result)
print(result.scheme)
print(result.netloc)
print(result.path)
result2 = parse.urlsplit(url)
# SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='id=S', fragment='comment')
print(result2)
6.request.Request类,增加请求头
百度爬取数据实战演示 网络请求中,报错403,表示服务器已经接收到我们的请求,但是不给予处理,这个时候可以添加请求头来解决 User-Agent
from urllib import request
# 请求头是字典格式
headers = \
{
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.63"
}
# 添加请求头
rq = request.Request("https://www.baidu.com", headers = headers)
# 网络请求
resp = request.urlopen(rq)
print(resp.read())
7.课后作业
爬取www.biedoul.com, 并且爬出多页内容
from urllib import request
from urllib import parse
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
}
url = "https://www.biedoul.com/"
result = request.Request(url, headers=headers)
resp = request.urlopen(url)
# print(resp.read())
# 爬取多页:https://www.biedoul.com/index/8308/,可以通过循环字符串拼接url
basicUrl = "https://www.biedoul.com/index/"
data = [8308, 8309, 8310, 8311]
for i in data:
tempUrl = basicUrl + str(i)
print(request.urlopen(tempUrl).read())
8.ProxyHander处理器(代理设置):IP问题
- 问题:在我们日常访问服务器的时候,服务器检查到我们是非正常活动,便会禁止我们的IP访问,这个时候就需要用到代理IP。
- 代理原理:在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目的网站的数据后,再转发给我们的代码。
- httpbin.ort: 这个网站可以方便的查看http请求的一些参数
- 代码示例如下:
from urllib import request
# 没有使用代理
# url = "http://httpbin.org/ip"
# resp = request.urlopen(url)
# print(resp.read())
# 使用代理
url = "http://httpbin.org/ip"
# 1.使用proxyHandler,传入代理构建一个handler
handler = request.ProxyHandler({"http":"122.193.244.243:9999"})
# 2.使用handler构建一个opener
opener = request.build_opener(handler)
# 3.使用opener去发送一个请求
resp = opener.open(url)
print(resp)
9.cookie:登录
- 1.什么是cookie:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据
- 2.cookie的格式:
Set-Cookie: NAME=VALUE;Expires/Max-age=DATE;Path=PATH; Domain=DOMAIN_NAME;SECURE
参数的意义- NAME:cookie的名字
- VALUE:cookie的值
- Expires:cookie的过期时间
- Path:cookie作用的路径
- Domain:cookie作用的域名
- SECURE:是否只在https协议下起作用
10.实战项目:通过cookie实现代码自动登录知乎网站
from urllib import request
# 需求:实现代码通过cookie自动登录
url = "https://www.zhihu.com/hot"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36",
"cookie":"_zap=55c6bbff-12a6-481c-aaaf-4a6ef92d6e2a; d_c0=ABBZcmpkuhaPTkDQhxraVy9T9_h4v9rWOVo=|1683245694; "
"YD00517437729195%3AWM_TID=5o5OKdEqsahAAQEUAFPUhVZIftX4sokx; YD00517437729195%3AWM_NI=Z1hY21Vv6eJa6d06"
"7DNcteVYrzweBIkBfy2XYd2r9F9JsHG4CVr2Dm2roBQ%2BZP53lsrfHu%2F9RR8XXxnSCtg8HQCkykAmK5P%2F0XC5OzY6VSvj976Es"
"VFGi3gxB69EFu5ZeXE%3D; YD00517437729195%3AWM_NIKE=9ca17ae2e6ffcda170e2e6ee82d1549be7a485b74d859e8eb2c44f"
"839e8aacd13b86a881b0b764ad90fbd5ed2af0fea7c3b92a9aefa8bab13b96aafa86c96bf6bc00d7b6508ebdbc86d553b2a6b986"
"c143a99eaa9ab1549bbcfe93bc4efb96bda9c640818abed3c767f2aea1a3d4219a90fbd4ef79b2ba8896ae33928ef8b9db74ae8d"
"8d95e6348c8f8d8cfc6183b385d6d325f4888dd6ce729bea9ab4f562fbe9faa6f25e8699a7d4e67482eaf7a6c57ff786abb9c837"
"e2a3; z_c0=2|1:0|10:1684222870|4:z_c0|92:Mi4xd05iUExRQUFBQUFBRUZseWFtUzZGaGNBQUFCZ0FsVk43SUJRWlFBX0FEMmV"
"idk1PWFJ2ZHJrUDhEOEg0Rm9iczZn|7d8d4c171c62ac45778469b54432fdbffb46892485b2707cc64766d7f4363c9d; captcha"
"_session_v2=2|1:0|10:1684222952|18:captcha_session_v2|88:YmZQQ2trRHh5RXRGbVFGOHFoNXljSEpmdVlxTGx3aDJ2bXB"
"IVUZRclpxS2pTbFgxWXFYbmhSR2dFYUkybzI5Sw==|9ac04bc84721f8f816f1f298a74b67ae07e868bd65a3e230098ed5298b0534"
"cc; q_c1=2a84f5b622944efbb326c1eebfd36656|1684223094000|1684223094000; gdxidpyhxdE=oQ%2FPAhQiaOCoRn%5Cd5"
"1SHWS3%2F1GcYeGJAwiGKtWQo4VYE82P%5CAY%2B33y6v03ZywPYjGUYPv0iHrxPEITnShzl%2BMaub%2F3M7KYpopgLvcUv0kPCmzER"
"iUIcDKD%2F3%5CHec651qJb2de6UmX36WwRC%2BNzHwsB2kkhwac6376%5CtKAs6gVTMNP2fI%3A1684224985733; _xsrf=4fdbe30"
"8-6d55-4dcb-9ccd-bc03d1f5bbcc; tst=h; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1684222400,1684224254,1684"
"381615,1684554190; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1684554190; SESSIONID=jCXYrDDiDwe1kYlCwNGWbq"
"bcpMtqkbr2vdhLJ6D2Rcc; KLBRSID=3d7feb8a094c905a519e532f6843365f|1684554190|1684554187; JOID=U14SAkhUc8WD"
"OedaCVRmmprYVpsZOTGb2EmkH2YSA6G0ULwxS5w1qec84V0N1cX3dCClRg5FS8xUL6xLMAcdh90=; osd=VF0dAE9TcMqBPuBZBlZhnZ"
"nXVJweOj6Z306nEGQVBKK7Urs2SJM3ruA_7l8K0sb4dieiRQFHTMtXIK5MNwQShdo="
}
qs = request.Request(url, headers = headers)
resp = request.urlopen(qs)
print(resp.read().decode("utf-8"))
11.实战项目:用http:cookiejar模块实现网站模拟登录
- cookieJar: 管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
- FileCookieJar: 从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
- MozillaCookieJar: 从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
- LWPCookieJar: 从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。
代码示例
from urllib import request
from urllib import parse
from http.cookiejar import CookieJar
# 登录跳转的连接:该网址在开头为login.php...文件里面:https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F
# 个人网页:https://i.meishi.cc/cook.php?id=13686422
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
# 1.登录
#1_1.创建cookiejar对象
cookiejar = CookieJar()
#1.2、使用cookiejar对象创建一个HTTPCookieProcess对象
handler = request.HTTPCookieProcessor(cookiejar)
#1.3、使用handler创建一个opener
opener = request.build_opener(handler)
#1.4、使用opener发送登录请求
post_url= "https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F"
post_data = parse.urlencode({
"username":"1194707433@qq.com",
"password":"zhangjing1234"
})
# 2.发送一个请求
req = request.Request(post_url, post_data)
opener.open(req)
# 3.访问个人网页
url = "https://i.meishi.cc/cook.php?id=13686422"
rq = request.urlopen(url, headers = headers)
resp = rq.open(rq)
print(resp.read().decode("utf-8"))
12.cookiejar保存与加载
from urllib import request
from http.cookiejar import MozillaCookieJar
# 保存cookie
# 1.创建MozillaCookieJar对象
cookiejar = MozillaCookieJar("cookie.txt")
# 2.创建handler对象
handler = request.HTTPCookieProcessor(cookiejar)
# 3.创建opener
opener = request.build_opener(handler)
# 4.打开特定的网址,http://httpbin.org/ 这个网址下设置Cookie值,得到的那个网址。
resp = opener.open("http://httpbin.org/cookies/set/hhh/hihihi")
# 5.保存cookie ignore_discard: cookie即将过期时,可以保存;ignore_expires已经过期,可以保存
cookiejar.save(ignore_discard=True, ignore_expires=True)
# 加载
# 1.创建MozillaCookieJar对象
cookiejar = MozillaCookieJar("cookie.txt")
# 2.加载
cookiejar.load()
# 2.创建handler对象
handler = request.HTTPCookieProcessor(cookiejar)
# 3.创建opener
opener = request.build_opener(handler)
# 4.打开特定的网址,http://httpbin.org/ 这个网址下设置Cookie值,得到的那个网址。
resp = opener.open("http://httpbin.org/cookies/set/hhh/hihihi")
# 5.保存cookie ignore_discard: cookie即将过期时,可以保存;ignore_expires已经过期,可以保存
cookiejar.save(ignore_discard=True, ignore_expires=True)