urllib
- python 中自带的一个基于爬虫的模块
- 作用: 可以使用代码 模拟浏览器发起请求。 request parse
- 使用流程:
- 指定url
- 针对指定的url 发起请求
- 获取服务器响应的数据
- 持久化存储
In [12]:
# 需求: 爬去指定词条的,url 数据
import urllib.request
import urllib.parse
# 1. 指定url,只能使用ascll 编码格式。 所以如果带有中文。 需要进行,编码格式的转换.
# url 特性: url中不可以存在 fei1 ASCLL 编码的字符数据。
url = 'https://www.baidu.com/s?wd='
word = urllib.parse.quote("阿纯") # 对特殊字符进行,特殊字符的转码。
url += word
print(url) # https://www.sogou.com/web?query=%E9%98%BF%E7%BA%AF
# 2. 发起请求, 且返回响应对象。
response = urllib.request.urlopen(url=url)
# 3. 使用相应对象,read 获取响应对象中,存储的页面 html 文档数据。(格式为 byte)
html_text = response.read()
# 4. 持久化存储, 保存到磁盘
with open("./chun.html", "wb") as f:
f.write(html_text)
print("donwload")
上述代码,不能够。顺利进行爬取,想来是因为, 有了反爬机制
- 反爬机制: 检查请求的UA, 如果是一个正常的请求,就会正常的响应。 如果不是浏览器的 UA 可能就会被认为是一个 爬虫程序发起的请求, 从而拒绝提供网站数据。
- User-Agent: 请求载体的身份标识。(通过爬虫发送请求,请求载体就是爬虫程序。 模拟成浏览器请求载体。)
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36
- 反反爬虫机制: 伪装爬虫的请求UA。使浏览器认为,这是一个正常的请求。
In [19]:
import urllib.request
import urllib.parse
url = 'https://www.baidu.com/s?wd='
word = urllib.parse.quote("啊纯")
url += word
# UA 伪装:
#1. 自制定一个请求对象:headers 赋值一个字典格式的数据
headers = {
# 存储任意的请求头,信息
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'
}
request = urllib.request.Request(url=url,headers=headers)
# 2.针对自制定的请求对象,发起请求
response = urllib.request.urlopen(request)
html_text = response.read()
with open("./chun.html", "wb") as f:
f.write(html_text)
# ok 到此, 简单的爬去已经完成。 而且 都是基于 GET 请求的方式, 发送的请求。
试一试 使用 post 方式, 发送请求。
- urllib 模块发起POST请求。 实验一个,爬去百度翻译的翻译结果
- 浏览器中, 开发者工具, Network 中。 XHR 类型的请求,就是 基于Ajax的 POST请求。
- 在其中的所有的,请求中。寻找 Form Date 的参数。是我在 文本框中,输入的这个值的那条请求。就是我想要的。
In [26]:
# urllib
import urllib.request
import urllib.parse
# 指定url
url = 'https://fanyi.baidu.com/sug'
# POST请求携带参数的处理:流程:
# 1. 将 POST 请求的参数, 封装到字典中: 参数键, 与目标服务器的, 键 保持一致
data = {
'kw':"西瓜"
}
# 2. 使用 parse.urlencode() 对封装的字典数据, 进行编码的处理. 返回字符串类型。
data = urllib.parse.urlencode(data)
# print(data, type(data)) # kw=%E8%A5%BF%E7%93%9C <class 'str'>
# 3. 将 第二步, 得到的 字符串类型的数据。 转换成 byte 类型。(因为网络传输 都是使用的 byte 类型进行传输)
data = data.encode()
# 4. 发起 POST 请求: data参数表示的就是,经过处理之后的 post 请求携带的参数.
response = urllib.request.urlopen(url=url, data=data)
# 这里得到的是 以个 josn 格式的 byte格式字符串。 需要将编码格式进行转换,然后才可查看。