requests代理使用以及其他操作

本文详细介绍了requests模块的使用,包括SSL证书处理、超时设置、异常处理和文件上传。重点讨论了代理的运用,解释了为何需要代理,提供了代理服务器的实例,并简单介绍了如何搭建和使用代理池。同时,文中分享了requests在实际应用中的案例,如Peer Video和AutoHome的抓取,涉及到视频解析、多线程爬取以及网页内容解析等技巧。

一、requests其他操作

1.requests之ssl
https=http+ssl(ssl证书:第三方证书):传输过程中加密了,可以截获到。

大部分网站都是https,需要证书验证,代码怎么改进呢?
解决:
1、强制使用http连接不验证证书

verify=False

2、携带上证书

cert=('/path/server.crt', '/path/key')

示例:

import requests
respone = requests.get('https://www.12306.cn')  # 如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端
# 改进1:去掉报错,但是会报警告
import requests
respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200
print(respone.status_code)
# 改进2:去掉报错,并且去掉警报信息
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
respone=requests.get('https://www.12306.cn',verify=False)
print(respone.status_code)
# 改进3:加上证书
# 很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
# 知乎、百度等都是可带可不带
# 有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站
import requests
respone = requests.get('https://www.12306.cn',
                       cert=('/path/server.crt',
                             '/path/key'))
print(respone.status_code)

2.requests之超时设置
加上timeout参数

import requests
respone=requests.get('http://127.0.0.1:8000',timeout=3)
print(respone.status_code)

3.requests之异常处理
加上try...except...

import requests
from requests.exceptions import *

try:
    respone = requests.get('http://127.0.0.1:8000', timeout=3)
    print(respone.status_code)
except ReadTimeout:
    print('===:')
except ConnectionError:  # 网络不通
    print('-----')
except Timeout:
    print('aaaaa')
except RequestException:
    print('Error')
except Exception as e:
    print(e)

4.requests之上传文件
加上参数files

import requests

files = {'file': open('a.jpg', 'rb')}
respone = requests.post('http://httpbin.org/post', files=files)
print(respone.status_code)

补充:
老款的路由器的认证 ,公司内部可能会看到

import requests
from requests.auth import HTTPBasicAuth
r=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
print(r.status_code)

# HTTPBasicAuth可以简写为如下格式
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)

requests与其他服务交互的实际应用---->短链生成
在这里插入图片描述

二、requests使用代理

为什么使用代理?
因为网站访问频率过高,会封ip、限制ip访问次数(后端频率类)。

使用代理,隐藏访问者ip(正向代理)

代理服务器

  • 免费的:不稳定,不好用
  • 收费:稳定,好用

示例:

import requests

proxies = {'http': 'http://117.68.194.189:1133', }
response=requests.get('http://127.0.0.1:8000/',proxies=proxies)
print(response.text)

目前写死了,后期我想,每次访问,随机取一个,把一堆字典,放到列表中,每次从列表中取一个(简单的代理池)
自己爬取免费代理网站,解析出ip地址,组装成字典。

# 基于别人开源的项目,搭建一个可用的代理池 (python+flask+爬虫+redis)
from threading import Thread

def task():
    res = requests.get('http://demo.spiderpy.cn/get/').json()['proxy']
    print(res)

for i in range(10000):
    t = Thread(target=task)
    t.start()

搭建免费代理池:
1、下载代码

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

2、安装依赖

pip3 install -r requirements.txt

3、修改setting.py中的redis连接

DB_CONN = 'redis://127.0.0.1:6379/2'

在这里插入图片描述
4、运行

  • 启动调度程序:python proxyPool.py schedule
  • 启动webApi服务:python proxyPool.py server

三、实际应用

1.Peer Video

import requests
import re

res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0')
# print(res.text)
# 解析出视频地址 re

video_list = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
# print(video_list)

for video in video_list:
    video_id = video.split('_')[-1]
    video_url = 'https://www.pearvideo.com/' + video
    # print(video_url)
    # res=requests.get(video_url)
    # print(res.text)
    #
    # break

    # 第一层反爬,需要带referfer头
    header = {
        'Referer': 'https://www.pearvideo.com/%s' % video
    }
    # print(video_id)
    res = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.4930470461853751' % video_id,
                       headers=header)

    mp4_url = res.json()['videoInfo']['videos']['srcUrl']
    mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0], 'cont-%s' % video_id)

    # 下载视频
    res_video = requests.get(mp4_url)
    with open('./viode/%s.mp4' % video_id, 'wb') as f:
        for line in res_video.iter_content(1024):
            f.write(line)
"""
不能播放的:
https://video.pearvideo.com/mp4/third/20211014/    1634271064903   -11980839-104649-hd.mp4
https://video.pearvideo.com/mp4/third/20211014/    cont-1743691   -11980839-104649-hd.mp4

# mp4_url='https://video.pearvideo.com/mp4/third/20211014/      1634271064903   -11980839-104649-hd.mp4'
# mp4_url=mp4_url.replace(mp4_url.split('/')[-1].split('-')[0],'cont-%s'%video_id)
"""

注:
页面解析出视频地址不能直接播放,需要进一步处理;
第一层反爬,需要带referfer头。

多线程爬取:

import requests
import re
from concurrent.futures import ThreadPoolExecutor


def get_page(url, vid):
    res_video = requests.get(url)
    return {'res_video': res_video, 'vid': vid}


def parse_page(result):
    # 下载视频
    result = result.result()
    with open('./video/%s.mp4' % result['vid'], 'wb') as f:
        for line in result['res_video'].iter_content(1024):
            f.write(line)


def callback():
    # 获得一个线程池对象 = 开启线程池
    tp = ThreadPoolExecutor(10)
    # 循环urls列表
    res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0')
    video_list = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
    for video in video_list:
        video_id = video.split('_')[-1]
        # 第一层反爬,需要带referfer头
        header = {
            'Referer': 'https://www.pearvideo.com/%s' % video
        }
        res = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.4930470461853751' % video_id,
                           headers=header)
        mp4_url = res.json()['videoInfo']['videos']['srcUrl'].replace(
            res.json()['videoInfo']['videos']['srcUrl'].split('/')[-1].split('-')[0], 'cont-%s' % video_id)
        # 得到一个future对象 = 把每一个url提交一个get_page任务
        ret = tp.submit(get_page, mp4_url, video_id)
        # 给future对象绑定一个parse_page回调函数
        ret.add_done_callback(parse_page)  # 谁先回来谁就先写结果进文件


if __name__ == '__main__':
    callback()

2.AutoHome
使用bs4解析html
安装:pip3 install beautifulsoup4

import requests
from bs4 import BeautifulSoup

res = requests.get('https://www.autohome.com.cn/news/1/#liststart')

# print(res.text)
# 第一个参数,要解析的文档,第二个参数,解析的解析器('html.parser')
soup = BeautifulSoup(res.text, 'html.parser')

# res=soup.find_all(class_='article',name='ul')
ul_list = soup.find_all(name='ul')
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  # 拿出h3标签的文本内容
            # print(title)
            url = 'http:' + li.find('a').attrs['href']
            # print(url)
            img_url = li.find(name='img').attrs['src']
            # print(img_url)
            desc = li.find('p').text
            # print(desc)

            print('''
            新闻标题:%s
            新闻连接:%s
            新闻图片:%s
            新闻摘要:%s

            ''' % (title, url, img_url, desc))

# 入库:mysql,建表,字段,pymysql

总结:
requests模块其他操作

  • 模拟发送http请求的模块---->原来从浏览器中发出的请求,使用它模拟---->解析

  • ssl认证

  • 基本认证

  • 超时

  • 异常处理

  • 代理(重点)
    反向代理,正向代理
    正向代理:http、https代理,透明和高匿,透明是不隐藏客户端ip
    http的请求头中,X-Forwarded-For:client, proxy1, proxy2

  • 代理池
    每次随机从代理池中取一个代理
    使用第三方:爬免费的,放到redis中

  • cookie池
    登录认证过后的cookie

  • 上传文件

  • Peer Video
    视频 xx.mp4 放在了返回的数据中
    两层反爬:referer,视频真正的地址和返回的地址是不一样的

  • AutoHome
    bs4的基本使用:find、find_all

  • blibli

  • 西瓜Video----搜索mp4----解析json----base64解码----视频、音频分轨----音视频合并(使用ffmpeg)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妍婧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值