Python抓取网页数据的终极办法

枫铃4年前 (2021-06-26)Python271

假设你在网上搜索某个项目所需的原始数据,但坏消息是数据存在于网页中,并且没有可用于获取原始数据的API。

所以现在你必须浪费30分钟写脚本来获取数据(最后花费 2小时)。

这不难但是很浪费时间。

Pandas库有一种内置的方法,可以从名为read_html()的html页面中提取表格数据:

https://pandas.pydata.org/

importpandasaspd

tables = pd.read_html("https://apps.sandiego.gov/sdfiredispatch/")

print(tables[0])

就这么简单! Pandas可以在页面上找到所有重要的html表,并将它们作为一个新的DataFrame对象返回。

https://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe

输入表格0行有列标题,并要求它将基于文本的日期转换为时间对象:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
importpandasaspd

calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"])

print(calls_df)

得到:

CallDateCallTypeStreetCrossStreets    Unit

2017-06-0217:27:58Medical         HIGHLAND AV                 WIGHTMAN ST/UNIVERSITY AV     E17

2017-06-0217:27:58Medical         HIGHLAND AV                 WIGHTMAN ST/UNIVERSITY AV     M34

2017-06-0217:23:51Medical          EMERSON ST                    LOCUST ST/EVERGREEN ST     E22

2017-06-0217:23:51Medical          EMERSON ST                    LOCUST ST/EVERGREEN ST     M47

2017-06-0217:23:15Medical         MARAUDER WY                     BARONLN/FROBISHER ST     E38

2017-06-0217:23:15Medical         MARAUDER WY                     BARONLN/FROBISHER ST     M41

是一行代码,数据不能作为json记录可用。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
importpandasaspd

calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"])

print(calls_df.to_json(orient="records", date_format="iso"))

运行下面的代码你将得到一个漂亮的json输出(即使有适当的ISO 8601日期格式):

[

{

"Call Date":"2017-06-02T17:34:00.000Z",

"Call Type":"Medical",

"Street":"ROSECRANS ST",

"Cross Streets":"HANCOCK ST/ALLEY",

"Unit":"M21"

},

{

"Call Date":"2017-06-02T17:34:00.000Z",

"Call Type":"Medical",

"Street":"ROSECRANS ST",

"Cross Streets":"HANCOCK ST/ALLEY",

"Unit":"T20"

},

{

"Call Date":"2017-06-02T17:30:34.000Z",

"Call Type":"Medical",

"Street":"SPORTS ARENA BL",

"Cross Streets":"CAM DEL RIO WEST/EAST DR",

"Unit":"E20"

}

// etc...

]

你甚至可以将数据保存到CSV或XLS文件中:

importpandasaspd

calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"])

calls_df.to_csv("calls.csv", index=False)

运行并双击calls.csv在电子表格中打开:
在这里插入图片描述
当然,Pandas还可以更简单地对数据进行过滤,分类或处理:

>>> calls_df.describe()

CallDateCall Type      Street           Cross Streets Unit

count6969696469

unique292292760

top2017-06-0216:59:50Medical  CHANNEL WY  LA SALLE ST/WESTERN ST   E1

freq566552

first2017-06-0216:36:46NaNNaNNaNNaN

last2017-06-0217:41:30NaNNaNNaNNaN

>>> calls_df.groupby("Call Type").count()

CallDateStreet  Cross Streets  Unit

Call Type

Medical66666166

Traffic Accident (L1)3333

>>> calls_df["Unit"].unique()

array(['E46','MR33','T40','E201','M6','E34','M34','E29','M30',

'M43','M21','T20','E20','M20','E26','M32','SQ55','E1',

'M26','BLS4','E17','E22','M47','E38','M41','E5','M19',

'E28','M1','E42','M42','E23','MR9','PD','LCCNOT','M52',

'E45','M12','E40','MR40','M45','T1','M23','E14','M2','E39',

'M25','E8','M17','E4','M22','M37','E7','M31','E9','M39',

'SQ56','E10','M44','M11'], dtype=object)

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。