昨日回顾

面试题

# 面试题
-可变类型不可变类型
- 你常用的魔法方法---》某种情况会自动触发
-__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
-缓存击穿

迅雷文件分段下载:

将文件拆分成好几段。99%的时候特别慢。为什么?下载之前给文件取md5值,下载之后进行比较。如果下载之后文件不完整,就需要重新下。

断点续传:

本地文件存储当前下载到哪里。有一个专门用来做记录的文件。

requests-html:包装了解析库

内网穿透:

cookies内部也是key:value这种形式,用分号分隔。

图片防盗链实际上是校验请求头的reference。也就是查看请求是从哪里跳转过来的。

爬虫总结

# 1 爬虫是什么
-一个程序----》模拟发送http请求--->从网站,app,小程序---》获取数据---》清洗数据---》入库 # 2 爬虫的核心原理
-发送http请求,解析数据
-requests re # 3 requests模块---》大神---》基于python内置模块urllib3---》封装
-python界非常知名的库
-模拟发送http请求:postman也是发送http请求的 -python GUI
-tkinter:内置模块
-PyQT:python代码在qt平台写桌面应用 # 4 发送get请求,携带数据
request.get(地址,params=get请求的数据) # 5 发送请求请求头
heaser={
user-agent:
cookies:
referer }
request.get(headers=heaser) # 6 携带cookie 两种方式
1 直接放在请求头中:字符串 cookies:xx=dsads;ee=sasdfa
2 使用cookies参数request.get(cookies={}/cookieJar) # 7 发送post请求
request.post(,data,json)
# 8 requests.session()----->保持cookie,以后不用手动携带,自动处理
# 9 响应对象
Response对象
-text
-content
-cookies
# 10 编码问题
# 11 获取二进制数据
-下载图片,视频
-response.iter_content() # 6 http请求头
-referer:是http请求头中的一个数据,记录从哪个页面跳转过来的
-图片防盗链
-反扒

今日内容

1 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())) # 转成对象 字典对象

1.1 ssl认证(了解)

# http协议:明文传输
# https协议:http+ssl/tsl
HTTP+ SSL / TLS,也就是在 http上又加了一层处理加密信息的模块,比 http安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性
https://zhuanlan.zhihu.com/p/561907474
# 没有被认证过的机构,签发的证书,用的时候,浏览器会提示不安全 这里实际上也是使用了公钥私钥 进行非对称加密 # 以后遇到证书提示错误问题 ssl xxx
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 使用代理(重要)

X-Forwarded-For 里面是一个列表 可以拿到代理的地址 如果是高匿代理则拿不到client客户端的ip地址。

# 如果爬虫使用自身ip地址访问,很有可能被封ip地址,以后就访问不了了

# 我们可以使用代理ip
# 代理:收费和免费(不稳定) # 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'})
print(res.status_code) # 高匿代理和透明代理
-高匿,服务端拿不到真实客户端的ip地址
-透明:服务端能拿到真实客户端的ip地址 -后端如何拿到真实客户端ip地址
-http请求头中有个:X-Forwarded-For: client1, proxy1, proxy2, proxy3
-x-forword-for
-获得HTTP请求端真实的IP # X-Forwarded-For
X-Forwarded-For 里面是一个列表 可以拿到代理的地址 如果是高匿代理则拿不到client客户端的ip地址。

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 上传文件

# 3 上传文件
import requests
files = {'file': open('美女.png', 'rb')}
respone = requests.post('http://httpbin.org/post', files=files)
print(respone.status_code) # 补充
后缀名会跟软件做关联。会默认使用后缀名对应的软件打开。

2 代理池搭建

# requests 发送请求使用代理
# 代理从哪来
-公司花钱买
-搭建免费的代理池:https://github.com/jhao104/proxy_pool
-python:爬虫+flask写的
-架构:看下图 # github开源的,代理池的代码,本地跑起来
-爬虫技术:爬取免费的代理网站,获取免费代理,验证过后,存到本地
-使用flask搭建一个web后端,访问某个接口就可以随机返回一个可用的代理地址
-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地址即可)
# 配置API服务
HOST = "0.0.0.0" # IP
PORT = 5010 # 监听端口
# 配置数据库
DB_CONN = 'redis://127.0.0.1:6379/0'
PROXY_FETCHER # 爬取哪些免费代理网站
5 启动爬虫程序
# 启动调度程序
python proxyPool.py schedule
6 启动服务端
# 启动webApi服务
python proxyPool.py server 7 使用随机一个免费代理
地址栏中输入: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()
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)
# res = requests.post('https://www.cnblogs.com')
print(res)

代理还需要验证是否能用。需要指定爬取哪里的免费代理。

查看代理池:

启动服务器,通过get访问:

使用免费代理可能会比较慢。

2.1 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(10000000):
t = Thread(target=task)
t.start()

helloworld级别的业务即使开很多线程,也不会对服务器造成很大的影响:

注意:相关django配置文件需要星号允许、所有域访问,需要删除数据库相关配置。

jmeter压力测试工具。json解析网站,json.cn。

评论加密:

去js代码中找解密的代码。

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

第一次请求没有返回真正的数据,而是再发送了一个请求,将视频地址拿回来。

第二次请求 ,还是不能直接访问:

是因为请求头多了一个referer:

拿到真正的视频链接:

但是这些视频不能之间访问,会报404.

拿出能播放的地址,和不能播放的地址进行比较。

去水印、视频拼接可以使用:ffmpeg

4 爬取新闻

import requests
# pip install beautifulsoup4 解析xml的库
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标签 find_all
ul_list = soup.find_all(name='ul', class_='article')
for ul in ul_list:
li_list = ul.find_all(name='li')
# print(len(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)) # 把所有图片下载到本地,把爬完的数据,存到mysql中---》pymysql---》commit

练习


# 1 多线程5页爬视频
# 2 爬100页新闻,存到mysql,图片下载到本地 # 什么是反向代理,什么是正向代理
https://www.cnblogs.com/liuqingzheng/p/10521675.html

【python爬虫】requests高级用法 代理池搭建 爬虫实战的更多相关文章

  1. 爬虫—Requests高级用法

    Requests高级用法 1.文件上传 我们知道requests可以模拟提交一些数据.假如有的网站需要上传文件,我们也可以用requests来实现. import requests files = { ...

  2. 技术分享:Proxy-Pool代理池搭建IP代理

    技术分享:Proxy-Pool代理池搭建IP代理 前言本章内容仅供参考,不涉及实际使用,主要使用Python环境和Redis数据库进行环境搭建,工具网盘存储如下,有问题可以私聊我.网址:https:/ ...

  3. python requests 高级用法

    高级用法 本篇文档涵盖了 Requests 的一些高级特性. 会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 url ...

  4. (转)python requests 高级用法 -- 包括SSL 证书错误的解决方案

    我在使用requests访问某个https网站时出现错误  error::SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify fai ...

  5. python requests 高级用法 -- 包括SSL 证书错误的解决方案

    Session Objects会话对象 Session对象在请求时允许你坚持一定的参数.此外,还坚持由Session实例的所有请求的cookie. 让我们坚持在请求时使用 s = requests.S ...

  6. python爬虫——requests库使用代理

    在看这篇文章之前,需要大家掌握的知识技能: python基础 html基础 http状态码 让我们看看这篇文章中有哪些知识点: get方法 post方法 header参数,模拟用户 data参数,提交 ...

  7. ip代理池的爬虫编写、验证和维护

    打算法比赛有点累,比赛之余写点小项目来提升一下工程能力.顺便陶冶一下情操 本来是想买一个服务器写个博客或者是弄个什么FQ的东西 最后刷知乎看到有一个很有意思的项目,就是维护一个「高可用低延迟的高匿IP ...

  8. Proxypool代理池搭建

    个人博客:点我 前言 项目地址 : https://github.com/jhao104/proxy_pool 这个项目是github上一个大佬基于python爬虫制作的定时获取免费可用代理并入池的代 ...

  9. requests高级用法

    会话对象 当你向同一主机发送多个请求时,session会重用底层的tcp连接,从而提升性能,同时session也会为所有请求保持 cookie. # _*_ coding: utf-8 _*_ imp ...

  10. Python - 定时动态获取IP代理池,存放在文件中

    定时功能通过module time + 死循环实现,因为time.sleep()会自动阻塞 get_ip_pool.py """ @__note__: while Tru ...

随机推荐

  1. 视觉BEV基本原理和方案解析

    BEV(Bird's-Eye-View)是一种鸟瞰视图的传感器数据表示方法,它的相关技术在自动驾驶领域已经成了"标配",纷纷在新能源汽车.芯片设计等行业相继量产落地.BEV同样在高 ...

  2. MySQL概述安装

    一,数据库概述 1.为什么要使用数据库 将数据持久化. 持久化主要作用:是将内存中的数据库存储在关系型数据库中,本质也就是存储在磁盘文件中. 数据库在横向上的存储数据的条数,以及在纵向上存储数据的丰富 ...

  3. 又一个涵盖前后端+DevOps+OpenAI大模型的高并发项目启动了

    大家好,我是冰河~~ 今天,正式通知大家一件事情:又到了启动新项目的时候,这也是 冰河技术 知识星球继 Seckill秒杀系统 项目后,又一个高并发实战项目.星球其他项目与专栏,大家可移步到冰河的个人 ...

  4. Python+Yolov8+ONNX实时缺陷目标检测

    相比于上一篇Windows10+Python+Yolov8+ONNX图片缺陷识别,并在原图中标记缺陷,有onnx模型则无需配置,无需训练. 优化了程序逻辑,降低了程序运行时间,增加了实时检测功能 目录 ...

  5. TS版LangChain实战:基于文档的增强检索(RAG)

    LangChain LangChain是一个以 LLM (大语言模型)模型为核心的开发框架,LangChain的主要特性: 可以连接多种数据源,比如网页链接.本地PDF文件.向量数据库等 允许语言模型 ...

  6. html字间距怎么设置?

    在HTML中,可以通过CSS来设置字间距.字间距指的是字符之间的空白区域,在网页设计中,修改字间距可以改变文字的外观和排版效果.下面详细介绍如何使用CSS来设置字间距. 使用letter-spacin ...

  7. C++ Qt开发:使用关联容器类

    当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念.顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构.它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的 ...

  8. ASP.NET Core 8 在 Windows 上各种部署模型的性能测试

    ASP.NET Core 8 在 Windows 上各种部署模型的性能测试 我们知道 Asp.net Core 在 windows 服务器上部署的方案有 4 种之多.这些部署方案对性能的影响一直以来都 ...

  9. 江西财经大学第一届程序设计竞赛 H题- 小P的数学问题

    题目链接:https://www.nowcoder.com/acm/contest/115/H 解题思路:分块打表!!! 什么是分块打表呢??? 从这道题我们知道我们要找到最多1*e9的阶乘 那循环暴 ...

  10. 数字孪生和GIS融合为智慧水利带来了什么?

    数字孪生和GIS的融合为智慧水利领域带来了巨大的变革和机遇.数字孪生技术的出现,使得水利管理者和决策者能够更好地理解和管理水资源,提高水利设施的效率和可持续性.而GIS作为空间数据管理和分析工具,为数 ...