爬虫案例3——爬取彩票双色球数据
简介:个人学习分享,如有错误,欢迎批评指正
任务:从500彩票网中爬取双色球数据
目标网页地址:https://datachart.500.com/ssq/
一、思路和过程
目标网页具体内容如下:

我们的任务是将上图中红色、蓝色两种颜色球的数字按行爬取下来。
1.定义目标URL
由于网页普遍具有反爬程序,不加修饰的直接访问网页可能会失败,所以第一步学会伪装自己。
如何伪装自己呢,可以通过找到正常访问网页时的访问状态,将自己的这次爬虫模拟成一次正常访问网页,因此我们的目标是找到正常访问网页时的User-Agent。User Agent中文名为用户代理,(简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等)。User-Agent就是你访问网页的身份证明。具体操作如下:
首先打开目标(/任意)网页,然后点击鼠标右键后选择检查打开网页的HTML 页面。

在HTML 页面里面依次点击网络,然后任意点一条网络请求(如果没有显示任何网络请求可以点击网页左上角的刷新),然后选择标头,下拉列表找到User-Agent,User-Agent后面那段内容就是我们用来伪装自己的身份码。

2.发送GET请求获取网页内容
通过上面的步骤我们获得了
url = ‘https://datachart.500.com/ssq/’
User-Agent:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0’
接下来发起网页访问请求,代码如下:
import requests # 引入requests库,用于发送HTTP请求
from lxml import etree # 引入lxml库中的etree模块,用于解析HTML文档# 定义目标URL,即要爬取的网页地址
url = 'https://datachart.500.com/ssq/'# 定义HTTP请求头,其中包括User-Agent信息,用于伪装成浏览器进行访问
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}# 发送GET请求获取网页内容,并将响应内容存储在resp变量中
resp = requests.get(url, headers=headers)
# 设置响应内容的编码格式为gbk,确保中文字符正常显示
resp.encoding = 'gbk'
# 打印响应内容,检查获取到的HTML文本
print(resp.text)
查看print结果,我们发现成功获得了网页相关的html表达,

3.分析网页内容
接下来对html进行解析获得我们目标内容。
这里,我们需要借助工具xpath来辅助内容解析,xpath安装教程
安装成功后,按Ctrl+Shift+Alt 启动 xpath,网页上方出现如下图所示框,

找到目标内容方法
例:我们的目标是找到红球7在html中的位置。点击如下图左边标记(1),该命令的含义是在网页中选择一个元素以进行检查,即当你把鼠标放在网页的某一位置,下面也会自动定位到html中该内容所在位置,如图所示,把鼠标放在红球数字7位置(2),下面显示红球数字7在html中所在位置(3)。

明确目标内容的位置。具体的,如下图所示,红框内的数字[1,3,4,8,7,3,7],它位于tboby id="tdata"中的tr层中的td层里面。

因此,我们可以通过这个层层关系来找到目标所有红球,借助刚才安装的工具xpath,下面一步步演示层层查找过程。
首先,在query中添加//tbody[@id=“tdata”],可以发现右边的results将所有球的数字信息以一个整体返回了。

其次,加上筛选条件tr得

但是,我们发现原表中还有横线这一情况,它不包含数字,但是却也被筛选进来了,因此,我们需要这个情况进行处理

添加条件: tr[not(contains(@class,"tdbck"))], 含义就是取所有不包含class=tdbck的tr,即排除了上面的横线部分。

需要注意的是,我们目标是红球的数字,在td中红球数字的格式与普通球的格式不一样,如下面红框框里面红球的数字格式。我们发现普通球的格式为class =“y101”,而红球为class=“chartBall01” ,

因此进一步添加条件:td[contains(@class,"chartBall01")],即取td里面class=chartBall01的值。如下图,可以发现所有的红球数字被单独取出来了。

蓝球数字的读取同上,下图可以发现所有的蓝球数字被单独取出来了

因此,通过xpath的可视化辅助,得上面地址
//tbody[@id="tdata"]/tr[not(contains(@class,"tdbck"))]/td[contains(@class,"chartBall01")]可以获取红球数据,
//tbody[@id=“tdata”]/tr[not(contains(@class,“tdbck”))]/td[contains(@class,“chartBall02”)]可以获取蓝球数据。
4.获取目标数据
上一步得到了目标数据的地址,接下来就是分别获得到目标数据,代码如下:
# 使用etree.HTML方法将HTML文本解析为一个HTML文档对象
e = etree.HTML(resp.text)# 使用XPath语法从HTML文档中提取出红球号码数据
# 这里tr元素中包含class为"chartBall01"的td元素,代表红球号码
reds = [tr.xpath('./td[contains(@class,"chartBall01")]/text()') for tr in e.xpath('//tbody[@id="tdata"]/tr[not(contains(@class,"tdbck"))]')]# 使用XPath语法从HTML文档中提取出蓝球号码数据
# 这里td元素中包含class为"chartBall02"的td元素,代表蓝球号码
blues = e.xpath('//tbody[@id="tdata"]/tr[not(contains(@class,"tdbck"))]/td[contains(@class,"chartBall02")]/text()')
5.保存数据
存为一个txt文件
# 打开一个名为'two_tone_ball.txt'的文件,使用utf-8编码进行写入
with open('two_tone_ball.txt', 'w', encoding='utf-8') as f:# 使用zip函数将红球号码和蓝球号码数据组合在一起,逐行写入文件for re, bl, in zip(reds, blues):# 写入格式为:红球号码:xxx 蓝球号码:xxxf.write(f'红球号码:{re} 蓝球号码:{bl}\n')
二、完整python代码
import requests # 引入requests库,用于发送HTTP请求
from lxml import etree # 引入lxml库中的etree模块,用于解析HTML文档# 定义目标URL,即要爬取的网页地址
url = 'https://datachart.500.com/ssq/'# 定义HTTP请求头,其中包括User-Agent信息,用于伪装成浏览器进行访问
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}# 发送GET请求获取网页内容,并将响应内容存储在resp变量中
resp = requests.get(url, headers=headers)
# 设置响应内容的编码格式为gbk,确保中文字符正常显示
resp.encoding = 'gbk'
# 打印响应内容,检查获取到的HTML文本
print(resp.text)# 使用etree.HTML方法将HTML文本解析为一个HTML文档对象
e = etree.HTML(resp.text)# 使用XPath语法从HTML文档中提取出红球号码数据
# 这里tr元素中包含class为"chartBall01"的td元素,代表红球号码
reds = [tr.xpath('./td[contains(@class,"chartBall01")]/text()') for tr in e.xpath('//tbody[@id="tdata"]/tr[not(contains(@class,"tdbck"))]')]# 使用XPath语法从HTML文档中提取出蓝球号码数据
# 这里td元素中包含class为"chartBall02"的td元素,代表蓝球号码
blues = e.xpath('//tbody[@id="tdata"]/tr[not(contains(@class,"tdbck"))]/td[contains(@class,"chartBall02")]/text()')# 打开一个名为'two_tone_ball.txt'的文件,使用utf-8编码进行写入
with open('two_tone_ball.txt', 'w', encoding='utf-8') as f:# 使用zip函数将红球号码和蓝球号码数据组合在一起,逐行写入文件for re, bl, in zip(reds, blues):# 写入格式为:红球号码:xxx 蓝球号码:xxxf.write(f'红球号码:{re} 蓝球号码:{bl}\n')
结~~~
相关文章:
爬虫案例3——爬取彩票双色球数据
简介:个人学习分享,如有错误,欢迎批评指正 任务:从500彩票网中爬取双色球数据 目标网页地址:https://datachart.500.com/ssq/ 一、思路和过程 目标网页具体内容如下: 我们的任务是将上图中…...
C++ | Leetcode C++题解之第337题打家劫舍III
题目: 题解: struct SubtreeStatus {int selected;int notSelected; };class Solution { public:SubtreeStatus dfs(TreeNode* node) {if (!node) {return {0, 0};}auto l dfs(node->left);auto r dfs(node->right);int selected node->val…...
软件架构设计师-UML知识导图
软件架构设计师-UML知识导图,包含如下内容: 结构化设计,包含结构化设计的概念、结构化设计的主要内容、概要设计、详细设计及模块设计原则;UML是什么:介绍UML是什么;UML的结构:构造块、公共机制…...
在使用transformers和pytorch时出现的版本冲突的问题
在使用transformers和torch库的时候,出现了以下问题: 1、OSError: [WinError 126] 找不到指定的模块。 Error loading "D:\Program Files\anaconda3\envs\testenv\Lib\site-packages\torch\lib\fbgemm.dll" or one of its dependencies. 2、…...
uniapp粘贴板地址识别
1: 插件安装 主要是依靠 address-parse 这个插件: 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2:html部分 <view class""><view class&quo…...
C语言 | Leetcode C语言题解之第335题路径交叉
题目: 题解: bool isSelfCrossing(int* distance, int distanceSize){if (distance NULL || distanceSize < 4) {return false;}for (int i 3; i < distanceSize; i) {if ((distance[i] > distance[i - 2]) && (distance[i - 1] &l…...
TypeScript学习第十三篇 - 泛型
在编译期间不确定变量的类型,在调用时,由开发者指定具体的类型。 1. 如何给arg参数和函数指定类型? function identity(arg){return arg; }identity(1) identity(jack) identity(true) identity([]) identity(null)定义的时候,无…...
工业智能网关在汽车制造企业的应用价值及功能-天拓四方
随着工业互联网的飞速发展,工业智能网关作为连接物理世界与数字世界的桥梁,正逐渐成为制造业数字化转型的核心组件。本文将以一家汽车制造企业的实际使用案例为蓝本,深入解析工业智能网关在实际应用中的价值、功能及其实操性。 一、背景与挑…...
LLM - 在服务器中使用 Ollama + OpenWebUI 部署最新大模型
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140992533 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Ollama 是一个开源的大型语言模型(LLM)服务工具,目的是简化本地运行…...
重启人生计划-积蓄星火
🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 如果你觉得这个【重启人生…...
2024.08.11 校招 实习 内推 面经
地/球🌍 : neituijunsir 交* 流*裙 ,内推/实习/校招汇总表格 1、自动驾驶一周资讯 - 比亚迪将采购华为智驾系统,用于方程豹新款越野车;英特尔发布第一代车载独立显卡;黑芝麻智能上市首日破发大跌 自动…...
LCA(Lowest Common Ancestor)
LCA(Lowest Common Ancestor) 定义 在树上取两点 x,yx,y,他们的 LCA 为距离他们最近的公共祖先。 本章主要讲的是倍增求 LCA。 暴力求取 从 xx 开始向上移动到根结点,并标记沿途结点。从 yy 开始向上移动到根结点,…...
张钹院士:大模型时代的企业AI发展趋势
在当今技术迅速发展的时代,生成式人工智能与大模型正成为推动产业变革的重要力量。随着AI技术的不断成熟与普及,它的应用已从个人领域扩展至企业层面,广泛覆盖各行各业。 那么,新技术究竟会给产业带来哪些积极地影响?…...
php连接sphinx的长连接事宜以及sphinx的排除查询以及关于sphinx里使用SetSelect进行复杂的条件过滤或复杂查询
一、php连接sphinx的长连接事宜以及sphinx的排除查询 在使用php连接sphinx时,默认的sphinx连接非长连接,于是在想php连接sphinx能否进行一些优化 publish:January 9, 2018 -Tuesday: 方法:public bool SphinxClient::open ( void ) — 建立到…...
抓包分析排查利器TCPdump
tcpdump命令介绍与常规用法。 基础命令介绍 # 固定语法 -i 指定网卡名称 -nn 显示IP地址 -w 指定输出的文件名称 tcpdump -i eth0 -nn -w test.cap-nn 不把主机的网络地址与协议转换成名字 -w 把数据包数据写入指定的文件 and 连接参数 host 指明主机 port 指明端口 src 源IP…...
八种排序算法的复杂度(C语言)
归并排序(递归与非递归实现,C语言)-CSDN博客 快速排序(三种方法,非递归快排,C语言)-CSDN博客 堆排序(C语言)-CSDN博客 选择排序(C语言)以及选择排序优化-CSDN博客 冒泡排序(C语言)-CSDN博客 直接插入排序(C语言)-CSDN博客 希尔排序( 缩小增量排序 )(C语言)-CSDN博客 计数…...
docker compose部署rabbitmq集群,并使用haproxy负载均衡
一、创建rabbitmq的data目录 mkdir data mkdir data/rabbit1 mkdir data/rabbit2 mkdir data/rabbit3 二、创建.erlang.cookie文件(集群cookie用) echo "secretcookie" > .erlang.cookie 三、创建haproxy.cfg配置文件 global log stdout fo…...
git强制推送代码教程
git强制推送代码教程 首先说明情况,我的代码remote了两个git库,现在想要推送到其中一个,但是版本不对,被拒绝,因此下面将进行强制推送 首先检查远程库都有哪些 git remote -v2. 检查当前的分支 git branch当前分支前…...
windows C++-高级并发和异步(三)
深入了解 winrt::resume_foreground(下) 调用 winrt::resume_foreground 时会始终先排队,然后展开堆栈。 也可选择设置恢复优先级。 winrt::fire_and_forget RunAsync(DispatcherQueue queue) {...co_await winrt::resume_foreground(queue, DispatcherQueuePrior…...
河北移动:核心系统数据库成功完成整体迁移 ,实现全栈国产|OceanBase案例
本文作者:移动通信集团河北有限公司架构规划专家,房瑞 项目背景: 中国移动通信集团河北有限公司一直在积极响应国家及集团的号召,以磐舟&磐基云原生为底座,结合国产浏览器、中间件、数据库、操作系统和服务器等&a…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
