3.1requests库的使用
第三方模块导入:pip install requests -i https://pypi.doubanio.com/simple
爬虫:模拟客户端 发送网络请求 获取响应
在python当中,我们就使用第三方库requests去发送网络请求
代码段如下:
下面展示一些 内联代码片
。
# import requests
#
# # 程序入口(可写可不写,忘记了作用的,可以回顾基础班的内容(模块和包的部分))
# if __name__ == '__main__':
# # 1.确认目标的url 注意点,url从network里面寻找,因为网页是由network里面所有的数据包构成的
# url_ = "https://www.baidu.com/" # 字符串的方式进行呈现
#
# # 2.发送网络请求,得到响应对象
# response_ = requests.get(url_) # 目标的url 利用requests库发送网络请求,最终得到一个响应对象response
# print(response_) # 响应对象 对象的形式
# # 3.解析数据
# # 仅仅拿到响应对象没有用,我们要的是里面的数据
# # print(response_.text) # 得到该url对应的响应代码(数据)
# # print(type(response_.text)) # 响应response的text属性 得到的是string字符串类型的数据
#
# print(response_.content) # 得到该url对应的响应代码(数据)
# print(type(response_.content)) # 响应response的content属性 得到的是bytes字节类型的数据
# # 4.保存
3.2 响应response里面的其他属性
下面展示一些 response里面的其他属性
。
response.text 响应体 str类型
respones.content 响应体 bytes类型
response.status_code 响应状态码
response.request.headers 响应对应的请求头
response.headers 响应头
response.request.cookies 响应对应请求的cookie
response.cookies 响应的cookie(经过了set-cookie动作)
下面展示 response属性
使用示例。
import requests
if __name__ == '__main__':
# 1.确认需要的数据的url,需要是一个字符串
url_ = "https://www.baidu.com/"
# 2.发送网络请求,获取响应对象
response = requests.get(url_)
# response.status_code 响应状态码 200请求成功 301跳转 404页面找不到 500服务器出现了错误
print(response.status_code)
# response.request.headers 响应对应的请求头(重点)
print(response.request.headers) # 响应对象里面还包含了我们的请求信息(已经被服务端解析过了一次的请求信息)
# 代表着百度的服务器已经知道了我们是一个python爬虫,已经被识别了是一个爬虫程序
# 'User-Agent': 'python-requests/2.24.0'
# 正常的使用浏览器访问,用户代理(代表请求者的身份)(重点)
# User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36
# response.headers 响应头
print(response.headers)
# response.request._cookies 响应对应请求的cookie(了解)
print(response.request._cookies) # 这是一个CookieJar的对象
# response.cookies 响应的cookie(经过了set-cookie动作)
print(response.cookies)
3.3 用户代理
3.3.1 使用用户代理的目的–隐藏爬虫身份
# 我们使用爬虫去访问百度首页,其实已经是被检测到了是爬虫身份
"""
百度首页已经知道了我们是爬虫程序的情况下,为啥还是给我们返回了数据
1.拒绝我们的访问
2.数据不重要的话
3.返回给你假数据
"""
# import requests
#
# if __name__ == '__main__':
# # 1.确认需要的数据的url,需要是一个字符串
# url_ = "https://www.baidu.com/"
#
# # 2.发送网络请求,获取响应对象
# response_ = requests.get(url_)
#
# # 2.1 取到里面的数据
# bytes_data = response_.content # bytes_data存放的就是响应的字节数据
#
# # 2.2. 解码 把字节数据解码成字符串类型的数据
# str_data = bytes_data.decode('utf-8')
#
# # 如果写入的是str类型出现了乱码,encoding="utf-8"
# with open('baidu_04.html','w',encoding="utf-8") as f:
# f.write(str_data)
# 经过对比,发现数据少了
# 因为我们已经被识别成了一个爬虫程序
# 尽可以地模拟正常用户,模拟客户端(浏览器)去发送请求
# 'python-requests/2.24.0'
# 解决办法,隐藏爬虫身份'python-requests/2.24.0'
# 正常用户的脸:
# User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36
3.3.2用户代理使用示例
下面展示一些 内联代码片
。
import requests
if __name__ == '__main__':
# 1.确认需要的数据的url,需要是一个字符串
url_ = "https://www.baidu.com/"
# 实现User-Agent:用户代理,隐藏爬虫身份,使用正常浏览器的身份
headers_ = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36"}
# 2.发送网络请求,获取响应对象
response_ = requests.get(url_,headers=headers_)
# 2.1 取到里面的数据
bytes_data = response_.content # bytes_data存放的就是响应的字节数据
# 2.2. 解码 把字节数据解码成字符串类型的数据
str_data = bytes_data.decode('utf-8')
# 如果写入的是str类型出现了乱码,encoding="utf-8"
with open('baidu_05.html', 'w', encoding="utf-8") as f:
f.write(str_data)
注意:
User-Agent
1.对于服务端来说,反爬点
2.对于爬虫来说,它是模拟正常用户的其中一个部分
User-Agent用户代理只是其中一个
番外:
1.程序入口的使用:
if name == ‘main’:的作用
一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。
因此 if name == ‘main’: 的作用就是控制这两种情况执行代码的过程,在 if name == ‘main’: 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。举例说明如下:
-
直接执行情况:
直接执行 test.py,结果如下图,可以成功 print 两行字符串。即,if name==“main”: 语句之前和之后的代码都被执行。 -
import 执行情况:
然后在同一文件夹新建名称为 import_test.py 的脚本,输入如下代码:
执行 import_test.py 脚本,输出结果如下:
只输出了第一行字符串。即,if name==“main”: 之前的语句被执行,之后的没有被执行。