首页 > 其他分享 >requests高级用法,代理池搭建, 爬取某视频网站,爬取新闻

requests高级用法,代理池搭建, 爬取某视频网站,爬取新闻

时间:2023-03-16 21:23:35浏览次数:40  
标签:get res 用法 爬取 https print import requests

requests高级用法,代理池搭建, 爬取某视频网站,爬取新闻

requests高级用法

1.0 解析json

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

import requests

data = {
    'cname': '',
    'pid': '',
    'keyword': '500',
    'pageIndex': 1,
    'pageSize': 10,
}
res = requests.get(' https://ug.baidu.com/mcp/pc/pcsearch',data=data)
print(res.text)
print(type(res.json()))

1.1 ssl认证(了解)

'''http和https的区别'''

http(端口是443)是明文传输
https(端口是80)=http+ ssl/tsl,https是在加密之后传输的,在http上又加了一层处理加密信息的模块,比http安全,可防止数据在传输过程中被窃取,改变,确保了数据的完整性

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 手动携带证书(了解)
    import requests
    respone=requests.get('https://www.12306.cn',
                         cert=('/path/server.crt',
                               '/path/key'))
    print(respone.status_code)

1.2 使用代理(重要)

'''如果爬虫使用自身的ip地址访问,很有可能IP地址被封,以后就访问不了,我们可以用代理的IP,有收费和免费两种,免费的一般不稳定'''

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

# 高匿代理和透明代理
	-高匿,服务端拿不到真实客户端的ip地址
    -透明:服务端能拿到真实客户端的ip地址

image

import requests

res = requests.get('https://www.cnblogs.com',proxies={'http':'27.79.236.66:4001'})
print(res.status_code)

image

后端如何拿到真实客户端ip地址
	-http请求头中有个:X-Forwarded-For: client1, proxy1, proxy2, proxy3
    -x-forword-for
    -获得HTTP请求端真实的IP
    
'''X-Forwarded-For(XXF):是用来识别通过HTTP代理或者负载方式连接到WEB服务器的客户端最原始的IP地址的http请求头字段。XFF的有效性依赖于代理服务器提供的连接原始IP地址的真实性,因此,XFF的有效使用应该保证代理服务器是可信的,比如可以通过创建可信服务器白名单的方式。'''

1.3 超时设置

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

1.4 异常处理

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')

1.5 上传文件

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

image

代理池搭建

'''github开源的,代理池的代码,本地跑起来'''
    爬虫技术:爬取免费的代理网站,获取免费代理,验证过后,存到本地
    使用flask搭建一个web后端,访问某个接口就可以随机返回一个可用的代理
    https://github.com/jhao104/proxy_pool

1 git clone https://github.com/jhao104/proxy_pool.git
2 创建虚拟环境,安装依赖:pip install -r requirements.txt
3 修改配置文件settings.py   ---》redis服务启动
        # 配置API服务
        HOST = "0.0.0.0"               # IP
        PORT = 5000                    # 监听端口
        # 配置数据库

        DB_CONN = 'redis://127.0.0.1:8888/0'
        # 配置 ProxyFetcher
        PROXY_FETCHER = [
            "freeProxy01",   
            "freeProxy02",
        ]
4 启动爬虫,启动web服务
        # 启动调度程序
        python proxyPool.py schedule
        # 启动webApi服务
        python proxyPool.py server

5 随机获取ip
        127.0.0.1:5000/get

image

image

        
# 使用随机代理发送请求
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.post('http://www.cnblogs.com',proxies=proxies,verify=False)
print(res)

image

2.1 django后端获取客户端的ip

# 路由
path('', index),
# 视图函数
def index(request):
    ip = request.META.get('REMOTE_ADDR')
    print('ip地址是', ip)
    return HttpResponse(ip)

image

from threading import Thread
import requests

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


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

爬取某视频网站

# 以爬取梨视频为例
import re
# res = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=1779949&mrd=0.46890768173201436')
res = requests.get('https://www.pearvideo.com/')
# print(res.text)
# 解析出真正视频地址
video_list = re.findall('<a href="(.*?)" class="actwapslide-link">',res.text)
# print(video_list)
for i in video_list:
    # https://www.pearvideo.com/video_1779949
    # i=video_1779949
    video_id = i.split('_')[-1]
    real_url = 'https://www.pearvideo.com/' + i
    # print(real_url)
    headers ={
        'Referer': 'https://www.pearvideo.com/video_%s' % video_id
    }
    res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.46890768173201436' % video_id,headers=headers).json()
    # print(res1.text)
    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)

image

爬取新闻


import requests
from bs4 import BeautifulSoup

res = requests.get('https://www.autohome.com.cn/all/1/#liststart')
# print(res.text)
# 第一个参数是要解析的文本str   第二个参数是解析的解析器    html.parser:内置解析器,lxml:第三方的解析器
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')
    # print(li_list)
    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(name='img').attrs['src']
            print('''
            新闻标题:%s
            新闻连接:%s
            新闻摘要:%s
            新闻图片:%s
            ''' % (title,url,desc,img))

image

标签:get,res,用法,爬取,https,print,import,requests
From: https://www.cnblogs.com/zx0524/p/17224199.html

相关文章