爬虫初识,requests模块,requests模块之请求,requests模块之POST请求,POST请求应用之登陆github,自动携带cookie 的session对象,requests模块之响应体,ssl认证,使用代理(重要)
Ⅰ 爬虫初识
【一】Python爬虫简介
- Python爬虫是一种自动化获取互联网数据的技术,它通过编写程序实现自动访问网站并抓取所需的数据。
【二】爬虫的定义
- 爬虫是一种自动化获取互联网数据的技术,通过模拟浏览器行为,向目标网站发送请求并获取响应,然后解析响应中的数据。
- 应用领域:爬虫可以应用于各种网站数据的获取,如新闻、论坛、电商等。
【三】爬虫的工作原理
- 爬虫通过发送HTTP请求,模拟浏览器行为,获取网站的响应,并解析响应中的数据。
- 应用领域:爬虫可以用于数据分析和挖掘,如文本分析、情感分析等。
【四】爬虫的分类
【1】通用爬虫和定向爬虫
- 通用爬虫对整个互联网进行爬取
- 定向爬虫只针对特定的网站进行爬取。
【2】基于规则的爬虫和基于机器学习的爬虫
- 基于规则的爬虫基于人工事先定义的规则提取数据
- 基于机器学习的爬虫通过机器学习算法自动提取数据。
【3】单机爬虫和分布式爬虫
- 单机爬虫在单个计算机上运行
- 分布式爬虫通过多台计算机协同工作。
【五】Python爬虫的常用库
【1】requests库
- 用于发送HTTP请求,方便地发送GET、POST等请求,并获取响应。
- 应用领域:爬虫可以使用requests库来发送请求和获取响应。
【2】BeautifulSoup库
- 用于解析HTML和XML文档,方便地提取其中的数据。
- 应用领域:爬虫可以使用BeautifulSoup库来解析网页并提取需要的数据。
【3】Scrapy框架
- 提供了一套完整的爬虫开发流程,包括发送请求、获取响应、解析响应、存储数据等步骤。
- 应用领域:爬虫可以使用Scrapy框架进行爬虫开发。
【4】Selenium库
- 用于模拟浏览器行为,模拟用户在浏览器中的操作,如点击、输入等。
- 应用领域:爬虫可以使用Selenium库来模拟用户行为,获取需要的数据。
【六】爬虫的注意事项
【1】爬虫的合法性
- 在进行爬虫开发时,需要遵守相关的法律法规,如《计算机软件保护条例》、《互联网信息服务管理办法》等。
【2】爬虫的速度
- 需要注意爬虫的速度,避免对目标网站造成过大的负担。
【3】爬虫的稳定性
- 需要注意爬虫的稳定性,避免因为网络波动等原因导致爬虫中断。
【4】爬虫的数据存储
- 需要注意数据的存储方式,避免因为数据量过大导致存储不足。
【七】综上所述
- Python爬虫是一种自动化获取互联网数据的技术
- 常用库包括requests库、BeautifulSoup库、Scrapy框架和Selenium库等。
- 它在爬取网页数据、数据分析、自动化测试和机器学习等领域有广泛应用。
- 在进行爬虫开发时,需要遵守相关法律法规,注意爬虫的速度、稳定性和数据存储方式。
【八】爬虫相关的应用领域
【1】数据采集与挖掘
- 爬虫可以帮助从互联网上获取大量的数据,如新闻文章、商品信息、社交媒体内容等。这些数据可以被用于市场调研、舆情监控、数据分析等用途。
【2】搜索引擎
- 爬虫是搜索引擎的基础,通过爬虫程序可以自动抓取互联网上的网页内容,为搜索引擎建立索引,以便用户能够快速准确地搜索到所需的信息。
【3】价格比较与竞品分析
- 通过爬虫可以定期获取竞争对手的产品信息和价格,以便进行价格比较和竞品分析,从而提供有效的市场竞争策略。
【4】舆情监控与声誉管理
- 通过爬虫可以实时监测和分析社交媒体、论坛、新闻等渠道中与企业或个人相关的言论和评论,以及舆情走势,帮助企业及时了解公众对其品牌声誉和产品的看法,进行声誉管理和危机处理。
【5】公共数据监测与分析
- 政府机构可以利用爬虫技术监测和分析公共数据,如气象数据、环境数据、人口统计数据等,以便为决策提供及时的数据支持。
【6】金融市场分析
- 通过爬虫可以获取金融市场中的股票数据、财务报表、新闻公告等信息,为投资者提供决策参考。
【7】学术研究与文献检索
- 研究人员可以利用爬虫收集相关领域的学术论文、研究成果等信息,帮助他们进行学术研究和文献综述。
【8】其他
- 爬虫在自动化测试之外还广泛应用于数据采集、舆情监控、价格比较、金融市场分析等多个领域。
- 通过爬虫技术,能够高效地获取和处理大规模的数据,为各行各业带来便利和价值。
【九】爬虫的流程
【1】发送请求
- 首先需要确定目标网站的URL,并使用相关的库或框架发送HTTP请求。
- 通常使用GET或POST方法来获取网页数据。
- 请求可能包含一些额外的参数,如请求头、Cookie等,以便模拟真实的浏览器行为。
【2】获取响应
- 一旦成功发送请求,目标网站会返回一个HTTP响应。
- 这个响应通常包含网页的HTML代码和其他相关信息,如状态码、响应头等。
- 通过使用Python模块(如requests、selenium)可以获取到完整的响应内容。
【3】解析响应
- 通过使用解析库(如BeautifulSoup、lxml、re)或者正则表达式等方式,对获取到的HTML代码进行解析。
- 解析的目的是提取出我们所需的具体数据,如标题、链接、图片等,并进行进一步的处理。
- 可以根据网页的结构和特征,选择合适的解析工具,从而方便地提取出所需数据。
【4】存储数据
- 解析到有价值的数据后,需要将其进行存储,以便后续的使用和分析。
- 可以选择将数据保存到本地文件、数据库或其他存储介质中。
- 存储的方式可以依据具体需求和数据结构来进行选择,常用的存储方式包括存储到文件(如CSV、JSON、Excel)、存储到关系型数据库(如MySQL、PostgreSQL)、存储到非关系型数据库(如Redis、MongoDB)等。
【5】总结
- 爬虫的流程包括发送请求、获取响应、解析响应和存储数据等步骤,通过合理的设计和技术实现,可以快速、高效地从目标网站中提取所需的数据。
- 在实际爬取过程中,还需要考虑其他因素,如处理请求失败的情况、抓取策略的设计(如并发请求、延时等)、反爬虫措施的处理等。
- 此外,对于特殊情况下的动态网页,可能需要使用浏览器自动化工具(如Selenium)来模拟真实用户的操作,以获取页面的完整数据。
【十】常见的反爬虫措施
【1】频率限制
- 网站会针对某个IP地址或用户账号设置请求频率限制,如单位时间内只允许发送一定数量的请求。
- 一旦超出限制,网站会对该IP或账号进行处罚,如暂时封禁或限制访问。
【2】封IP和封账号
- 网站可以通过监测异常行为,如频繁请求、高并发等来判断是否有恶意爬取行为,并对相关IP地址或账号进行封禁。
- 为了规避封禁,爬虫可以使用代理池来随机切换IP地址,或使用大量小号(账号池)轮流发送请求。
【3】请求头中带加密信息
- 网站可能要求请求头中包含特定的加密信息,如Referer(来源页面地址)和User-Agent(浏览器标识),用于验证请求的合法性。
- 爬虫需要模拟真实浏览器的请求头信息,以避免被检测为非法爬虫。
【4】响应回来的数据是加密
- 为了防止直接获取数据,网站可能会对返回的数据进行加密或编码,爬虫需要解密或解码才能获取到有效信息。
- 这种情况下,爬虫可能需要分析加密算法或从其他渠道获取解密密钥。
【5】验证码反扒
- 网站为了防止机器自动注册、恶意爬取等行为,可能会在关键操作前设置验证码。
- 爬虫需要通过第三方平台或自己破解验证码来进行自动化操作。
【6】JS加密
- 网站可能使用JavaScript对核心代码进行了压缩和混淆,以 ers() -> function() 的形式, ers.somethin() -> function somethin() ,并添加了一些晦涩的加密方法。
- 爬虫需要逆向工程来还原和理解这些加密算法,并编写相应的代码进行解密。
【7】手机设备唯一ID号
- 网站可能会根据爬虫请求的设备唯一标识符(例如IMEI、Android ID、iOS设备ID等)进行识别和限制。
- 爬虫可能需要模拟不同设备的请求,或者通过修改设备信息达到绕过检测的效果。
需要注意的是,对于某些网站,爬虫绕过这些反爬虫措施可能涉及到违法行为,建议在合法范围内开展爬虫活动,遵守相关法律法规和网站的使用规定。
Ⅱ requests模块
【一】Requests模块简介
【1】简介
- Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。
- 它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。
- 是一个功能强大、简洁易用的第三方Python库,用于发送HTTP请求。
【2】来源
- 可以模拟发送http请求
- urlib2:内置库,不太好用,繁琐
- 封装出requests模块,应用非常广泛(公司,人)
- requests模块最初由Kenneth Reitz于2010年创建并开源,旨在提供一种更人性化的方式来发送HTTP请求。
- 它的出现填补了Python标准库中urllib和urllib2模块使用起来不够友好的问题。
【二】基础知识储备
【1】http协议特点
(1)基于 tCP/ip协议之上的应用层协议
- HTTP是一种应用层协议,用于定义客户端和服务器之间传输数据的规则。
- 与其他应用层协议如MySQL、Redis、MongoDB等不同,它使用的是基于请求-响应模式的交互方式。
(2)基于请求与响应的模型
- HTTP采用客户端主动发起请求,并等待服务器响应的模式。
- 这意味着服务端不能主动向客户端推送消息。
- 要实现主动推送消息,可以使用轮询、长轮询或WebSocket协议。
(3)无状态
- HTTP协议本身是无状态的,它不会保存客户端的状态信息。
- 为了在多个请求之间共享状态,常用的解决方案包括使用Cookie、Session和Token等机制来维持用户会话。
(4)短连接
- 每次请求-响应周期都需要建立和断开连接,这会对性能产生影响。
- 但从HTTP协议的设计角度来看,它是无连接的,即在收到响应后就断开连接。
- 然而,HTTP 1.1引入了持久连接,允许在一个TCP连接上发送多个HTTP请求,从而提高了性能效率。
- HTTP 2.0更进一步,可以在一个TCP连接上同时发送多个HTTP请求和响应。
【2】HTTP请求和详情的数据格式
请求格式:
- 请求首行 请求方法 请求路径 请求协议版本
- 请求头 键值对形式 cookie session
- 换行
- 请求体数据 GET请求的请求体带在浏览器地址上面 post 请求的请求提数据是以二进制数据传输的
【3】HTTP响应和详情的数据格式
响应格式:
- 响应首行 协议版本 状态码 状态码描述
- 响应头 键值对形式
- 换行
- 响应体数据 响应体数据格式的不同我们能够获取到不同格式的响应体数据 json / html / image / video
【4】浏览器调试
(1)调试模式
- 通过右键浏览器页面并选择调试模式,可以打开开发者工具,方便进行调试和查看页面的相关信息。
(2)Elements
- Elements面板用于查看和编辑网页的结构和内容,其中包括响应体中的HTML格式数据。
(3)Console
- Console面板是开发者用于在JavaScript中输出调试信息的窗口,在这里可以查看通过console.log()等方法输出的内容。
(4)Network
- Network面板用于监视和查看浏览器发送和接收的网络请求,包括AJAX请求。
- 可以查看所有请求或者仅显示XHR(XMLHttpRequest)请求。
【5】浏览器开发者模式
- 元素 就是渲染在当前页面上的所有源代码
- 控制台 可以控制当前页面文档对象和浏览器对象
- 源代码 你自己的项目源码结构
- 网络 捕获到所有发送和接收到的数据包 从网络入手
- 应用 存储当前页面中的部分数据 Cookie / session
【三】Requests模块基础使用
【1】安装
pip install requests
【2】导入模块
import requests
【3】爬虫流程
(1)确认请求网址
target_url = 'https://www.baidu.com/'
(2)发送请求,获取响应
response = requests.get(url=target_url)
(3)解析响应
# 乱码的原因是编码格式不一致 utf-8 / gbk
response.encoding = 'utf-8'
# 解析响应内容,响应内容格式是 txt 格式
page_text = response.text
print(page_text)
(4)存储数据
with open('baidu.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
(5)使用
import requests
# 确认请求网址
target_url = 'https://www.baidu.com/'
# 发送请求
# 获取响应
response = requests.get(url=target_url)
# 解析响应
# 乱码的原因是编码格式不一致 utf-8 / gbk
response.encoding = 'utf-8'
# 解析响应内容,响应内容格式是 txt 格式
page_text = response.text
print(page_text)
# 存储数据
with open('baidu.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
- baidu.html
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
Ⅲ requests模块之请求
【一】发送GET请求
【1】引入介绍
(1)HTTP默认的请求方法就是GET
- 没有请求体
- 数据必须在1K之内!
- GET请求数据会暴露在浏览器的地址栏中
(2)GET请求常用的操作
- 在浏览器的地址栏中直接给出URL,那么就一定是GET请求
- 点击页面上的超链接也一定是GET请求
- 提交表单时,表单默认使用GET请求,但可以设置为POST
(3)小结
- 在Python中,我们可以使用requests模块来发送HTTP请求。
- 其中,GET请求是最常用的一种请求方式,用于从服务器获取数据。
【2】导入模块
- 首先,我们需要通过import语句导入requests模块:
import requests
【3】发送请求
- 然后,我们可以使用get方法发送一个GET请求,并指定请求的URL
# 导入模块
import requests
# 定义请求地址
url = "https://www.baidu.com/"
# 发送请求获取响应数据
response = requests.get(url)
在上述代码中,url是我们要请求的目标URL。
- 发送GET请求后,服务器会返回一个响应对象,我们可以通过访问这个响应对象的属性和方法来获取服务器返回的数据。
- 其中,一些常用的属性和方法包括:
- status_code: 响应的状态码,例如200表示请求成功,404表示页面不存在等。
- text: 响应的内容,通常是服务器返回的HTML文本。
- json(): 将响应的内容解析为JSON格式。
【4】示例
- 演示如何发送GET请求并获取服务器返回的数据:
# 导入请求库
import requests
# 定义目标路由地址
url = "https://www.baidu.com"
# 发起GET请求,获取响应内容
response = requests.get(url)
# 判断当前请求是否成功,如果成功应该返回 200 OK
if response.status_code == 200:
# 打印响应内容 --- 文本类型即 text 类型的数据
response_text = response.text
print(response_text)
else:
print(f"当前请求数据失败!错误码: {response.status_code}")
【二】Get请求之携带参数
【1】携带请求头数据
- 常见的HTTP头部字段包括:
- Host:指定目标服务器的域名或IP地址。
- User-Agent:标识发送请求的用户代理(通常是浏览器)。
- PC浏览器
- APP浏览器
- Linux
- macOS
- Accept:指定客户端能够接收的内容类型。
- Content-Type:指定请求或响应中实体的媒体类型。
- Content-Length:指定实体主体的长度(以字节为单位)。
- Cookie:向服务器传递保存在客户端的cookie信息。
- Cache-Control:指定如何缓存和重新验证响应。
- Referer:大型网站通常都会根据该参数判断请求的来源
(1)携带请求载体headers
- headers又称载体标识
- 添加headers(浏览器会识别请求头,不加可能会被拒绝访问,
- 比如访问https://www.baidu.com/s?wd=周杰伦
[1]不携带请求载体标识 User-Agent
import requests
target_url = 'https://www.baidu.com/s?wd=周杰伦'
response = requests.get(url=target_url)
response.encoding = 'utf8'
print(response.text)
- 抓取不到内容
- 如果获取到的数据不是我们想要的数据并且会报错拦截
- 原因一定是你和浏览器不像
[2]主动携带请求载体标识 User-Agent
- 浏览器标识UA
# User-Agent 浏览器标识 : 能够让服务器识别出来我是正常的浏览器
# User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
- requests模块的UA
import requests
target_url = 'https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6'
response = requests.get(url=target_url)
# 打印请求中的请求头数据
print(response.request.headers)
# {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
- 携带浏览器标识获取到数据
import requests
target_url = 'https://www.baidu.com/'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}
response = requests.get(url=target_url, headers=headers)
response.encoding = 'utf8'
page_text = response.text
print(page_text)
# 结果获取到所有数据
[3] fake-useragent 模块 ---> 随机生成请求头
# 导入模块
from fake_useragent import UserAgent
# 随机生成UA标识
user_agent = UserAgent().random
print(user_agent)
# Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
- 随机UA模块使用
# fake-useragent 模块 ---> 随机生成请求头
# pip install fake-useragent
import requests
from fake_useragent import UserAgent
target_url = 'https://www.baidu.com/'
headers = {
"User-Agent": UserAgent().random
}
response = requests.get(url=target_url, headers=headers)
response.encoding = 'utf8'
page_text = response.text
print(page_text)
(2)小结
常见的HTTP头部字段包括:
- Host:指定目标服务器的域名或IP地址。
- User-Agent:标识发送请求的用户代理(通常是浏览器)。
- PC浏览器
- APP浏览器
- Linux
- macOS
- Accept:指定客户端能够接收的内容类型。
- Content-Type:指定请求或响应中实体的媒体类型。
- Content-Length:指定实体主体的长度(以字节为单位)。
- Cookie:向服务器传递保存在客户端的cookie信息。
- Cache-Control:指定如何缓存和重新验证响应。
- Referer:大型网站通常都会根据该参数判断请求的来源
【2】携带请求体参数
(1)方式一:直接复制目标网址发起请求
# https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6
import requests
from fake_useragent import UserAgent
target_url = "https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6"
headers = {
"User-Agent": UserAgent().random
}
response = requests.get(url=target_url,headers=headers)
response.encoding = 'utf8'
page_text = response.text
print(response.request.url)
print(page_text)
(2)方式二:主动编码
- 在浏览器中会默认对所有参数进行 URL 编码 ---> urlencode
import requests
from urllib.parse import urlencode
from fake_useragent import UserAgent
keyword = {
"wd": "周杰伦"
}
# print(urlencode(keyword,encoding="utf8"))
# wd=%E5%91%A8%E6%9D%B0%E4%BC%A6
# wd=%E5%91%A8%E6%9D%B0%E4%BC%A6
target_url = "https://www.baidu.com/s" + "?" + urlencode(keyword, encoding="utf8")
headers = {
"User-Agent": UserAgent().random
}
response = requests.get(url=target_url, headers=headers)
response.encoding = 'utf8'
page_text = response.text
print(response.request.url)
print(page_text)
(3)requests 自动编码
- requests 模块自带了一个帮助我们转码的参数
import requests
from urllib.parse import urlencode
from fake_useragent import UserAgent
keyword = {
"wd": "周杰伦"
}
target_url = "https://www.baidu.com/s"
headers = {
"User-Agent": UserAgent().random,
"Host": "www.baidu.com"
}
response = requests.get(url=target_url, headers=headers, params=keyword)
response.encoding = 'utf8'
page_text = response.text
print(response.request.url)
print(page_text)
【3】携带标识 cookies
# Cookie的作用就是为了保存登录信息
- 登录京东,然后从浏览器中获取cookies
- 以后就可以直接拿着cookie登录了,无需输入用户名密码
(1)方式一 : 直接携带在请求头中
import requests
from urllib.parse import urlencode
from fake_useragent import UserAgent
target_url = 'https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA'
headers = {
# 在请求头中携带 Cookie
"Cookie": ""
,
"User-Agent": UserAgent().random
}
response = requests.get(url=target_url, headers=headers)
page_text = response.text
with open('jd.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
# 在jd.html运行程序 可以直接越过输入账号密码登录京东
(2)方式二:携带在请求参数中
import requests
from urllib.parse import urlencode
from fake_useragent import UserAgent
target_url = 'https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA'
old_cookie= "__jdu=1532595302; shshshfpa=7039f951-868f-f778-7181-fe780b8522d6-1714277735; shshshfpx=7039f951-868f-f778-7181-fe780b8522d6-1714277735; pinId=Z1_JDHbj8Sgii5HUUfAJ-A; o2State={%22webp%22:true%2C%22avif%22:true%2C%22lastvisit%22:1718356806781}; 3AB9D23F7A4B3C9B=F24D7AB7THXWKKLWMF6TXJPULK4BEDBMP2NWEGTEZHSKIT2T5G3HBMBQXSFEEYQVC4YMZFVZHX3ORVTXSTZLO6T6AQ; unpl=JF8EALBnNSttDB8HVx4ETkJHTV9SW1kKSB9Ta2NQAV0MGFxVTgQaFxJ7XlVdWBRKER9vYxRXXFNPUw4eAisSEXteXVdZDEsWC2tXVgQFDQ8VXURJQlZAFDNVCV9dSRZRZjJWBFtdT1xWSAYYRRMfDlAKDlhCR1FpMjVkXlh7VAQrAh8QE09VUFxcC3sWM2hXNWRYUUpTBxgyGiIRex8AAlQOTRICbioFUF9bT1wBGQMYIhF7Xg; __jda=76161171.1532595302.1714277730.1718356805.1721048200.3; __jdc=76161171; 3AB9D23F7A4B3CSS=jdd03F24D7AB7THXWKKLWMF6TXJPULK4BEDBMP2NWEGTEZHSKIT2T5G3HBMBQXSFEEYQVC4YMZFVZHX3ORVTXSTZLO6T6AQAAAAMQWZ3Y6DIAAAAACVKTNUTEJGAB6EX; _gia_d=1; areaId=2; ipLoc-djd=2-2830-0-0; PCSYCityID=CN_310000_310100_0; __jdb=76161171.2.1532595302|3.1721048200; __jdv=76161171|baidu-pinzhuan|t_288551095_baidupinzhuan|cpc|0f3d30c8dba7459bb52f2eb5eba8ac7d_0_eebc47daf73745329a55dd1eb9ad7043|1721048231436; shshshfpb=BApXcRoNwtfVAz1dBdMgZzMNIlw-wQ5MMBlZmcBpp9xJ1Mtb2MIC2"
# 对 cookies 参数进行切分成字典格式键值对
def split_cookies(cookies):
first_data_start = cookies.split(";")
return {key: value for key, value in [item.split("=") for item in first_data_start]}
headers = {
# 在请求头中携带 Cookie
"User-Agent": UserAgent().random
}
cookie = split_cookies(cookies=old_cookie)
print(cookie)
# {'__jdu': '1532595302', ' shshshfpa': '7039f951-868f-f778-7181-fe780b8522d6-1714277735', ' shshshfpx': '7039f951-868f-f778-7181-fe780b8522d6-1714277735', ' pinId': 'Z1_JDHbj8Sgii5HUUfAJ-A', ' o2State': '{%22webp%22:true%2C%22avif%22:true%2C%22lastvisit%22:1718356806781}', ' 3AB9D23F7A4B3C9B': 'F24D7AB7THXWKKLWMF6TXJPULK4BEDBMP2NWEGTEZHSKIT2T5G3HBMBQXSFEEYQVC4YMZFVZHX3ORVTXSTZLO6T6AQ', '
#...} 切分成字典格式键值对
response = requests.get(url=target_url, headers=headers,
cookies=cookie)
page_text = response.text
with open('jd.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
Ⅳ requests模块之POST请求
-
- 数据不会出现在地址栏中
-
- 数据的大小没有上限
-
- 有请求体
-
- 请求体中如果存在中文,会使用URL编码!
requests.post()用法与requests.get()完全一致
特殊的是requests.post()有一个data参数,用来存放请求体数据
【一】目标网址
http://www.aa7a.cn/user.php
【二】目标分析
- 抓包分析可以得到当前登录的请求地址和请求方式
# 通过抓包可以发现 目标目标网址是 : http://www.aa7a.cn/user.php
# 请求方式 是 : POST
# 需要带请求体体数据 载荷
username: 1272491937@qq.com
password: 4444
captcha: xyg4
remember: 1
ref: http://www.aa7a.cn/index.php
act: act_login
【三】模拟请求
- 模板
# 导入requests模块
import requests
# 伪装请求头
from fake_useragent import UserAgent
# 定义目标路由地址
tag_url = "http://www.aa7a.cn/user.php"
# 定义请求头参数
headers = {
'User-Agent': UserAgent().random
}
# 定义请求体数据
data = {
# 自己的用户名
'username': 'username',
# 自己的密码
'password': 'password',
# 页面验证码
'captcha': 'captcha',
'remember': 1,
'ref': 'http://www.aa7a.cn',
'act': 'act_login'
}
# 对目标地址发起请求
# post 请求携带请求体可以有两种方式
# 一种是 data=data
response = requests.post(url=tag_url, data=data, headers=headers)
# 一种是 json=data
# response = requests.post(url=tag_url, data=data, headers=headers)
# 打印响应数据
print(response.text)
# {"error":0,"ref":"http://www.aa7a.cn/user.php"}
# 观察发现响应的数据应该为验证码错误 ,而不是当前的错误
- 实际应用
import requests
from fake_useragent import UserAgent
target_url = 'http://www.aa7a.cn/user.php'
headers = {
'User-Agent': UserAgent().random
}
# POST 请求体数据和 GET 请求体数据携带的不一致
# GET 请求 携带在URL地址中 / 带在requests参数中
# POST 请求 携带在requests参数中
data = {
'username': '1272491937@qq.com',
'password': '4444',
'captcha': 'xyg4',
'remember': '1',
'ref': 'http://www.aa7a.cn/index.php',
'act': 'act_login'
}
# 携带请求体参数有两种方式
response = requests.post(
url=target_url,
headers=headers,
# 方式一 : data
# data=data,
# 方式二 : json
json=data
)
print(response.text)
【四】小结:POST请求携带数据的两种方式
【1】json=data
- 当使用requests.post方法时
- 如果将data参数设置为一个字典,并同时将headers参数中的Content-Type设置为application/json,那么data字典将被自动序列化为JSON字符串,并作为请求的主体数据发送。
- 这样的请求方式常用于与服务器交互时,需要使用JSON格式进行数据传输的情况。
【2】data=data
- 默认情况下,requests.post方法将会将data参数以application/x-www-form-urlencoded格式进行编码。
- 这种编码方式将字典数据转换成键值对的形式,并使用&符号进行连接。
- 然后,将生成的字符串作为请求的主体数据发送到服务器。这种方式常用于处理表单提交的场景。
Ⅴ POST请求应用之登陆github
- 对于登录来说,应该输错用户名或密码然后分析抓包流程
- 用脑子想一想,输对了浏览器就跳转了,还分析个毛线,累死你也找不到包
【一】目标站点分析
(1)浏览器输入
(2)然后输入错误的账号密码
- 抓包发现登录行为是post提交到
- https://github.com/session
(3)分析请求体
- 请求头包含cookie
- 请求体包含
commit: Sign in
authenticity_token: mk40HAZuIAeMeBvz0O8fd5c3Y5Q4VHUsz/6h17BLyuDO070ieKIBU/LpjziBKiMnggpRk0G3NPqDKM2/18/1sA==
login: username
password: password
webauthn-conditional: undefined
javascript-support: true
webauthn-support: supported
webauthn-iuvpaa-support: supported
return_to: https://github.com/login
allow_signup:
client_id:
integration:
required_field_fd11:
timestamp: 1711094788024
timestamp_secret: 1e14e74fc401d1278cb3efaa8db5edb0f480fb4b9d6a47e001c6501d3f65f817
【二】流程分析
(1)先GET
- https://github.com/login
- 拿到初始cookie与authenticity_token
(2)再POST
- https://github.com/session
- 带上初始cookie,带上请求体(authenticity_token,用户名,密码等)
- 最后拿到登录cookie
ps:如果密码时密文形式,则可以先输错账号,输对密码,然后到浏览器中拿到加密后的密码,github的密码是明文
【三】代码实现
import requests
from fake_useragent import UserAgent
target_url = 'http://www.aa7a.cn/user.php'
headers = {
'User-Agent': UserAgent().random
}
# POST 请求体数据和 GET 请求体数据携带的不一致
# GET 请求 携带在URL地址中 / 带在requests参数中
# POST 请求 携带在requests参数中
data = {
'username': '1272491937@qq.com',
'password': '4444',
'captcha': 'xyg4',
'remember': '1',
'ref': 'http://www.aa7a.cn/index.php',
'act': 'act_login'
}
# 携带请求体参数有两种方式
response = requests.post(
url=target_url,
headers=headers,
# 方式一 : data
# data=data,
# 方式二 : json
json=data
)
print(response.text)
【四】总结
# 遇到请求 ---> 先对目标网址发起请求 ---> 需要拿到一个Cookie ----> 再对网址发起请求 获取到 标识 token
# ---> 只有携带上上面的token 和你的用户名密码才能登录成功
# 抓包分析 ---> 分析 Cookie 和token 分别在那个包中 ---> 对目标包进行抓取 ---> 获取到 Cookie 和token
# ---> 拿着 Cookie 和 token 去登录
Ⅵ 自动携带cookie 的session对象
- session 其实就是用来保持会话状态的参数
- 本次目标访问 雪球网:https://xueqiu.com/
【一】第一次访问
- 直接请求目标地址 获取数据
- 获取不到数据 , 提示我未登录
- 于是复制 Cookie 携带 Cookie
import requests
from fake_useragent import UserAgent
headers = {
'User-Agent': UserAgent().random,
'Cookie': "cookiesu=471711090758684; device_id=5f26adb13cd56a76b5d825f87b7bbe5d; xq_a_token=64274d77bec17c39d7ef1934b7a3588572463436; xqat=64274d77bec17c39d7ef1934b7a3588572463436; xq_r_token=3f3592acdffbaaee3a7ea110c5d151d2710b7318; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTcyMjczMjcyOCwiY3RtIjoxNzIxMDMxMzg1MjM2LCJjaWQiOiJkOWQwbjRBWnVwIn0.La-4J5wUFsxb3sEJ0MB6SXC3xMrctIi_zLHkbYqot1JqTgGoHDQYtpd-jImGJi8X27uqZ40ZVchCA4V2t3baesgyIYHzeJw-7tFY05yboa_86xeeL809Ct9A0Xcdg2ngTflUlM6eolFZO6yAoYSKXvUkFYP155msUAl254Y21LBeRZszYGc_0509yyHHW7-nxJddEceeMYqrF4DzNNcdzbQmgZ7txiTFt7FSZXGMuu2xYVgstjMmQlIiO1ClTi9vW705rDvN6xIOrrL6hNVIRyKF9SKRhmELVe8bM6Y9E1CeuwaBSZ7ieTk7Qk01kwFrz1SuqIb0D_VXUXKoDf_T9A; u=471711090758684; Hm_lvt_1db88642e346389874251b5a1eded6e3=1721031400; HMACCOUNT=BED356D04965781C; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1721031422"
}
target_url = 'https://stock.xueqiu.com/v5/stock/batch/quote.json?symbol=SH000001,SZ399001,SZ399006,SH000688,SH000016,SH000300,BJ899050,HKHSI,HKHSCEI,HKHSTECH,.DJI,.IXIC,.INX'
response = requests.get(
url=target_url,
headers=headers
)
page_text = response.text
print(page_text)
【二】第二次访问
- 先用 requests 请求 雪球网 ---> 获取到 Cookie
- 将 Cookie 提取出来 ---> 给请求用
- 请求成功
import requests
from fake_useragent import UserAgent
# 先生成一个 会话对象
session = requests.Session()
headers = {
'User-Agent': UserAgent().random
}
target_url = 'https://xueqiu.com/'
response = session.get(target_url, headers=headers)
response.encoding = 'utf-8'
# 从响应对象中获取到登陆之后的Cookie
cookies = dict(response.cookies)
target_url = 'https://stock.xueqiu.com/v5/stock/batch/quote.json?symbol=SH000001,SZ399001,SZ399006,SH000688,SH000016,SH000300,BJ899050,HKHSI,HKHSCEI,HKHSTECH,.DJI,.IXIC,.INX'
response = requests.get(
url=target_url,
headers=headers,
cookies=cookies
)
page_text = response.text
print(page_text)
【三】第三次访问
- 使用 session 对象保持会话状态
- 生成 session 对象发起请求 Cookie 会自动加载到session对象中
- 下一次请求直接用 session
import requests
from fake_useragent import UserAgent
# 先生成一个 会话对象
session = requests.Session()
headers = {
'User-Agent': UserAgent().random
}
target_url = 'https://xueqiu.com/'
response = session.get(target_url, headers=headers)
response.encoding = 'utf-8'
target_url = 'https://stock.xueqiu.com/v5/stock/batch/quote.json?symbol=SH000001,SZ399001,SZ399006,SH000688,SH000016,SH000300,BJ899050,HKHSI,HKHSCEI,HKHSTECH,.DJI,.IXIC,.INX'
response = session.get(
url=target_url,
headers=headers,
)
page_text = response.text
print(page_text)
Ⅶ requests模块之响应体
【一】前言引入
- requests模块的响应对象包含了许多参数和方法,可以帮助我们处理和分析HTTP请求的响应。
【二】响应体数据格式转换
- response.text ---> 会将响应 源码转换为 文本类型的数据格式
- response.content ---> 会将响应 源码转换为 字节类型的数据格式 图片/视频/压缩包 ...
- response.json() ---> 会将响应 源码转换为 json 类型的数据格式
【1】text和content
- response.text: 将响应体转换为字符串形式。
import requests
response = requests.get('https://pic.netbian.com/uploads/allimg/240322/232300-171112098057a5.jpg')
# `response.text`: 将响应体转换为字符串形式。
data = response.text
print(data, type(data))
# 很多数据,但是是文本类型的
- response.content: 获取响应体的二进制内容,适用于处理图像、视频等非文本类型的响应。(默认是16进制)
import requests
response = requests.get('https://pic.netbian.com/uploads/allimg/240322/232300-171112098057a5.jpg')
# `response.content`: 获取响应体的二进制内容,适用于处理图像、视频等非文本类型的响应。(默认是16进制)
data = response.content
print(data, type(data))
# 很多数据,但是是二进制类型的
【2】json
import requests
from fake_useragent import UserAgent
# 先生成一个 会话对象
session = requests.Session()
headers = {
'User-Agent': UserAgent().random
}
target_url = 'https://xueqiu.com/'
response = session.get(target_url, headers=headers)
response.encoding = 'utf-8'
target_url = 'https://stock.xueqiu.com/v5/stock/batch/quote.json?symbol=SH000001,SZ399001,SZ399006,SH000688,SH000016,SH000300,BJ899050,HKHSI,HKHSCEI,HKHSTECH,.DJI,.IXIC,.INX'
response = session.get(
url=target_url,
headers=headers,
)
page_text = response.text
page_json = response.json()
print(page_text,type(page_text))
print(page_json,type(page_json))
【三】响应体数据进行编码
- response.encoding:获取响应的编码方式
import requests
response = requests.get('https://www.baidu.com/')
# `response.encoding`:获取响应的编码方式
print(response.encoding)
# ISO-8859-1
# 查看到当前页面的默认编码格式为 ISO-8859-1
【四】查看响应状态码
- response.status_code: 获取响应的状态码。
import requests
response = requests.get('https://www.baidu.com/')
# `response.status_code`: 获取响应的状态码。
print(response.status_code)
# 200
【五】查看响应头数据
- response.headers: 获取响应头信息,返回一个字典对象。
import requests
response = requests.get('https://www.baidu.com/')
# `response.headers`: 获取响应头信息,返回一个字典对象。
print(response.headers)
# {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Fri, 22 Mar 2024 07:14:04 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
【六】响应Cookie
- response.cookies: 获取服务器返回的cookie信息。
- response.cookies.get_dict(): 将cookie信息转换为字典形式。
- response.cookies.items(): 获取cookie信息并以列表形式返回。
import requests
response = requests.get('https://www.baidu.com/')
# `response.cookies`: 获取服务器返回的cookie信息。
print(response.cookies)
# <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
# `response.cookies.get_dict()`: 将cookie信息转换为字典形式。
print(response.cookies.get_dict())
# {'BDORZ': '27315'}
# `response.cookies.items()`: 获取cookie信息并以列表形式返回。
print(response.cookies.items())
# [('BDORZ', '27315')]
【七】当前请求/响应对象的URL
- response.url: 获取当前响应的URL。
- 这是在完成HTTP请求并接收到服务器响应后,实际返回的资源URL。
- 在重定向发生时,这个属性会反映最终页面的实际URL。
- 例如,如果你发起一个请求到某个网站A,但该网站随后重定向到了网站B,那么response.url将显示网站B的URL。
- response.request.url: 获取当前请求的URL。
- 这是发送HTTP请求时使用的原始URL,即你在发出请求时指定的URL。
- 无论是否发生重定向,这个属性始终保持不变。
- 也就是说,它反映了你最初尝试访问的地址。
- 总结来说
- 没有重定向
- 两者通常是一致的。
- 有重定向
- response.url 是重定向后的最终URL
- response.request.url 则是最初的请求URL。
- 没有重定向
import requests
from fake_useragent import UserAgent
# 先生成一个 会话对象
session = requests.Session()
headers = {
'User-Agent': UserAgent().random
}
target_url = 'https://xueqiu.com/'
response = session.get(target_url, headers=headers)
response.encoding = 'utf-8'
target_url = 'https://stock.xueqiu.com/v5/stock/batch/quote.json?symbol=SH000001,SZ399001,SZ399006,SH000688,SH000016,SH000300,BJ899050,HKHSI,HKHSCEI,HKHSTECH,.DJI,.IXIC,.INX'
response = session.get(
url=target_url,
headers=headers,
)
page_text = response.text
# response.url 是重定向后的最终URL
print(response.url)
# response.request.url 则是最初的请求URL。
print(response.request.url)
# 查看当前地址重定向前的地址
# response.history: 如果有重定向,返回一个列表,包含所有经过的重定向URL。
print(response.history)
【八】迭代获取二进制数据
- response.iter_content() :迭代获取响应内容(适用于处理视频、图片等二进制数据)
# 导入requests库
import requests
# 定义目标地址:该地址是一张图片,图片属于二进制数据
tag_url = "https://pic.netbian.com/uploads/allimg/240322/232300-171112098057a5.jpg"
# 向目标地址发起请求
response = requests.get(tag_url)
# 打开本地的文件路径,写入二进制数据必须用 wb 模式
file_path = "./a.jpg"
with open(file_path, 'wb') as f:
# 循环获取响应数据中的二进制数据,每次只获取 1024 个字节
for chunk in response.iter_content(chunk_size=1024):
# 如果存在数据,则进行文件数据的写入
if chunk:
f.write(chunk)
Ⅷ ssl认证
HTTPS请求中 HTTP + SSL 证书
HTTP请求是不需要认真的直接就能访问 都会提示 此网站不安全
- 有些网站没有设置好 HTTPS 证书,或者 HTTPS 证书不被 CA 机构认可,这些网站就会出现 SSL 证书错误提示。
- 在 requests 模块中进行 SSL 认证时,可以通过 verify 参数来控制是否验证服务器的 SSL 证书。
- 默认情况下,verify 参数被设置为 True,表示会验证 SSL 证书。
- 当 verify 设置为布尔值 False 时,会忽略证书验证,但会引发警告。
【一】验证证书报错演示
import requests
url = 'https://ssr2.scrape.center/'
response = requests.get(url)
print(response.status_code)
SSLError:
requests.exceptions.SSLError: HTTPSConnectionPool(host='ssr2.scrape.center', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1051)')))
【二】不验证证书
import requests
url = 'https://ssr2.scrape.center/'
response = requests.get(url=url, verify=False)
print(response.status_code)
InsecureRequestWarning: Unverified HTTPS request is being made to host 'ssr2.scrape.center'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
warnings.warn(
200
- 报出 InsecureRequestWarning 警告,但得到了请求成功的状态码
【三】自定义证书路径
- 如果希望使用自定义的证书进行验证,可以将 verify 参数设置为证书文件的路径。例如:
import requests
url = 'https://ssr2.scrape.center/'
cert_file = "/path/to/my_certificate.pem"
# 发送请求,并使用自定义证书进行 SSL 验证
response = requests.get(url, verify=cert_file)
# 打印响应状态码
print(response.status_code)
# 打印响应内容
print(response.text)
- 在上述代码中,将 verify 参数设置为自定义证书文件的路径。requests 将使用指定的证书进行验证。
- 请注意,在实际使用中,如果从未提供过自定义证书,并且要禁用验证,则最好提供证书路径。这样可以避免不必要的错误和警告。
【四】小结
import requests
# 发送请求,并禁用 SSL 证书验证
response = requests.get(url, verify=False)
# 打印响应状态码
print(response.status_code)
# 打印响应内容
print(response.text)
- 在上述代码中,我们使用 requests 模块的 get() 方法发送带有 URL 的请求。
- 将 verify 参数设置为 False,以禁用 SSL 证书验证。
- 注意:禁用 SSL 证书验证存在安全风险,因为它允许您的请求受到中间人攻击。
- 在生产环境中,强烈建议启用 SSL 证书验证,以确保通信的安全性。
Ⅸ 使用代理(重要)
【一】为什么用代理?
- 在网络爬虫和数据抓取的过程中,我们经常需要发送HTTP请求来获取网页内容或与远程服务器进行通信。
- 然而,在某些情况下,直接发送请求可能会受到限制或被阻止,这时就需要借助代理来完成任务。
- 代理在网络通信中起到中间人的作用,它代表我们与目标服务器建立连接并传递请求和响应。
- 通过使用代理,我们可以隐藏真实的IP地址、绕过访问限制,并增加请求的匿名性。
- Python中的requests库提供了便捷且强大的功能来处理HTTP请求,并且支持代理的配置。
说人话:
一般网站都有屏蔽的限制策略,用自己的IP去爬,被封了那该网站就访问不了,这时候就得用代理IP来解决问题了。
封吧,反正封的不是本机IP,封的代理IP。
【二】代理配置方法
- 在使用Python中的requests库发送HTTP请求时,我们可以通过以下几种方法来配置代理。
- 这些方法允许我们灵活地选择适合你需求的代理设置。
【1】使用proxies参数设置全局代理
- requests库提供了一个名为proxies的参数,通过它可以设置全局代理。
- 我们可以将代理配置作为一个字典传递给该参数,字典的键是代理类型(如'http'、'https'等),值是代理的地址和端口号。
- proxies参数语法格式:
proxies = {
"协议": "协议//代理IP:端口",
"协议": "协议//代理IP:端口",
"协议": "协议//代理IP:端口",
"协议": "协议//代理IP:端口",
"协议": "协议//代理IP:端口",
}
- 示例
import requests
proxies = {
"http": "http://127.0.0.1:1080",
}
target_url = "https://www.baidu.com"
response = requests.get(
url=target_url,
# 携带代理IP,如果代理IP 不生效那就会默认使用本机的IP
proxies=proxies
)
print(response.status_code)
print(response.text)
- 通过这种方式配置的代理将应用于所有的请求,适用于简单的代理需求。
【2】使用session对象设置会话级别的代理
- 若你需要在多个请求之间保持相同的代理设置,可以使用requests库中的Session对象。
- Session对象允许你在会话级别上保持一些参数,包括代理设置。
import requests
session = requests.Session()
session.proxies = {
'http': 'http://proxy.example.com:8080',
'https': 'https://proxy.example.com:8080'
}
response = session.get(url)
'''
session = requests.Session()
session.proxies = proxies
'''
- 在这种情况下,创建的Session对象将会持续保持代理设置,直到我们显式地修改或重置它。
- 这对于需要在多个请求中使用相同代理的情况非常有用,例如爬取网站的多个页面时。
- 请注意,无论是使用全局代理还是会话级别的代理,都要确保代理地址和端口号的正确性,并根据实际情况选择http或https类型的代理。
- 此外,如果代理需要验证身份,你还需要提供相应的用户名和密码。
【3】代理配置示例
- 我们编写一个python代码,使用免费代理IP访问测试网站(http://httpbin.org/get)获取当前访问环境的ip地址
(1)本机IP
import requests
from fake_useragent import UserAgent
# 定义目标地址
url = 'http://httpbin.org/get'
# 定义请求头参数
headers = {
"User-Agent": UserAgent().random
}
# 获取响应对象
response = requests.get(url=url, headers=headers)
# 检查请求是否成功
if response.status_code == 200:
# 处理响应内容
response.encoding = 'utf-8' # 设置响应内容的编码格式为utf-8
# 解析JSON结果
data = response.text # 获取响应信息
print(data)
else:
print("请求失败:", response.status_code)
(2)代理IP
- 下面我们就通过代理访问,看看目标网站会不会识别为代理地址。
- 首先我们找到一个免费代理网站(https://www.kuaidaili.com/free/),获取一个免费代理IP
- 89免费代理 / 快代理 ...
import requests
from fake_useragent import UserAgent
# 定义目标地址
url = 'http://httpbin.org/get'
# 定义请求头参数
headers = {
"User-Agent": UserAgent().random
}
# 设置代理地址
proxies = {
'http': 'http://117.69.233.212:8089'
}
# 获取响应对象
response = requests.get(url=url, headers=headers, proxies=proxies)
# 检查请求是否成功
if response.status_code == 200:
# 处理响应内容
response.encoding = 'utf-8' # 设置响应内容的编码格式为utf-8
# 解析JSON结果
data = response.text # 获取响应信息
print(data)
else:
print("请求失败:", response.status_code)
【4】批量抓取代理脚本
# 导入模块
# 发起requests请求
import requests
# 使用XPath解析页面数据
from lxml import etree
# 使用你的程序来计算随机的UserAgent
from fake_useragent import UserAgent
# UA 伪装 headers
headers = {
'User-Agent': UserAgent().random
}
def get_proxy():
'''
url : {89免费代理的url:https://www.89ip.cn/index_2.html}
:return: 返回所有爬取到的ip列表
'''
# 存放所有代理存在的页码
page_url_lists = []
# 存放爬取到的所有代码的列表
ip_lists = []
# 循环获取每一页的代理页面的url
for i in range(1, 5):
if i == 1:
# 首页的url
page_url = 'https://www.89ip.cn/'
# 将代理页url存储到类可用列表里
page_url_lists.append(page_url)
else:
# 处理第二页及以后所有页码的规则
page_url = f'https://www.89ip.cn/index_{i}.html'
# 将代理页url存储到类可用列表里
page_url_lists.append(page_url)
# 从存储所有代理存在的页面的列表,循环发起请求获得代理ip和端口
for pages_url in page_url_lists:
response = requests.get(pages_url, headers=headers)
response.encoding = 'utf-8'
page_text = response.text
tree = etree.HTML(page_text)
# xpath提取到所有的代理ip列表
tr_lists = tree.xpath('//div[3]/div[1]/div/div[1]/table/tbody/tr')
# 循环获取每一个代理ip和端口
for tr in tr_lists:
# 获取ip并做数据清洗
ip = tr.xpath('./td[1]/text()')[0].strip()
# 获取端口并做数据清洗
port = tr.xpath('./td[2]/text()')[0].strip()
# 将获取到的代理ip和端口拼接
ip_port = 'http://' + ip + ':' + str(port)
# 将获取到的代理ip和端口存储到类可用列表里
ip_lists.append({'http': ip_port})
# 返回所有代理ip列表
return ip_lists
def text_ip():
'''
url:{百度首页,}
:return: 做测试返回状态码为200正常可用保留,否则再次执行验证
'''
url = "https://www.baidu.com/"
# 获取到所有ip列表
ip_lists = get_proxy()
# 循环测试每一个ip和端口是否可用
for ip_item in ip_lists:
response = requests.get(url, proxies=ip_item, headers=headers, timeout=10)
ret = response.status_code
# 做判断是否返回值为200可用
if ret == 200:
print(f'当前状态码为:::{ret},ip可用,返回ip:::{ip_item}')
return ip_item
else:
print(f'当前状态码为:::{ret},当前ip不可用,重新测试ip中')
text_ip()
if __name__ == '__main__':
ip_lists = get_proxy()
ip_item = text_ip()
url = 'https://www.baidu.com/'
response = requests.get(url=url, headers=headers, proxies=ip_item)
print(response.text)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY