首页 > 其他分享 >requests高级用法和代理池搭建

requests高级用法和代理池搭建

时间:2023-03-16 21:24:49浏览次数:57  
标签:http res 用法 https print requests com 搭建

目录
面试题

-可变类型不可变类型
	- 你常用的魔法方法---》某种情况会自动触发
    	-__init__  类()--->对象进行初始化
        -__new__   类()---->产生对象---》触发__init__完成对象初始化
        -__call__  person=Person()--->对象加括号  person()---》触发
        -__getattr__  对象.属性,属性不存在,触发
        -__setattr__  对象.属性=值, 触发
        -__getitem__  对象['属性'],属性不存在,触发
        -__setitem__  对象['属性']=值, 触发
        -上下文管理器:只要重写了__enter__  __exit__ 方法,就具备这个能力
        	with 对象 as xx:
            	1 写了一行代码,触发__enter__的执行
            2 写了一行代码,触发__exit__,做一些资源清理工作
            
        -剩下的:https://www.cnblogs.com/liuqingzheng/articles/9949568.html
   - 类中的装饰器
	-classmethod
    -staticmethod
    -如何把方法包装成数据属性 propty装饰器
    -类中如何隐藏属性
    	__属性、方法
        
   -双写一致性
   -断点续传
    	-迅雷多线程下载
   -内网穿透:https://zhuanlan.zhihu.com/p/370483324
   -缓存击穿

image

正向代理和反向代理
https://www.cnblogs.com/liuqingzheng/p/10521675.html

http请求头
	-referer:是http请求头中的一个数据,记录从哪个页面跳转过来的
    	-图片防盗链
        -反扒

image

requests高级用法

1.0解析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)  # json 格式字符串---用json.cn工具转化
print(type(res.json()))  # 转成对象  字典对象

image

2.ssl认证--了解

http协议

HTTP协议以明文方式发送内容,不提供任何方式的数据加密。HTTP协议不适合传输一些敏感信息

https协议:http+ssl/tsl

https则是具有安全性的ssl加密传输协议。HTTP+ SSL / TLS,也就是在 http上又加了一层处理加密信息的模块,比 http安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性

详细了解前往:https://zhuanlan.zhihu.com/p/561907474

image

解决证书提示错误问题

  1. 不验证证书---加入verify=False

    import requests
    respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200
    print(respone.status_code) # 200
    
  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. 手动携带证书-了解

    import requests
    respone=requests.get('https://www.12306.cn',
                         cert=('/path/server.crt',
                               '/path/key'))
    print(respone.status_code)
    

3.使用代理(重要)

爬虫程序在爬取数据时,经常需要对同一个站点进行多次高频率的访问,而这种访问很容易被站点服务器所识别出,有很高的几率被拉黑封锁。而通过代理IP就可以让站点服务器认为每一次访问都来自于不同的用户,从而避免站点服务器的封锁。

image

使用代理的目的

  1. 隐藏您的真实源计算机的IP地址,防止自身ip地址被封。

  2. 更可靠地从网站挖掘数据,从而减少被阻止或禁止的机会。

  3. 从任何地理区域或设备发出请求,允许您抓取特定于区域

代理ip分类

  1. 收费和免费代理(不稳定)

    免费代理网址

    # res = requests.post('https://www.cnblogs.com',proxies={'http':'地址+端口'})
    
    # res = requests.post('https://www.cnblogs.com',proxies={'http':'27.79.236.66:4001'})
    res = requests.post('https://www.cnblogs.com',proxies={'http':'60.167.91.34:33080'}) # 输入代理的ip和端口
    print(res.status_code)
    
  2. 高匿代理和透明代理

    高匿代理:服务端拿不到真实客户端的ip地址
    透明代理:服务端能拿到真实客户端的ip地址
    
    #后端如何拿到真实客户端ip地址
        -http请求头中有个:X-Forwarded-For: client1, proxy1, proxy2, proxy3
        -x-forword-for
        -获得HTTP请求端真实的IP
        
        代理过程:请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。
    

image

4.超时设置

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

5.异常处理

import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型

try:
    r = requests.get('http://www.baidu.com',timeout=0.0004)
    print(r.status_code)
    print(r.text) #200
except ReadTimeout:
    print('===:')
except ConnectionError: #网络不通
    print('-----')
except Timeout:
    print('aaaaa')

except RequestException:
    print('Error')

6.上传文件

import requests
files = { 'file':open('12.png','rb')}
res = requests.post('http://httpbin.org/post',files=files)
print(res.status_code)

代理池搭建

requests 发送请求使用代理,代理公司花钱或者搭建免费的代理池

免费代理池
   -python:爬虫——flask写的
   -架构

image

1. 代理池搭建

免费代理池:https://github.com/jhao104/proxy_pool

1. git clone https://github.com/jhao104/proxy_pool.git
2.使用pycharm打开
3.安装依赖:pip install -r requirements.txt
4.修改配置文件(redis地址即可)
    HOST = "0.0.0.0"
    PORT = 5010
    DB_CONN = 'redis://127.0.0.1:6379/0'
    PROXY_FETCHER #爬取哪些免费代理网站
5.启动爬虫程序
    python proxyPool.py schedule
6.启动服务器
    python proxyPool.py server
7.使用随机一个免费代理--all获取所有代理---详细请看介绍
    地址栏中输入:http://127.0.0.1:5010/get/
            
            
# 使用随机代理发送请求
import requests

from requests.packages import urllib3
urllib3.disable_warnings()# 关闭警告
# 获取代理
res = requests.get('http://127.0.0.1:5010/get/').json()
# print(res)
"""
{"count":52,"http_type":{"http":37,"https":15},"source":{"freeProxy02":1,"freeProxy03":5,"freeProxy05":1,"freeProxy06":23,"freeProxy07":8,"freeProxy09":10,"freeProxy10":6}}
"""
proxies = {}
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)

image

2.django后端获取客户端的ip

# 建立django后端---》index地址---》访问就返回访问者的ip
# django代码---》不要忘记改配置文件
# 路由
path('', index),
# 视图函数
def index(request):
    ip = request.META.get('REMOTE_ADDR')
    print('ip地址是', ip)
    return HttpResponse(ip)

# 测试端:

# import requests
# from requests.packages import urllib3
# urllib3.disable_warnings() #关闭警告
# # 获取代理
# res = requests.get('http://127.0.0.1:5010/get/').json()
# proxies = {}
# if res['https']:
#     proxies['https'] = res['proxy']
# else:
#     proxies['http'] = res['proxy']
#
# print(proxies)
# res=requests.get('http://101.43.19.239/', proxies=proxies,verify=False)
# print(res.text)


from threading import Thread
import requests

def task():
    res = requests.get('http://101.43.19.239/')
    print(res.text)

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

3.爬取某视频网址

# 梨视频

import requests
import re

res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0')
# print(res.text)
# 解析出真正视频地址
video_list = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
# print(video_list)
for i in video_list:
    # i='video_1212452'
    video_id = i.split('_')[-1]
    real_url = 'https://www.pearvideo.com/' + i
    # print('真正视频地址是:',real_url)
    #Referer图片防盗链
    headers = {
        'Referer': 'https://www.pearvideo.com/video_%s' % video_id
    }
    res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.29636538326105044' % video_id,
                        headers=headers).json()
    # print(res1["videoInfo"]['videos']['srcUrl'])
    mp4_url = res1["videoInfo"]['videos']['srcUrl']
    mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0], 'cont-%s' % video_id)
    print(mp4_url)
    res2 = requests.get(mp4_url)
    with open('./video/%s.mp4' % video_id, 'wb') as f:
        for line in res2.iter_content():
            f.write(line)

# headers={
#     'Referer': 'https://www.pearvideo.com/video_1212452'
# }
# res=requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=1212452&mrd=0.29636538326105044',headers=headers)
#
# print(res.text)


# https://video.pearvideo.com/mp4/short/20171204/    1678938313577    -11212458-hd.mp4
# https://video.pearvideo.com/mp4/short/20171204/     cont-1212452    -11212458-hd.mp4

mp4_url = 'https://video.pearvideo.com/mp4/short/20171204/  1678938313577-11212458-hd.mp4'



# 好看视频
import requests
import re

res = requests.get('https://haokan.baidu.com/videoui/api/Getvideolandfeed?time=1678965322940').json()

print(res)

video_list = res['data']['apiData']

l1 = []
for i in video_list:
    # l1.append(i['previewUrlHttp'])
    title =i['title']
    video = i['previewUrlHttp']
    # print(i['previewUrlHttp'])
    with open('video/%s.mp4'%title,'w') as f:
        for line in video:
            f.write(line)

4.爬取新闻

from .models import New

def index(request):
    # ip = request.META.get('REMOTE_ADDR')
    # print('ip地址是:',ip)  # 127.0.0.1
    # return HttpResponse(ip)
    import requests
    from bs4 import BeautifulSoup

    blog_page_link = 'https://www.autohome.com.cn/all/%s/#liststart'
    all_list = []  # 定义一个列表
    for i in range(100):  # 确保100大于总页数
        page_link = blog_page_link % i
        res = requests.get(page_link, proxies={'http': '89.252.152.191:2019'})

        soup = BeautifulSoup(res.text, 'html.parser')
        ul_list = soup.find_all(name='ul', class_='article')
        for i in ul_list:
            li_list = i.find_all(name='li')
            # print(len(li_list))
            for li in li_list:
                h3 = i.find(name='h3')
                if h3:  # 不是广告
                    title = h3.text
                    if li.find('a'):
                        url = 'https:' + li.find('a').attrs['href']
                        desc = li.find('p').text
                        img = li.find(name='img').attrs['src']
                        # print('''
                        #         新闻标题:%s
                        #         新闻连接:%s
                        #         新闻摘要:%s
                        #         新闻图片:%s
                        #         ''' % (title, url, desc, img))
                        New.objects.create(name=title,link=url,desc=desc,image=img)
                        return HttpResponse('成功')

标签:http,res,用法,https,print,requests,com,搭建
From: https://www.cnblogs.com/zhanglanhua/p/17224193.html

相关文章