【爬虫基础】urllib库

本文详细介绍了Python中的urllib库,包括urlopen、urlretrieve等方法,以及如何处理HTTP代理和Cookie。通过示例展示了如何使用Request类设置请求头,如何利用ProxyHandler进行代理设置,以及如何利用CookieJar管理Cookie进行模拟登录。此外,还提到了Cookie的存储和加载机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

urllib: 自带的库
1.了解urllib库
2.熟悉掌握urllib库
3.熟悉urllib.request,处理cookie 代理设置

urllib

"""
urllib库是python中一个最基本的网络请求库。可以模拟浏览器的行为。
在python3中urllib库中,所有的网络请求相关的方法,都被集到urllib.request模块中
"""

urloppen()

"""
urloppen: 创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据
1.url:请求的url
2.data:请求的data。如果设置了这个值,那么将变成post请求
3.返回值:返回的是一个http.client.HTTPResponse对象,这个对象是一个文件句柄对象
有read(size()) readline() readlines() getcode()等方法
"""
from urllib import request
resp = request.urlopen('https://www.baidu.com/')
print(resp.read())
print(resp.readlens())

urlretrieve()

"""
urlretrieve:这个函数可以方便的将网页上的一个文件保存到本地。以下代码可以非常方便的将百度的首页下载到本地:
"""
from urllib import request
request.urlretrieve('http://www.sogou.com/', 'sogou.html')

urlencode(), quote(), parse_qs()

"""
urlencode: 可以把字典数据转换位url编码的数据
quote(): 对字符串进行编码处理
parse_qs(): 可以将经过编码后的url参数进行解码
"""
from urllib import parse
data = {'name': '爬虫基础', 'greet': 'hello world', 'age': '100'}
qs = parse.urlencode(data)
print(qs)

urlparse(), urlsplit()

"""
urlparse 和 urlsplit:
有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这时候可以使用urlparse和urlsplit
两者唯一不同:
    urlparse中有params熟悉
"""
from urllib import parse
url = 'http://www.baidu.com/index.html;user?id=S#comment'
# result = parse.urlparse(url)
result = parse.urlsplit(url)
print(result)
print(result.scheme)
print(result.netloc)
print(result.path)
print(result.params)

request.Request类

"""
request.Request类:用于网络请求,可以添加请求头
如果想在请求的时候增加一些请求头,那么必须使用request.Request类来实现
比如要增加一个User-Agent
"""
from urllib import request
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
rq = request.Request('https://www.baidu.com', headers=header)
rq = request.urlopen(rq)
print(rq.read())

ProxyHandler()

"""
ProxyHandler处理器(代理设置)
很多网站会检测某一段时间某个IP的访问次数,如果访问次数多的不像正常人,他会禁止这个ip的访问
http://httpbin.org: 查看http请求的一些参数
"""
from urllib import request
# 使用代理
url = 'http://httpbin.org/ip'
# 1.使用ProxyHandler,传入代理构建一个headler
headler = request.ProxyHandler({'http':'42.176.134.184:9999'})
# 2.使用上面创建的handler构建一个opener
opener = request.build_opener(headler)
# 3.使用opener去发送一个请求
res = opener.open(url)
print(res.read())

cookie

"""
cookie:
某些网站为了辨别用户身份,进行session跟踪而储存在用户本地终端上的数据,cookie存储的数据有限,一般不超过4kb
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协议下起作用
"""
  • cookie之模拟登录知乎
from urllib import request
url = 'http://www.zhihu.com/hot'
resp = request.urlopen(url)
print(resp.read().decode('utf-8'))
# 因为没有cookie所以无法登录知乎,会停在登录页面

# 添加cookie后可以访问到知乎热榜
from urllib import request
url = 'http://www.zhihu.com/hot'
header = {
    'cookie': '从浏览器复制'
}
url = request.Request(url, headers=header)
resp = request.urlopen(url)
print(resp.read().decode('utf-8'))

http.CookieJar模块

"""
http.cookiejar 模块
该模块主要的类有:
CookieJar:管理HTTP cookie值,存储HTTP请求生成的cookie,向传出的HTTP请求添加的cookie的对象。整个cookie都存储在内存中,对CookieJar实列进行垃圾回收后cookie也将丢失。

FileCookieJar(filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实列,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。

MozillaCookieJar(filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookie.txt兼容的FileCookieJar实列。

LWPCookieJar(filename,delayload=None):从FileCookieJar派生而来,创建与libwww-perl标准的Set-Cookie3 文件格式兼容的FileCookieJar实列。
"""
# 使用CookieJar模块获取cookie

from urllib import request
from http.cookiejar import CookieJar
from urllib import parse
# 先登录获取cookie,然后用cookie访问
# 创建cookiejar对象
cookiejar = CookieJar()
# 使用cookiejar创建一个HTTPCookieProcess对象
handler = request.HTTPCookieProcessor(cookiejar)
# 使用上一步创建的handler创建一个opener
opener = request.build_opener(handler)
# 使用opener发送登录请求 (账户和密码)
post_url = '登录网址'
post_data = parse.urlencode({
    'username': '',
    'password': ''
})
req = request.Request(post_url, data=post_data.encode('utf-8'))
opener.open(req)  # 运行到这里opener中已经有了cookie
# 访问个人网页
url = ''
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
rq = request.Request(url, headers=header)
resp = opener.open(rq)
print(resp.read().decode('utf-8'))

把cookie保存到本地

from urllib import request
from http.cookiejar import MozillaCookieJar
# cookie 保存
cookiejar = MozillaCookieJar("cookie.txt")
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.baidu.com')
cookiejar.save()  # ignore_discard=True 保存即将过期的cookie  ignore_expires=True  即使cookie已经过期也保持并且覆盖

加载cookie

from urllib import request
from http.cookiejar import MozillaCookieJar
# 加载cookie
cookiejar = MozillaCookieJar("cookie.txt")
cookiejar.load()  # 加载
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.baidu.com')
for cookie in cookiejar:
    print(cookie)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值