Pandas也能爬虫?爬取网页数据并存储至本地数据库

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

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

1. 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:解析日期

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

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

查找元素的时候我们发现新浪财经数据中心的数据即为表格型数据,如下图所示在检查元素里面有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='foriinrange(6):url=str(url_str)+str(i+1)print(url)

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

importpandasaspddf=pd.DataFrame()url_str='http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml?p='foriinrange(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()

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

2. 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()

3. 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()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容