requests高级用法

Posted LiaJi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了requests高级用法相关的知识,希望对你有一定的参考价值。

爬虫requests高级用法

解析json

发送http请求返回的数据有xml格式也会有json格式

import requests
data = 
    \'cname\': \'\',
    \'pid\': \'\',
    \'keyword\': \'500\',
    \'pageIndex\': 1,
    \'pageSize\': 10

res= requests.post(\'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword\',data=data)
print(res.text)  
print(=res.json())  # 封装了json不需要再导json模块

ssl认证(可能面试会问)

http与https的区别

http协议是明文传输安全性低 80端口

https http + ssl + tsl 443端口

httsps 是在http协议上又加了一层处理加密信息的模块,比http安全,可防止数据在传输过程中被窃取,改变。确保数据完整性。

ssl 安全套接字层,SSL协议位于tcp、IP协议与各种应用层协议之间。为数据通信提供安全支持

TLS 传输层安全,由于存在安全漏洞,已经很少被使用到。发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本,TLS 1.3 改动会比较大,目前还在草案阶段,目前使用最广泛的是TLS 1.1、TLS 1.2

详细文档 https://zhuanlan.zhihu.com/p/561907474

如果遇到证书提示错误问题(ssl,xxx 就是)

解决方法

不验证证书 verify=False

import requests
respone=requests.get(\'https://www.12306.cn\',verify=False) #不验证证书,报警告,返回200
print(respone.status_code)

关闭警告

import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
respone=requests.get(\'https://www.12306.cn\',verify=False)
    print(respone.status_code)

手动携带证书

import requests
respone=requests.get(\'https://www.12306.cn\',
           cert=(\'/path/server.crt\', # 证书
                  \'/path/key\')) # 公钥
print(respone.status_code)

代理

如果爬虫使用自身ip地址访问,很有可能会被封。可以使用ip代理

1. 正向代理

1.1 概念

正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端。正向代理的情况下,客户端必须要进行一些特殊的设置才能使用。

1.2 特点
  • 正向代理需要主动设置代理服务器 ip 或者域名进行访问,由设置的服务器 ip 或者域名去访问内容并返回
  • 正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见。

2. 反向代理

2.1 概念

反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。

对于客户端来说,反向代理就相当于目标服务器,只需要将反向代理当作目标服务器一样发送请求就可以了,并且客户端不需要进行任何设置。

2.2 特点
  • 正向代理需要配置代理服务器,而反向代理不需要做任何设置。
  • 反向代理是代理服务器,为服务器收发请求,使真实服务器对客户端不可见。

requests 使用ip代理

res =requests.post(\'https://www.cnblogs.com\',proxies=\'http/https\':\'地址:端口\')

# 代理ip可以在网上寻找
res = requests.post(\'https://www.cnblogs.com\',proxies=\'http\':\'60.167.91.34:33080\')
print(res.status_code)

代理的种类

高匿代理
服务端只能看到代理,拿不到客户端真实的ip
透明代理
服务端能拿到真实客户端的ip地址

后端如何拿到真实客户端ip地址

# http请求头中有个:XFF
X-Forwarded-For: client1, proxy1, proxy2, proxy3

超时设置

超出时间直接断开链接

import requests
respone=requests.get(\'https://www.baidu.com\',timeout=0.0001)

异常处理

就是用try包起来

import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型
try:    r=requests.get(\'http://www.baidu.com\',timeout=0.00001)
except ReadTimeout:
    print(\'===:\')
# except ConnectionError: #网络不通
#     print(\'-----\')
# except Timeout:
#     print(\'aaaaa\')

except RequestException:
    print(\'Error\')
    
  "直接使用Exception吧"

上传文件

"上传文件可以写个脚本传"
import requests
files = \'file\': open(\'美女.png\', \'rb\')
respone = requests.post(\'http://httpbin.org/post\', files=files)
print(respone.status_code)

代理池搭建

1.花钱买

2.搭建免费的代理池

https://github.com/jhao104/proxy_pool python:爬虫+flask写的

搭建步骤

git clone https://github.com/jhao104/proxy_pool.git

使用pycharm打开

安装依赖:pip install -r requirements.txt

修改配置文件settings(redis地址即可)

HOST = "0.0.0.0"
PORT = 5010
DB_CONN = \'redis://127.0.0.1:6379/0\'
PROXY_FETCHER #爬取哪些免费代理网站

启动爬虫程序

python proxyPool.py schedule

启动服务端

python proxyPool.py server

编写脚本

import requests
# 往代理池发送请求 获取代理ip
res = requests.get(\'http://192.168.1.206:5010/get/\').json()
# 关闭警告
from requests.packages import urllib3
urllib3.disable_warnings()
proxies = 
# 如果能取迟来https说明是https
if res[\'https\']:
    proxies[\'https\'] = res[\'proxy\']
else:
    proxies[\'http\'] = res[\'proxy\']
print(proxies)
res = requests.post(\'https://www.cnblogs.com\',proxies=proxies,verify=False)
print(res)

django后端获取ip

ip= request.META.get(\'REMOTE_ADDR\')

实操

爬取某视频网站

import re

import requests
from requests.packages import urllib3
urllib3.disable_warnings()
res = requests.get(\'https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=2\',verify=False)

# 解析出真正的地址
video_list=re.findall(\'<a href="(.*?)" class="vervideo-lilink actplay">\',res.text)
for i in video_list:

    # 拿出视频id
    video_id = i.split(\'_\')[-1]
    # 拼接真实地址
    real_url = \'https://www.pearvideo.com/\'+i
    heads = 
        \'Referer\': f\'https://www.pearvideo.com/video_video_id\'
        
    res1 = requests.get(f\'https://www.pearvideo.com/videoStatus.jsp?contId=video_id&mrd=0.44340819553576494\',
                        headers=heads).json()
    # 通过观察返回结果得知视频链接是在res1[\'videoInfo\'][\'videos\'][\'srcUrl\']里
    mp4_url=res1[\'videoInfo\'][\'videos\'][\'srcUrl\']
    # 拿出来的链接,还是不能访问,回到网站观察标签和我们生成出来的地址作对比发现。
    # https://video.pearvideo.com/mp4/short/20171204/    1678938313577    -11212458-hd.mp4
	# https://video.pearvideo.com/mp4/short/20171204/     cont-1212452    -11212458-hd.mp4
    # 对数据做处理
    ret=mp4_url.replace(mp4_url.split(\'/\')[-1].split(\'-\')[0],f\'cont-video_id\')
    print(ret)

爬取新闻

import requests
for i in range(1,100):
    res = requests.get(f\'https://www.autohome.com.cn/all/i/#liststart\')
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(res.text,\'html.parser\')
    # 找到属性为article的ul标签
    ul_list = soup.find_all(name=\'ul\',class_=\'article\')
    for ul in ul_list:
        li_list = ul.find_all(name=\'li\')
        for li in li_list:
            h3 = li.find(name=\'h3\')
            if h3:
                title = h3.text
                url = \'https:\' + li.find(\'a\').attrs[\'href\']
                desc = li.find(\'p\').text
                img =  li.find(\'img\').attrs[\'src\']
                if \'https:\' not in img:
                    img= \'https:\'  + img
                print(f"""
                新闻标题:title,
                新闻链接:url,
                新闻标题:desc,
                新闻图片:img
                """)

以上是关于requests高级用法的主要内容,如果未能解决你的问题,请参考以下文章

python+requests——高级用法——将请求打包

python+requests——高级用法——代理和认证——重点

python+requests——高级用法——处理cookie——重点

python+requests——高级用法——会话——重点源码

第61天:Requests的高级用法

第61天:Requests的高级用法