21

如何批量采集网页表格数据?

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI1MTE2ODg4MA%3D%3D&%3Bmid=2650071806&%3Bidx=1&%3Bsn=53fded8da3239ef98bdefaad819a2e98
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文的视频讲解已经上传到千聊平台 凡购买199元系列课的童鞋可直接免费观看学习

Comming Soon! Python&Stata数据分析课寒假工作坊

我们最想要的数据格式就是表数据,但这表格并不是excel文件,而是存在于网页上的表数据。比如本教程实验网站

http://s.askci.com/stock/a

640?wx_fmt=png

一般遇到这种数据,最简单的方法就是复制粘贴,但是当

  • 复制粘贴格式混乱

  • 粘贴工作量太多 就需要写爬虫帮我们处理这件事情。但是常见的爬虫教程没有详细教大家怎么处理这种网址,今天我就简单说下办法。

审查网页

640?wx_fmt=png

我们可以发现

  • 视图(平常肉眼所见)与html(图片下方的html)的一一对应对关系

  • html中有  <table> 标签

网页种的table表

先来简单解释一下上文出现的几种标签含义:

  • <table> : 定义表格

  • <thead> : 定义表格的页眉

  • <tbody> : 定义表格的主体

  • <tr> : 定义表格的行

  • <th> : 定义表格的表头

  • <td> : 定义表格单元

看到table这样的表格数据,我们可以利用pandas模块里的read_html函数方便快捷地抓取下来。

爬虫思路

  1. 寻找表格网页对应的url的网址规律

  2. 试图对某一个表格网页url进行访问

  3. 定位到所想要的table部分,得到  <table>...</table> 字符串table_str

  4. 使用pd.read html(table str),得到一个df

  5. 循环2-4,得到的dfs(存放多个df的列表)

  6. 多个df合并为新的alldf(alldf为dataframe)结果保存到csv文件中, alldf.to_csv(filename)

实战

1. 网址规律

先尝试点击翻页,看看网址栏中url变化

640?wx_fmt=png

640?wx_fmt=png

我们很幸运的发现网址前后有变化

所以网址规律

2. 尝试对任意页面(page2)进行访问

尝试对第二页进行访问,只要 肉眼见到html中的数据 对应上,就证明访问是正常的。

640?wx_fmt=png

这里用 深圳市特力(集团)股份有限公司 来验证

这次很幸运,因为requests.get(url)访问时并没有伪装成浏览器,网站也没有封锁这个python爬虫。我们继续

3. 定位table数据

640?wx_fmt=png

如图,F12打开开发者工具, 我们定位到 id=myTable04 的table。

Run

3. table_str2dataframe

使用pd.read html(table str)将table字符串变为dataframe

Run

跟我们设想的不太一样,结果不是dataframe应该有的样子。经过谷歌和百度,解决办法如下

640?wx_fmt=png

4. 完整代码

重复操作

  1. 根据url规律,对多个表格url网页进行批量访问

  2. 重复之前对操作,得到dfs(存放多个df的列表)

  3. 将dfs转化为名为alldf的dataframe,并alldf.to_csv

5. 采集结果

640?wx_fmt=gif

参数学习

常用的参数:

  • io: 实际上io这个位置不仅可以是table字符串,还可以是表格的url、表格的html文本、或者本地文件等;但建议爬在本案例中用table_str而不是url。网址不接受https,尝试去掉s后爬去

  • header:标题所在的行数;

  • skiprows:跳过的行;

  • attrs:表格属性,对指定复合attrs值的表格进行解析,比如  attrs={‘id’:xxx’} 解析id为xxx的table

  • parse_dates:是否解析日期,默认不解析

  • encoding: 文件编码格式,常见的有 utf-8、 gbk等,默认为None

  • converters: 字典格式,指定某一列按照某一类型数据去处理。如converters={'股票代码': str},对股票代码这一列按照字符串(而不是数字)方式处理

近期文章


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK