1,cookieJar对象转换为cookies字典的方法
使用requests获取的resposne对象,具有cookies属性。
该属性值是一个cookieJar类型,包含了对方服务器设置在本地的cookie
-- 将其转换为cookies字典
--requests.utils.dict_from_cookiejar 把cookiejar对象转化为字典
# 【cookie设置方式三: 字典传参 cookiejar转换字典参数】
from requests import utils
url = 'https://movie.douban.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.82'
}
response = requests.get(url=url,headers=headers)
# print(type(response.cookies))
# cookiejar类型
cookies = requests.utils.dict_from_cookiejar(response.cookies)
print(cookies)
2, 超时参数的使用
1,用来检测IP代理的质量 : 一个代理IP在很长时间没有响应,那么添加超时参数,通过报错,达到筛选IP的目的
2,添加timeout参数,能够保证在3秒钟之类返回响应,否则就报错
# 【cookie设置方式三: 字典传参 cookiejar转换字典参数】
from requests import utils
url = 'https://movie.douban.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.82'
}
response = requests.get(url=url,headers=headers,timeout=3) #设置请求的超市时间的问题
# print(type(response.cookies))
# cookiejar类型
cookies = requests.utils.dict_from_cookiejar(response.cookies)
print(cookies)
3,retrying模块的使用(可以检查url是否有错误)
正常的网页浏览浏览过程中,如果发生速度很慢的情况,我们会点击刷新页面,那么,在代码中,我们是否也能刷新请求呢?
import requests
from retrying import retry
# stop_max_attempt_number:在中止以前尝试的最大次数
@retry(stop_max_attempt_number=3) #@x 装饰器。
def _parse_url(url):
# 前面添加_代表私有,这里代表私有方法,其他文件调用此包,此属性不能被调用
print('*'*20)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.82'
}
response = requests.get(url=url,headers=headers,timeout=3)
# 断言 : 状态码为200,否则报错
assert response.status_code == 200
return response.content.decode()
def parse_url(url):
try:
html_str = _parse_url(url)
except Exception as e:
print(e)
html_str = None
return html_str
if __name__ == '__main__':
url = 'http://www.baidu.com'
# url = 'www.baidu.com'
# print(parse_url(url)[:20]) # 字符串切片,取前二十个字符
print(parse_url(url))
4,IP代理
通过指定代理ip,让代理ip对应的正向代理服务器转发我们发送的请求
- 代理ip是一个ip,指向的是一个代理服务器
- 代理服务器能够帮我们向目标服务器转发请求
- 正向代理和反向代理的区别
- 正向代理 : 浏览器知道服务器的真实地址,例如vpn(虚拟专用网络)
- 反向代理 :览器不知道服务器的真实地址,例如nginx(一个高性能的HTTP和反向代理web服务器)
快代理国内代理平台:https://www.kuaidaili.com/
极客云国外代理平台:https://jike138.com/user##
5,使用verify参数忽略CA证书
为了在代码中能够正常的请求,我们使用verify=False参数,此时requests模块发送请求将不做CA证书的验证:verify参数能够忽略CA证书的认证
importrequestsurl="https://sam.huat.edu.cn:8443/selfservice/"
response=requests.get(url,verify=False)
6,禁止响应页面重定向(http-https 重定向)
allow_redirects=False 禁止重定向
#使用方法
response=requests.get(url=start_url,headers=headers,allow_redirects=False)
7,requests模块发送post请求
用到POST请求:
1.登录注册(POST比GET更安全,url地址中不会暴露用户的账号密码等信息)
2.需要传输大文本内容的时候(POST请求对数据长度没有要求)
模拟百度翻译发送post请求
import requests
url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en'
headers = {
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'Host':'fanyi.baidu.com',
'Origin':'https://fanyi.baidu.com',
'Referer':'https://fanyi.baidu.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.82',
'X-Requested-With' : 'XMLHttpRequest',
'Cookie': 'BIDUPSID=C1A258DE18E4542794F2BBCE6C38C531; PSTM=1591753394; __bid_n=1878d3df870b5992014207; BDUSS=h3TDgwRTFFLXdsTnBpV2NyRlJpekdYUGtUaFA5Zm53RWQzb28xMVdsUDAzM0ZrSVFBQUFBJCQAAAAAAAAAAAEAAABwo8SdQTE4NzIzNTgyMTQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPRSSmT0UkpkeG; BDUSS_BFESS=h3TDgwRTFFLXdsTnBpV2NyRlJpekdYUGtUaFA5Zm53RWQzb28xMVdsUDAzM0ZrSVFBQUFBJCQAAAAAAAAAAAEAAABwo8SdQTE4NzIzNTgyMTQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPRSSmT0UkpkeG; BAIDUID=443C325EC7DC6BCB1D251019BA2FF493:FG=1; BAIDUID_BFESS=443C325EC7DC6BCB1D251019BA2FF493:FG=1; FPTOKEN=TBrdhi8Kc9FvzgZ8z/iGnp2B63dIYjJ0+22me43bUufXzV2spI1lgpySQBiwowezYzWeSetrhxkZo1d2+TaIt4AGb1kmUUC7PcKj/e0JLtRZGNhY+rIe7LSnpkFqFv4hruhDKVu7NET6Cn142Z/aUGe996MPXGrsaZi2mhFiWO4MQfV5pd67SuixzygV4yNrbVj15EKUryui+DeEJ8qHQnJNMc0rsrars6K4ml4TV1sv+E/uNYW3gxvDZBMhxzt7HhYmkrDhH9+aoKjySn7wgXKb3OA1avttKhNqgUnDDliDZa4X65Gt9u8yG1ieFYFaBK9rUbA5uiqAIAxbUdEcghm3QbGDKrHLu7afC+XYqUmHmrKOSJWt53adpNJHJDQeQtAcn8MLoB4vrMTTRwWiMA==|NLwOTwT4UFtoTDobAWu5s+14KUWo+ghf6gcV/NuTFjE=|10|a15254219a5ecbc435f2e236a5be2b57; APPGUIDE_10_6_2=1; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; MCITY=-132%3A; BAIDU_WISE_UID=wapp_1688700681234_643; ZFY=lZsifVIpY0dYPVnH2CZOooKu:B15d8150UA6erVn5zTo:C; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1688220406,1688614010,1689752006; ab_sr=1.0.1_MGJiN2FlNTU5ZmNhMDE0NzE0NWY3OWE4ODMwMDMwMWM3NDVjNmMzYTY5MjZlZGQyMGYyYmEyMmQ0YTg2ZDg0NDg4ZjA3OTBhZGNkNzA1MWEwNDlkZDE3N2JmY2NmYWI1ODRiZWQ4ODFhYWM4YWRmMjY4NWM3MDdjZDRiNGZkYWM1ZWRmZTE4ZTQxZWZiNTIxMzBkNWRjYTU4MTNjZjYwYmUyOTExMDFkMzAxN2U3NzdjNTk5MTkwMjZjZDE3MzQ2; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1689752135',
'Acs-Token':'1689752141506_1689752136077_SOMGVpR98HViT/H6Bd6KOIpDXgCXOIkfwf5Gw1Kk97m6IX80A7d4JOIBrVZVTcxYGRTZ+qT4XGYMNXe/CES/b494e9p9fOg7kR3r2XGsy4S4XyILqAgU6+GzGAFudgLcJfpjbiXt49DLcH4WzLLOfCuqfbZWkOT0p+wZyZXqvz+vCeMQyE7/1F+y1FHAmCePKXs7Irfft0fmKjn/5Q0CzmEOGsf5EC1MhS6mLFzbl0kd3sNCpU84kaPPOlNXXcdVXtjrPdv3g01FHEjYUJfHfHr3UvuKPqI77HztoGhAwC0Ltq/kGDDXcEQFVPjVHSQm7mTnJ941YHiXrl0d5W1sUhIwBOQfzQnQXQxYot4Qa9SYZNNqC0pNNp43+Ott/DzSes5dnirYtj9Xw++nMJ1Kz2HGPjWSIV6p79/grzXwLzSSZW/cV3v7ur+gkWg4P/lSAggs73JGbZPMY/uX0tHjzo9hNPOEHci5avQTzvpO4BWOBrfH4M7KCaLxYSfA9GNwtL+hjGvuEnXItDx81W1uuA== '
}
data = {
'from': 'zh',
'to': 'en',
'query': '春天',
'simple_means_flag': '3',
'sign': '643400.864889',
'token': 'ba39d0ea333768d96a8dfc4f5f935cba',
'domain': 'common',
}
response = requests.post(url=url,headers=headers,data=data).json()
print(response)
8,.requests_html请求库的使用
1,Requests只负责网络请求,不会对响应结果进行解析。次封装,又发布了一个更好用的Requests-html库用于解析HTML。
2,equest-html的牛逼之处:它集成了request库,beautifulsoup库,pyquery库,浏览器内核
from requests_html import HTMLSession
# 1,实例化
session = HTMLSession()
# 2,准备start_url
url = 'https://www.gdrtvu.edu.cn/'
# 3,发送请求(get)
response_get = session.get(url)
response_get.encoding = 'utf-8'
# 4,response对象属性
# print(response_get.url)
# print(response_get.encoding)
# print(response_get.json)
# print(response_get.status_code)
# print(response_get.headers)
# print(response_get.cookies)
# print(response_get.history)
# print(response_get.text)
# 5,获取html源码
# html_str = response_get.html.html #没有乱码
# print(html_str)
print(response_get.html.absolute_links)
print(response_get.html.links)
print(response_get.html.base_url)
print(response_get.html.text) #网页文本
print(response_get.html.encoding)
# print(response_get.html.raw_html)
9,response与Xpath语法
import requests_html
from requests_html import HTMLSession
# 获取请求对象
session = HTMLSession()
#发送get请求
#https://sc.chinaz.com/tupian/23042804846.htm
sina = session.get('https://news.sina.com.cn/')
sina.encoding='utf-8'
# 获取响应文本信息
# print(sina.text)
# 获取链接(links与abolute_links)
# 得到所有的链接,返回的是一个set集合
print(sina.html.links)
# 若获取的链接中有相对路径,我们还可以通过absolute_links获取所有绝对链接
print(sina.html.absolute_links)
# request-html支持CSS选择器和XPATH两种语法来选取HTML元素。首先先来看看CSS选择器语法,它需要使用HTML的 find 函数来查找元素。
'''
CSS选择器 and XPATH
1.通过css选择器选取一个Element对象
2.获取一个Element对象内的文本内容
3.获取一个Element对象的所有attributes
4.渲染出一个Element对象的HTML内容
5.获取Element对象内的特定子Element对象,返回列表
6.在获取的页面中通过search查找文本
7.支持XPath
8.获取到只包含某些文本的Element对象
'''
# 获取类x的的div标签,并且返回一个对象
content = sina.html.find('div.blk_main', first=True) #找到这个标签
# print(content)
# # 获取Element对象内的指定的所有子Element对象,返回列表
a_s = content.find('img',first=True) #找到这个属性,返回列表。first=True可以改为不是列表形式
print(a_s)
# print(a_s.attrs)
print(a_s.attrs['src'])
# # 获取content内所有文本
# print(content.text)
#
# # 获取content内所有属性
# print(content.attrs)
#
# #获取单个属性
# href = content.attrs['href']