爬虫学习--2.urllib 库

urllib了解

urllib 库 是 Python 内置的 HTTP 请求库。urllib 模块提供的上层接口,使访问 www 和 ftp 上的数据就像访问本地文件一样。 有以下几种模块:

  • urllib.request 请求模块

  • urllib.error 异常处理模块

  • urllib.parse url解析模块

  • urllib.robotparser robots.txt 解析模块

urllib.request模块详讲

urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证), redirections (重定向), cookies (浏览器Cookies)以及其它内容。

常用的方法

  • urllib.request.urlopen("网址"/"请求对象")  作用 :向网站发起一个请求并获取响应 urlopen()不支持重构User-Agent

  • read()  读取服务器响应的内容

  • 字节流 = response.read()

  • 字符串 = response.read().decode("utf-8")

  • getcode() 返回HTTP的响应码

  • geturl()  返回实际数据的URL(防止重定向问题)

  • urllib.request.Request("网址",headers="字典")  

urllib.request.urlopen("网址"/"请求对象")实例

import urllib.request
# 目标url
url = "http://www.baidu.com"
# 请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
# 发起请求
response = urllib.request.urlopen(url)
"""Open the URL url, which can be either a string or a Request object
参数我们不仅可以传入一个网址 也可以传入一个对象 
"""
# 获取响应
# html = response.read()  # 获取字节流
html = response.read().decode('utf-8')  # 获取字符串
# print(html)

print(response.getcode())  # 返回HTTP的响应码
print(response.geturl())   # 返回实际数据的URL

urllib.request.Request("网址","请求头")实例

由上我们知道利用 urlopen() 方法可以实现最基本的请求发起,但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入 headers 等信息,我们就可以利用更强大的 Request 类来构建一个请求。

import urllib.request
# urllib.request.Request()
# 创建请求对象并构建User-Agent

url = "http://www.baidu.com"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}

# 1 创建请求对象并构建User-Agent
req = urllib.request.Request(url, headers=headers)
print(req)  # <urllib.request.Request object at 0x000001B411D38048> 请求对象
# 2获取响应对象  urlopen
"""我们依然是用urlopen()方法来发送这个请求,只不过这次urlopen()方法的参数不再是一个URL,
而是一个Request,通过构造这个这个数据结构,
一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。"""
response = urllib.request.urlopen(req)
# 3读取响应对象的内容  read().decode("utf-8")
html = response.read().decode("utf-8")
print(html)

urllib.parse模块详讲

常用方法

  • urlencode(字典)

  • quote(字符串) (这个里面的参数是个字符串)

urlencode与quote实战

# 网络模块在向一个携带一个中文字样的url发送请求就会出现问题
# 解决方案: 把中文处理成%+十六进制的样式

import urllib.request
import urllib.parse

url1 = "https://www.baidu.com/s?wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B"
url2 = "https://www.baidu.com/s?wd=海贼王"
url3 = "https://www.baidu.com/s?wd=python"

req = urllib.request.urlopen(url2)
print(req)  # UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)

# 第一种方法
'''
urlencode
传入参数类型:字典
功能:将存入的字典参数编码为URL查询字符串,即转换成以key1=value1&key2=value2的形式
导入:from urllib.parse import urlencode
'''
r = {"wd": "海贼王"}
result = urllib.parse.urlencode(r)  # 对r进行编码
print(result)
f_url = "https://www.baidu.com/s?" + result
print(f_url)

# 第二种方法
'''
url单个字符串编码用quote()函数
'''
r = "海贼王"
result = urllib.parse.quote(r)
print(result)
f_url = "https://www.baidu.com/s?wd=" + result
print(f_url)

urllib保存图片实例分析

"""urllib方法
参数说明:
url:外部或者本地url
filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);
reporthook:是一个回调函数,我们可以利用这个回调函数来显示当前的下载进度。
data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename,headers),filename表示保存到本地的路径,header表示服务器的响应头。
"""
from urllib import request
from urllib.request import urlretrieve
url = "https://img1.baidu.com/it/u=1597761366,2823600315&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500"
request.urlretrieve(url=url, filename="girl2.png")

# reuqest方法
import requests
url = "https://img1.baidu.com/it/u=1597761366,2823600315&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500"
response = requests.get(url)
with open("girl.jpg", mode="wb")as f:
    f.write(response.content)

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F——

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值