python爬虫基础:day5

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对应的正向代理服务器转发我们发送的请求

  1. 代理ip是一个ip,指向的是一个代理服务器
  2. 代理服务器能够帮我们向目标服务器转发请求
  3. 正向代理和反向代理的区别
    1. 正向代理 : 浏览器知道服务器的真实地址,例如vpn(虚拟专用网络)
    2.  反向代理 :览器不知道服务器的真实地址,例如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']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值