第二课:urllib库

139 阅读7分钟

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)