百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

惊呆了!Python还能这样用?爬取网页数据并存储至本地数据库

moboyou 2025-07-02 05:45 4 浏览

read_html函数是最简单的爬虫,可爬取静态网页表格数据,但只适合于爬取table 表格型数据,不是所有表格都可以用read_html爬取,有的网站表面上看起来是表格,但在网页源代码中不是table格式,而是list列表格式,这种表格就不适用read_html爬取。

pymysql库可以将Python与SQL数据库建立完美连接,而read_sql在pymysql库建立连接后将SQL数据库的数据读取进来,整个流程如下:read_html抓取网页数据pymysql库建立连接存储数据read_sql读取数据库中的数,下面一起来操作一下。

read_html抓取数据

下面先学习一下read_html() 函数的参数,在代码行中写入

import pandas as pd
df=pd.read_html()

在括号中使用Shift+Tab组合键调用代码提示功能,可以看到read_html都包含以下参数。

这里例举常用的一些参数。

  • io:url、html文本、本地文件等
  • header:标题行
  • flavor:解析器
  • skiprows:跳过的行
  • attrs:属性,例如:attrs = {'id':'table'}
  • parse_dates:解析日期

下面我们使用代码实际爬取网页表格数据,比如下面的新浪财经数据中心。

http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml

在该数据中心界面右键点击检查。

查找元素的时候我们发现新浪财经数据中心的数据即为表格型数据,如下图所示在检查元素里面有table的字样。

检查发现上面的数据为表格型数据,使用read_html爬取网页数据,返回的结果是DataFrame组成的list ,在最后加上一个索引[0]即可得到爬取的表格数据。

import pandas as pd
df=pd.read_html('http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml')[0]
df.head()

下拉到网页的最后,发现该数据中心包含多个页面,点击下一页即可看到。

点击到第二页,发现网页网址的后缀变为?p=2。

点击到第三页,发现网页网址的后缀变为?p=3。

看到这里我们是不是发现了规律,就是每次点击下一页,对应的页面后面的网址会跟着变化,下面我们构造一个list,用于存储各个页码下的网址,比如我们爬取前6页网页表格数据。

url_str='http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml?p='
for i in range(6):
     url=str(url_str)+str(i+1)
     print(url)

构造好网址链接后,使用for循环遍历出来,依次使用read_html将数据爬取下来,并用concat函数将表格数据全部合并起来。

import pandas as pd
df = pd.DataFrame()

url_str='http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml?p='

for i in range(6):
     url=str(url_str)+str(i+1)
     #print(url)

     df = pd.concat([df,pd.read_html(url)[0]])
     print('网站第{}页.....抓取完成'.format(i + 1))

df.head()

如下就是我们数据爬取的结果,将新浪财经数据中心的每一页表格数据抓取下来。

pymysql建立连接

将数据导入数据库,这里还是使用上面的数据文件,连接数据库使用的模块为pymysql。

#导入需要使用到的数据模块
import pymysql

数据库连接,host为数据库地址、user为用户名、password为密码、db为数据库的名字、port为端口,默认为3306。

# 建立数据库连接
con = pymysql.connect(host='127.0.0.1',
                                       user='root',
                                       password='123456',
                                       db='demo',
                                       port=3306)

获取游标对象。

# 获取游标对象
cursor = con.cursor()

用数据库demo,'USE demo' 也是数据库内的SQL语言。

#使用数据库demo
cursor.execute('USE demo')

构造一个test_table表,包含代码、简称、截至日期等多个字段,执行代码命令后,在Navicat里面刷新即可看到如下的一张空表。

#创建一个SQL表
cursor.execute('create table if not exists test_table(代码 char(10) primary key,
                                                                                 简称 char(10),
                                                                                 截至日期 char(10),
                                                                                 家数 int(10),
                                                                                 本期持股数 float,
                                                                                 持股占已流通A股比例 float,
                                                                                 同上期增减 float,
                                                                                 持股比例 float,
                                                                                 上期家数 int(10))')

关于创建一张空表,下面的SQL语法等同于上面的Python生成一张空的表。

CREATE TABLE `test_table` (
                                            `代码` char(10) NOT NULL,
                                            `简称` char(10) DEFAULT NULL,
                                            `截至日期` char(10) DEFAULT NULL,
                                            `家数` int(10) DEFAULT NULL,
                                            `本期持股数` float DEFAULT NULL,
                                            `持股占已流通A股比例` float DEFAULT NULL,
                                            `同上期增减` float DEFAULT NULL,
                                            `持股比例` float DEFAULT NULL,
                                            `上期家数` int(10) DEFAULT NULL,
																						PRIMARY KEY (`代码`)
																						) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

接着向test_table表内插入从网页爬取的数据。

#插入数据语句
query = "insert into test_table(代码,简称,截至日期,家数,本期持股数,持股占已流通A股比例,同上期增减,持股比例,上期家数)
                                                  values (%s,%s,%s,%s,%s,%s,%s,%s,%s)"

迭代读取每行数据,转化数据类型,将其保存在values内。

#迭代读取每行数据,values中元素有个类型的强制转换,否则会出错
for r in range(0, len(df)):
        代码 = df.iloc[r,0]
        简称 = df.iloc[r,1]
        截至日期=df.iloc[r,2]
        家数=df.iloc[r,3]
        本期持股数=df.iloc[r,4]
        持股占已流通A股比例=df.iloc[r,5]
        同上期增减=df.iloc[r,6]
        持股比例=df.iloc[r,7]
        上期家数=df.iloc[r,8]

        values = (代码,简称,截至日期,家数,本期持股数,持股占已流通A股比例,同上期增减,持股比例,上期家数)
        #print(values)

				cursor.execute(query, values)

关闭游标,提交,关闭数据库连接,在Navicat里面刷新即可看到已经存储到本地数据库中的数据。

#关闭游标,提交,关闭数据库连接,如果没有这些关闭操作,执行后在数据库中查看不到数据
cursor.close()
con.commit()
con.close()

read_sql数据库查询

利用Python从数据库查询数据只需要两步,第一步使用pymysql库将Python与数据库进行连接,第二步使用read_sql命令将数据库数据读取进来。

#导入需要使用到的数据模块
import pymysql
import pandas

# 建立数据库连接
con = pymysql.connect(host='127.0.0.1',
                                      user='root',
                                      password='123456',
                                      db='demo',
                                      port=3306)

read_sql函数中有个sql参数用于使用SQL语法查询数据,数据查询后的结果如下。

#SQL语句查询
sql='select * from test_table'
df_sql=pd.read_sql(sql,con)
df_sql.head()

以上,借助新浪财经案例使用read_html命令将网页表格数据抓取下来,并且使用pymysql库将抓取下来的数据存储至本地数据库,如果要加载数据库内的数据,还可以使用read_sql命令将数据读取,以上案例需要读者活学活用,如果对这方面的知识感兴趣,不妨关注我,持续分享数据分析知识。#数据分析##头条文章养成计划#

相关推荐

【开源推荐】给大家推荐个基于ChatGPT的PHP开发库 openai-php-api

有了这个库大家就可以愉快的使用PHP对接chatGPT的官方接口了,至于对接了官方接口想要做什么就看你自己的啦环境要求PHP7.4或以上composer1.6.5以上支持框架Laravel、Sym...

PHP使用Phar打包控制台程序

1.介绍1.1介绍php脚本有着非常强大的库支持,可以轻松做出特别强大的程序。php不仅仅可以搭建各种各样的网站系统、平台系统,还可以开发基于控制台运行的程序。不过使用php开发的控制台程序在使用...

PHP实现URL编码、Base64编码、MD5编码的方法

1.介绍1.1介绍今天开始福哥要给大家讲解关于字符编码的知识,所谓字符编码就是将一个字符串或者是一个二进制字节数组里面的每一个字符根据一定的规则替换成一个或者多个其他字符的过程。字符编码的意义有很...

雷卯针对易百纳海思Hi3521D开发板防雷防静电方案

一、应用场景1、医疗电子2、安防监控3、数字标牌4、视频广告5、环境监测二、功能概述1CPU:ARMCortexA7双核@Max.1.3GHz2H.265/H.264&JPEG多码流编...

不折腾无人生-安卓盒子安装Linux系统armbian纪实

不折腾无人生-安卓盒子安装Linux系统armbian纪实小编的x96max+(晶晨Amlogics905x3)安卓盒子已安装二个系统,原装安卓9.0和tf卡上的CoreELEC9.2.3,可玩性...

全网最简单的玩客云刷casaos方法及后续使用心得

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:不鸣de前几天在站内看见很多值友分享了玩客云刷casaos,被简洁的操作界面种草,于是我将之前刷了powersee大神网页导航版armbia...

最新评测:英特尔旗舰 Alder Lake 处理器击败苹果M1 Max

据国外媒体tomshardware报道,英特尔最新的酷睿i9-12900HK处理器刚刚赢得了移动x86与Arm的性能大战,但这是有代价的。这款移动14核AlderLake芯片在多个工作负...

创维酷开Max系列电视开启ADB并安装第三方应用教程

前言创维酷开系列智能电视采用的是相对封闭的系统,虽然设置中提供了安装未知应用的选项,但由于电视安装位置的限制,往往难以直接使用USB接口安装应用。本文将详细介绍如何通过ADB方式在创维酷开Max系列电...

苹果 Mac Studio,再次刷新我们对个人电脑的认知

由两块M1Max组成的M1Ultra,成为了M1系列的最后一块拼图,并完成了整个M1SoC宇宙。这就好像《复仇者联盟4:终局之战》对于漫威第一阶段,十几年勤恳的布局,最终达到顶峰...

「必买」盘点2021年男人们的败家清单,越“败”越香

心里总想买点啥?看看《必买》,全网最有料的场景种草指南。草原割不尽,春风吹又生。在过去的2021年,不断被各种数码产品种草,一直在买买买,剁手不停。大部分产品都经过详细的对比做足了功课,也有部分是一时...

Opus音频编解码在arm上的移植

一、简介现在有个需求,在局域网内实现实时语音,传输层协议使用UDP协议,如果直接使用ALSA进行录制音频流并发送到另一端进行播放,音质会非常差,而且断断续续,原因如下:采样频率:fm=44.1K...

N ARM MINI空气减震系统臂体安装指南及应用说明

距离MOVMAX移动大师NARMMINI发布已经过去一段时间了,不少收到NARMMINI的小伙伴也已经迅速将产品投入到自己的车拍工作中去了。而在实际工作过程中我们也收到了用户的部分疑问和反馈:...

搜索引擎中的性能怪兽,Elasticsearch挑战者之Manticore Search

ManticoreSearch简介ManticoreSearch是一个使用C++开发的高性能搜索引擎,创建于2017年,其前身是SphinxSearch。ManticoreSe...

10个运维拿来就用的 Shell 脚本,用了才知道有多爽

1、监控MySQL主从同步状态是否异常脚本#!/bin/bashHOST=localhostUSER=rootPASSWD=123.comIO_SQL_STATUS=$(mysql-h$...

PHP7.0.0正式版开放下载:速度大提升

IT之家讯PHP发布经理AnatolBelski在GitHub发布了PHP7.0.0正式版,该版本在速度提升上面有非常大的进步,比5.6版本提速两倍,已经接近Facebook开发的PHP执行引擎...