爬虫02--requests库其他操作、免费代理池和案例

1.requests之ssl,超时设置,认证设置,处理异常,上传文件 (了解)

# http+ssl=https :传输过程中加密了---》截获到,无法解密
# ssl证书:第三方证书

# 证书验证(大部分网站都是https)
import requests
respone=requests.get('https://www.12306.cn') # 如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端


# 1:强制使用http连接,不验证证书  (去掉报错,但是会报警告)
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)
# 超时设置

import requests
respone=requests.get('http://127.0.0.1:8000',timeout=3)
print(respone.status_code)
# 认证设置(了解)
# 官网链接:http://docs.python-requests.org/en/master/user/authentication/

# 旧时的认证 (现在的认证,都是post请求)
    弹出一个框,要求你输入用户名密码(与alter很类似),此时是无法获取html的,但本质原理是拼接成请求头发送

# 老款的路由器的认证,公司内部可能会看到
import requests
from requests.auth import HTTPBasicAuth
r=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
print(r.status_code)

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

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)   
# 上传文件 
import requests
files={'file':open('a.jpg','rb')}
respone=requests.post('http://httpbin.org/post',files=files)  # formdata格式
print(respone.status_code)

# 后端通过,request.FILES 获取文件的形式获取

2.requests使用代理

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

# 代理(重点)
    -反向代理,正向代理
    -正向代理:http,https代理,匿名度:透明和高匿

    透明是不隐藏客户端ip,服务器能看见真实的客户端ip
    通过http的请求头中 X-Forwarded-For字段
    X-Forwarded-For:client, proxy1, proxy2

# 使用代理,隐藏访问者ip,正向代理
    -代理服务器
    -免费的:不稳定,不好用
    -收费:稳定,好用
    
    
import requests

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

3.搭建免费代理池

# 本地搭建项目
  项目地址: https://hub.xn--p8jhe.tw/jhao104/proxy_pool

1.git clone https://github.com/jhao104/proxy_pool.git
2.pip3 install -r requirements.txt
3.修改setting.py 中的redis连接
4.运行
# 启动调度程序
python proxyPool.py schedule
# 启动webApi服务
python proxyPool.py server


# 或直接使用该项目的测试地址返回的ip代理 

# 简单使用
import requests

proxy = requests.get('http://demo.spiderpy.cn/get' ).json().get("proxy")
respone=requests.get('http://127.0.0.1:8000/',proxies={"http": "http://{}".format(proxy))
print(respone.text)

# 封装一下
import requests

def get_proxy():
    return requests.get("http://127.0.0.1:5010/get/").json()
                                                       
def delete_proxy(proxy):
    requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))

# your spider code

def getHtml():
    # ....
    retry_count = 5
    proxy = get_proxy().get("proxy")
    while retry_count > 0:
        try:
            html = requests.get('http://www.example.com', proxies={"http": "http://{}".format(proxy)})
            # 使用代理访问
            return html
        except Exception:
            retry_count -= 1
                                                       
    # 删除代理池中代理
    delete_proxy(proxy)
    return None      

4.爬取梨视频

import requests
import re


# 分析网址规律:?reqType=5&categoryId=9&start=0   文章分类id  文章起始位置
res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0')
print(res.text)  # 返回的xml数据

# 解析数据:视频文章id地址
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]  # 视频id
    video_url = 'https://www.pearvideo.com/' + video  # 视频文章详情页地址   
    
    # res=requests.get(video_url)   # 该请求就不用访问了,直接访问那个Ajax的请求
    # print(res.text)
    # 直接访问视频文章详情页地址,没有返回MP4格式的视频地址
    # 该网站规则时,访问该地址时,自动再发一个Ajax获取视频真正地址
    
    # 故需要,模拟发送这个Ajax请求 (https://www.pearvideo.com/videoStatus.jsp?contId=视频id&mrd=0.4930470461853751)
    # 访问发现:
      浏览器直接访问 和 从网站详情页访问  返回的数据不一样
      都是浏览器操作 说明User-Agent、cookie是一样的,那就是请求头的问题了 (对比发现:指定了referer)
    

    # 第一层反爬:需要带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']
    
    # 第二层反爬:需要将mp4_url地址进行部分替换
    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

5.爬取汽车之家

# 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
posted @   Edmond辉仔  阅读(159)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示