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

优采云 发布时间: 2022-05-09 17:40

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

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

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

  这不难但是很浪费时间。

  

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

  import pandas as pd<br /><br />tables = pd.read_html("https://apps.sandiego.gov/sdfiredispatch/")<br /><br />print(tables[0])<br />

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

  #dataframe

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

  import pandas as pd<br /><br />calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"])<br /><br />print(calls_df)<br />

  得到:

  Call Date        Call Type              Street                             Cross Streets    Unit<br />  2017-06-02 17:27:58          Medical         HIGHLAND AV                 WIGHTMAN ST/UNIVERSITY AV     E17<br />  2017-06-02 17:27:58          Medical         HIGHLAND AV                 WIGHTMAN ST/UNIVERSITY AV     M34<br />  2017-06-02 17:23:51          Medical          EMERSON ST                    LOCUST ST/EVERGREEN ST     E22<br />  2017-06-02 17:23:51          Medical          EMERSON ST                    LOCUST ST/EVERGREEN ST     M47<br />  2017-06-02 17:23:15          Medical         MARAUDER WY                     BARON LN/FROBISHER ST     E38<br />  2017-06-02 17:23:15          Medical         MARAUDER WY                     BARON LN/FROBISHER ST     M41<br />

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

  import pandas as pd<br /><br />calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"])<br /><br />print(calls_df.to_json(orient="records", date_format="iso"))<br />

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

  [<br />  {<br />    "Call Date": "2017-06-02T17:34:00.000Z",<br />    "Call Type": "Medical",<br />    "Street": "ROSECRANS ST",<br />    "Cross Streets": "HANCOCK ST/ALLEY",<br />    "Unit": "M21"<br />  },<br />  {<br />    "Call Date": "2017-06-02T17:34:00.000Z",<br />    "Call Type": "Medical",<br />    "Street": "ROSECRANS ST",<br />    "Cross Streets": "HANCOCK ST/ALLEY",<br />    "Unit": "T20"<br />  },<br />  {<br />    "Call Date": "2017-06-02T17:30:34.000Z",<br />    "Call Type": "Medical",<br />    "Street": "SPORTS ARENA BL",<br />    "Cross Streets": "CAM DEL RIO WEST/EAST DR",<br />    "Unit": "E20"<br />  }<br />  // etc...<br />]<br />

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

  import pandas as pd<br /><br />calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"])<br /><br />calls_df.to_csv("calls.csv", index=False)<br />

  运行并双击calls.csv在电子表格中打开:

  

  当然,Pandas还可以更简单地对数据进行过滤,分类或处理:

  >>> calls_df.describe()<br /><br />              Call Date Call Type      Street           Cross Streets Unit<br />count                    69        69          69                      64   69<br />unique                   29         2          29                      27   60<br />top     2017-06-02 16:59:50   Medical  CHANNEL WY  LA SALLE ST/WESTERN ST   E1<br />freq                      5        66           5                       5    2<br />first   2017-06-02 16:36:46       NaN         NaN                     NaN  NaN<br />last    2017-06-02 17:41:30       NaN         NaN                     NaN  NaN<br /><br />>>> calls_df.groupby("Call Type").count()<br /><br />                      Call Date  Street  Cross Streets  Unit<br />Call Type<br />Medical                       66      66             61    66<br />Traffic Accident (L1)          3       3              3     3<br /><br />>>> calls_df["Unit"].unique()<br /><br />array(['E46', 'MR33', 'T40', 'E201', 'M6', 'E34', 'M34', 'E29', 'M30',<br />      'M43', 'M21', 'T20', 'E20', 'M20', 'E26', 'M32', 'SQ55', 'E1',<br />      'M26', 'BLS4', 'E17', 'E22', 'M47', 'E38', 'M41', 'E5', 'M19',<br />      'E28', 'M1', 'E42', 'M42', 'E23', 'MR9', 'PD', 'LCCNOT', 'M52',<br />      'E45', 'M12', 'E40', 'MR40', 'M45', 'T1', 'M23', 'E14', 'M2', 'E39',<br />      'M25', 'E8', 'M17', 'E4', 'M22', 'M37', 'E7', 'M31', 'E9', 'M39',<br />      'SQ56', 'E10', 'M44', 'M11'], dtype=object)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线