前言
💖在实现网络爬虫的爬取工作时,就必须使用网络请求,只有进行了网络请求才可以对响应结果中的数据进行提取,urllib模块是python自带的网络请求模块,无需安装,导入即可使用。下面将介绍如果使用python中的urllib模块实现网络请求💖
urllib的子模块
模块 | 描述 |
---|---|
urllib.request | 用于实现基本HTTP请求的模块 |
urllib.error | 异常处理模块,如果在发送网络请求的过程时出现错误,可以捕获异常进行有效处理 |
urllib.parse | 用于解析URL的模块 |
urllib.robotparser | 用于解析robots.txt文件,判断网站是否可以爬取信息 |
HttpResponse常用方法与属性获取信息
通过urllib.request() 获取的对象类型是HttpReponse,有以下几种常用的方法,示例如下:
import urllib.request # 定义一个url(你要爬取的网址) url = 'https://www.baidu.com' # 添加请求头信息 headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" } # 创建Request对象 res = urllib.request.Request(url=url, headers=headers) # 模拟浏览器向服务器发送网络请求 response = urllib.request.urlopen(res) # read()函数可以获取响应,但返回的响应格式是二进制的,需要解码 # 解码:decode('编码格式') 编码格式在Response Headers,Content_Type里面查看 print('baidu官网HTML代码如下:\n', response.read().decode('utf-8')) # HTTPResponse这个类型 # 常见方法:read、readline、readlines、getcode、status、geturl、getheaders、getheader # print(type(response)) # response是HTTPResponse的类型 # (1) 按照一个字节一个字节去读 content = response.read() print(content) # 读取具体的n个字节,在read()函数中传参即可 content2 = response.read(5) print(content2) # (2) 按行读取,但是只能读取一行 content3 = response.readline() print(content3) # (3) 按行读取,并且读取所有行 content4 = response.readlines() print(content4) # (4) 返回状态码的方法:200状态码没有问题,其他的状态码可能有问题 print('响应状态码为', response.getcode()) print('响应状态码为', response.status) # (5) 返回访问的目标的url地址 print('响应访问的url地址为', response.geturl()) # (6) 获取的是响应头所有信息 print('响应头所有信息为', response.getheaders()) # (7)获取响应头指定信息 print('响应头指定信息为', response.getheader('Content-Type'))
urlli.parse的使用(一般用于处理带中文的url)
💡使用urllib模块向一个携带中文字样的url发送请求时 ,会报错:‘ascii’ codec can’t encode characters in position 10-11: ordinal not in range(128)💡
字典格式的处理方式
步骤
(1)导入request和parse模块
(2)添加请求头header(重构ua)反反爬第一步
(3)使用urllib.parse方法处理url中的中文字样(使用字典存储要处理的内容,经过parse处理返回正常的url地址)
(4)使用 拼接固定的url地址和经过处理后的url地址
(5)创建请求对象
(6)使用urlopen()模拟浏览器像服务器发送网络请求
(7)打印获取响应对象里面的内容,并进行decode解码
import urllib.parse # 导入parse解析模块 import urllib.request # 导入request模块 url = 'https://www.baidu.com/s?wd=酷我' header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" } # 通过urllib.parse处理url中的中文字样--> 得到可以通过urllib发送请求的url地址 # 字典格式的处理方式 org = {'wd': '酷我'} # 经过处理之后返回wd=酷