1:urllib模块
1.1:为什么学习该模块
- 有些时候比较老的爬虫项目,就是使用有关urllib模块中的技术书写的
- 有时候会需要使用requests模块和urllib模块进行配合使用
- 是一个内置的模块,使用起来比较方便
2:urllib模块快速入门
2.1:向网站发起请求并获得响应
urllib.request.urlopen(url)
方法,只有一个参数,用于填充要获得数据的url
2.2获取网页数据:
impoort urllib.request
url = "https://www.baibu.com/"
response = urllib.request.urlopen(url)
print(response)
- 通过运行结果,我们所获得的是一个内存地址,有一对尖括号(<>)括起来的数据,要想看到这个内存里面的数据就需要使用read()函数来读取内存中的数据了
- 注意:在python中由尖括号(<>)包裹的都是一个方法
2.3:更新后的代码(1.0版本)
impoort urllib.request
url = "https://www.baibu.com/"
response = urllib.request.urlopen(url)
print(response.read())
- 通过运行结果,可以看到虽然读到了内存中的数据,但是返回的数据与原网页的源码出入很大,所以我们可以考虑是不是有什么地方出错了
- 1:网页响应的数据都是bytes数据,而我们想要看到的是str数据,所以我们要对网页响应的数据进行解码操作
- 2:是不是出现了反爬操作
2.4:2.0版本
impoort urllib.request
url = "https://www.baibu.com/"
response = urllib.request.urlopen(url)
html = response.read().encode('utf-8')
print(html)
print(type(html))
- 可以看到返回的数据我们可以看懂, 但是还是有和网页源代码相差很大,所以可能是由反爬了
3:用户代理
- 由上面的代码我们知道了遇到了反爬,所以我们需要一个ip代理用于反反爬
- IP代理也就是抓包工具当中的UA
- 因为urllib.request.urlopen()中只能接受一个参数url,所以需要使用另一个方法:urllib.request.Request()方法
- urllib.request.Request():可以接受两个参数,url和UA
3.1:2.1版本
import urllib.request
url = 'https://www.baibu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36'
}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
print(html)
print(html.getcode)
print(html.geturl)
- 对运行的结果进行分析,可以知道这些打印出来的数据和网页的源码数据相差不大,所以可以认为我们对这个网页的爬取是成功的
4:如果url中有中文字眼的请求
- 链接: url的介绍.
- 在爬虫前导知识中有说的,除了英文、数字和部分字符在url和编译器等地方会以自己本身的样子出现外,其余的所以字符都会以%+16进制的形式出现,当中汉字的表示方法是三个%代表一个汉字
- 所以在url中出现的中文字眼都要转化为这种形式,但是我们又不知道该怎么转化,所以就需要一个方法来帮我们转化
4.1:urllib.parse.urlencode()
- 将在url中不能正常出现的字眼,转换为%+16进制的形式
- 语法:
import urllib.pares
wd = {
"wd": "海贼王"
}
url_1 = urllib.parse.urlencode(wd)
print(url_1)
url = "https://www.baidu.com/s?" + url_1
print(url)
- 注意:该方法传入的参数为一个字典
- 这种方法虽然可以使url中不能出现的中文字眼转换为url可以认清的%+16进制的格式,但是如果反过来转换就不行了,就好比把一个图片的%+16进制的形式转换为一个我们可以看清的url,这个时候这个方法就不行了
4.2:urllib.parse.quote()
import urllib.pares
r = "海贼王"
url_a = urllib.pares.quote(r)
print(url_a)
url = 'https://www.baidu.com/s?wd=' + url_a
print(url)
4.2:urllib.parse.unquote()
import urllib.pares
url_a = 'http%3A%2F%2Fshp%2Eqpic%2Ecn%2Fishow%2F2735041519%2F1618485629%5F84828260%5F22420%5FsProdImgNo%5F1%2Ejpg%2F200'
url = urllib.pares.unquote(url_a)
print(url)
- 可以根据代码的返回值看到,这个图片的url已经由%+16进制转换为普通的我们可以识别的url了
拓展
1:bytes–>str 解码
2:str–>bytes 编码
3:由url不能识别的字符转换为%+16进制的方法
- 方法1:urllib.pares.urlencode(dict) #传入的参数为字典类型
- 方法2:urllib.pares.quote(str) #传入的参数为字符串类型
4:由%+16进制转换为我们可以识别的url
- urllib.pares.unquote(%+16进制) # 传入的参数为%+16进制的类型