二:《智慧的网络爬虫》— 网络请求模块(上)

简介: 网络请求模块就是帮助浏览器(客户端)向服务器发送请求的​。在Python3之前的版本(Python2版本)中所使用的网络请求模块是urllib模块​;在Python3现在的版本中通过urllib模块进行升级 有了现在所使用的requests模块,也就是requests模块是基于urllib模块进行开发的。本篇文章讲解的是urllib模块。
1.初识网络请求模块:

​ 网络请求模块就是帮助浏览器(客户端)向服务器发送请求的

​ 在Python3之前的版本(Python2版本)中所使用的网络请求模块是 urllib 模块

​ 在Python3现在的版本中通过 urllib 模块进行升级 有了现在所使用的 requests 模块,也就是 requests 模块是基于 urllib 模块进行开发的

2.urllib模块:

urllib库是Python内置的HTTP请求库,urllib模块提供的上层接口,使访问 wwwftp 上的数据就像访问本地文件一样

urllib库中有以下几种模块:

  • urllib.request -- 请求模块
  • urllib.parse -- url解析模块
  • urllib.error -- 异常处理模块
  • urllib.robotparser -- robots.txt解析模块

(1)urllib.request模块:

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

常用的方法:

  • urllib.request.urlopen("网址" / "请求对象"):向网站发起一个请求并获取响应 ,urlopen()方法不支持重构User-Agent
  • urllib.request.Request("网址" , headers = "字典"):返回一个请求对象(封装成请求对象)
  • read():读取服务器响应的内容
  • ​ 字节流 = response.read()
  • ​ 字符串 = response.read().decode("utf-8")
  • getcode():返回HTTP的响应码
  • geturl():返回实际数据的url(防止重定向问题)

urllib.request.urlopen("网址" / "请求对象")示例 -- 以爬取百度首页为示例:

# urllib是一个内置库,内置库是不用我们通过pip工具进行安装的,直接导入即可
import urllib.request

# 目标url
url = "http://www.baidu.com"

# 发起请求
response = urllib.request.urlopen(url) #当前response返回的是一个响应对象
#这个参数我们不仅可以传入一个网址;也可以传入一个对象 

# 获取响应
# html = response.read()  #获取字节流(返回的是二进制数据)
html = response.read().decode('utf-8')  #获取字符串(将其编码成字符串)
# print(html)

print(response.getcode())  #返回HTTP的响应码
print(response.geturl())   #返回实际数据的URL
#缩写版,三行代码搞定
import urllib.request
html = urllib.request.urlopen("https://www.douban.com/").read().decode("utf-8")
print(html)

如何查看函数说明:

​ (1)将鼠标放置在要查看的函数上,按CTRL + B

​ (2)将鼠标放置在要查看的函数上,按住CTRL再点击鼠标左键

urllib.request.Request("网址", "请求头")示例 -- 以爬取豆瓣首页为示例:

​ 由上我们知道利用urlopen()方法可以实现最基本的请求,但在遇到反爬时,仅凭这几个简单的参数还不足以构成一个完整的请求,如果在请求中需要加入headers等信息,我们就需要利用更强大的Request方法来构建一个请求

import urllib.request

# 目标url
url = "https://www.douban.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) #此时req是一个请求对象
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)

(2)urllib.parse模块:

常用方法:

​ 1. urlencode(这个里面传入的参数类型是字典)

​ 传入参数类型:字典

​ 功能:将存入的字典参数编码为URL查询字符串,即转换成以key1=value1&key2=value2的形式

​ &:连接符,连接参数与参数之间的

​ 导入:from urllib.parse import urlencode

​ 2. quote(这个里面的参数是字符串)

​ 对url单个字符串编码

urlencodequote代码示例:以海贼王页面的URL为示例:

# 网络模块在向一个携带一个中文字样的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(url1) #正常返回请求对象

#req = urllib.request.urlopen(url2)
'''报错,如果在url中出现中文,会报出现编码的错误,但如果用的是Requests模块就不会报这个错误了,因为中文被Requests模块直接处理了'''

#req = urllib.request.urlopen(url3) #正常返回请求对象

print(req)
# 第一种方法 -- 用 urlencode()方法
r = {
   "wd": "海贼王"}
result = urllib.parse.urlencode(r)  # 对r进行解码
print(result)
f_url = "https://www.baidu.com/s?" + result
print(f_url)
# 第二种方法 -- 用 quote()方法
r = "海贼王"
result = urllib.parse.quote(r) # 对r进行解码
print(result)
f_url = "https://www.baidu.com/s?wd=" + result
print(f_url)

(3)用urllib保存图片实例分析 -- 随机找一张图片:

​ 如何找到图片当前的url

当前页面的网址并不等于是这张图片的网址

可以通过鼠标右键点击检查的方式去查找这个图片的url / 右键点击复制图片地址(链接)

一:urlretrieve方法:
参数说明:
url:外部或者本地url
filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据)
reporthook:是一个回调函数,我们可以利用这个回调函数来显示当前的下载进度
data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename,headers),filename表示保存到本地的路径,header表示服务器的响应头

from urllib.request import urlretrieve
url = "https://ts1.cn.mm.bing.net/th/id/R-C.66d7b796377883a92aad65b283ef1f84?rik=sQ%2fKoYAcr%2bOwsw&riu=http%3a%2f%2fwww.quazero.com%2fuploads%2fallimg%2f140305%2f1-140305131415.jpg&ehk=Hxl%2fQ9pbEiuuybrGWTEPJOhvrFK9C3vyCcWicooXfNE%3d&risl=&pid=ImgRaw&r=0"
urlretrieve(url=url, filename="mao.png")

二:reuqest方法:

import requests
url = "https://ts1.cn.mm.bing.net/th/id/R-C.0b10c2b8abae5557d767f78345c7c3b9?rik=5l29y7G8trIggg&riu=http%3a%2f%2fi3.img.969g.com%2fdown%2fimgx2014%2f02%2f08%2f289_093214_13ee6.jpg&ehk=Dz0E1RuS%2fO0MM4sqy3TBm9fhMKtoEti9THnsNH%2buZY0%3d&risl=&pid=ImgRaw&r=0"
response = requests.get(url) # response 当前仅仅是一个响应对象
with open("fengjing.jpg", mode="wb")as f:
    f.write(response.content) #写入二进制数据不管是视频还是图片,都要 response.content

拓展:以爬虫的方式如何下载视频 -- 以抖音视频为例:

import requests
url = "https://v3-web.douyinvod.com/7a7877efa760fdd53fa0c06111e57279/6568b2c2/video/tos/cn/tos-cn-ve-15c001-alinc2/o8Ey1n5mFAMNOeHhgIfGgpCzGN6AQZMhAABEBE/?a=6383&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=848&bt=848&cs=0&ds=6&ft=GN7rKGVVywpuRFo8Cmo~xj7ScoAp2b-6EvrK_as1d2o0g3&mime_type=video_mp4&qs=12&rc=O2gzNWlnPGVpO2gzZTpnaUBpMzNzaGc6ZjZzbjMzNGkzM0AzXmBfMF4yNV4xYDY0NV8uYSMwLWgvcjQwbS1gLS1kLS9zcw%3D%3D&btag=e00008000&dy_q=1701356714&feature_id=46a7bb47b4fd1280f3d3825bf2b29388&l=20231130230514D28ECE4FCCD8A828D414"
response = requests.get(url) # response 当前仅仅是一个响应对象
with open("douyin.mp4", mode="wb")as f:
    f.write(response.content) #写入二进制数据不管是视频还是图片,都要 response.content

注意:
并不是所有的视频和图片都可以这样去爬取,有些图片和视频是加密的,url并不会这么轻易的找到

目录
相关文章
|
7天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
28天前
|
移动开发 网络协议 NoSQL
不为人知的网络编程(十七):冰山之下,一次网络请求背后的技术秘密
本文将抛弃千篇一律的计网知识理论,从现实的互联网技术实践角度,一步步为你分享一次网络请求背后的技术秘密。
47 0
|
28天前
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
|
2月前
|
数据采集 Web App开发 开发工具
|
2月前
|
数据安全/隐私保护
|
2月前
|
数据采集 API 开发者
🚀告别网络爬虫小白!urllib与requests联手,Python网络请求实战全攻略
在网络的广阔世界里,Python凭借其简洁的语法和强大的库支持,成为开发网络爬虫的首选语言。本文将通过实战案例,带你探索urllib和requests两大神器的魅力。urllib作为Python内置库,虽API稍显繁琐,但有助于理解HTTP请求本质;requests则简化了请求流程,使开发者更专注于业务逻辑。从基本的网页内容抓取到处理Cookies与Session,我们将逐一剖析,助你从爬虫新手成长为高手。
65 1
|
1月前
|
JSON API 开发者
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
16 0
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python爬虫入门指南探索AI的无限可能:深度学习与神经网络的魅力
【8月更文挑战第27天】本文将带你走进Python爬虫的世界,从基础的爬虫概念到实战操作,你将学会如何利用Python进行网页数据的抓取。我们将一起探索requests库和BeautifulSoup库的使用,以及反爬策略的应对方法。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你打开一扇通往数据抓取世界的大门。
|
2月前
|
Python
HTTP协议不再是迷!Python网络请求实战,带你走进网络世界的奥秘
本文介绍了HTTP协议,它是互联网信息传递的核心。作为客户端与服务器通信的基础,HTTP请求包括请求行、头和体三部分。通过Python的`requests`库,我们可以轻松实现HTTP请求。本文将指导你安装`requests`库,并通过实战示例演示如何发送GET和POST请求。无论你是想获取网页内容还是提交表单数据,都能通过简单的代码实现。希望本文能帮助你在Python网络请求的道路上迈出坚实的一步。
63 0