17

这个Pandas函数可以自动爬取Web图表

 4 years ago
source link: https://zhuanlan.zhihu.com/p/344830261
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.
neoserver,ios ssh client

Pandas作为数据科学领域鳌头独占的利器,有着丰富多样的函数,能实现各种意想不到的功能。

作为学习者没办法一次性掌握Pandas所有的方法,需要慢慢积累,多看多练。

这次为大家介绍一个非常实用且神奇的函数- read_html() ,它可免去写爬虫的烦恼,自动帮你抓取静态网页中的表格。

简单用法: pandas.read_html(url)

主要参数:

  • io:接收网址、文件、字符串
  • header:指定列名所在的行
  • encoding:The encoding used to decode the web page
  • attrs:传递一个字典,用其中的属性筛选出特定的表格

只需要传入url,就可以抓取网页中的所有表格,抓取表格后存到列表,列表中的每一个表格都是dataframe格式。

我们先简单抓取天天基金网的基金净值表格,目标url: http:// fund.eastmoney.com/fund .html

YFVVBzr.jpg!mobile

可以看到上面html里是table表格数据,刚好适合抓取。

import pandas as pd
url = "http://fund.eastmoney.com/fund.html"
data = pd.read_html(url,attrs = {'id': 'oTable'})
# 查看表格数量
tablenum = len(data)
print(tablenum)

输出:1

通过'id': 'oTable'的筛选后,只有一个表格,我们直接爬取到了基金净值表。

data[1]
eiA3yeQ.jpg!mobile

但这里只爬取了第一页的数据表,因为天天基金网基金净值数据每一页的url是相同的,所以read_html()函数无法获取其他页的表格,这可能运用了ajax动态加载技术来防止爬虫。

附:一般来说,一个爬虫对象的数据一次展现不完全时,就要多次展示,网站的处理办法有两种: 1、下一个页面的url和上一个页面的url不同,即每个页面的url是不同的,一般是是序号累加,处理方法是将所有的html页面下载至本地,从而拿到所有数据;(天天基金网显示不是这种类型) 2、下一个页面的url和上一个页面的url相同,即展示所有数据的url是一样的,这样的话网页上一般会有“下一页”或“输入框”与“确认”按钮,处理方法是将代码中触发“下一页”或“输入框”与“确认”按钮点击事件来实现翻页,从而拿到所有数据。(天天基金网是这种类型)

刚只是简单地使用了 read_html() 获取web表格的功能,它还有更加复杂的用法,需要了解其参数含义。

详细用法

pandas.read_html( io, match='.+', flavor=None, header=None, index_col=None, skiprows=None, attrs=None, parse_dates=False, thousands=', ', encoding=None, decimal='.', converters=None, na_values=None, keep_default_na=True, displayed_only=True)

详细参数

io: str, path object 或 file-like objectURL,file-like对象或包含HTML的原始字符串。请注意,lxml仅接受http,ftp和文件url协议。如果您的网址以'https'您可以尝试删除's'。

match: str 或 compiled regular expression, 可选参数将返回包含与该正则表达式或字符串匹配的文本的表集。除非HTML非常简单,否则您可能需要在此处传递非空字符串。默认为“。+”(匹配任何非空字符串)。默认值将返回页面上包含的所有表。此值转换为正则表达式,以便Beautiful Soup和lxml之间具有一致的行为。

flavor: str 或 None要使用的解析引擎。 ‘bs4’和‘html5lib’彼此同义,它们都是为了向后兼容。默认值None尝试使用lxml解析,如果失败,它会重新出现bs4+html5lib。

header: int 或 list-like 或 None, 可选参数该行(或MultiIndex)用于创建列标题。

index_col: int 或 list-like 或 None, 可选参数用于创建索引的列(或列列表)。

skiprows: int 或 list-like 或 slice 或 None, 可选参数解析列整数后要跳过的行数。从0开始。如果给出整数序列或切片,将跳过该序列索引的行。请注意,单个元素序列的意思是“跳过第n行”,而整数的意思是“跳过n行”。

attrs: dict 或 None, 可选参数这是属性的词典,您可以传递该属性以用于标识HTML中的表。在传递给lxml或Beautiful Soup之前,不会检查它们的有效性。但是,这些属性必须是有效的HTML表属性才能正常工作。例如, attrs = {'id': 'table'} 是有效的属性字典,因为‘id’ HTML标记属性是任何HTML标记的有效HTML属性,这个文件。 attrs = {'asdf': 'table'} 不是有效的属性字典,因为‘asdf’即使是有效的XML属性,也不是有效的HTML属性。可以找到有效的HTML 4.01表属性这里。可以找到HTML 5规范的工作草案这里。它包含有关现代Web表属性的最新信息。

parse_dates: bool, 可选参数参考read_csv()更多细节。

thousands: str, 可选参数用来解析成千上万个分隔符。默认为','。

encoding: str 或 None, 可选参数用于解码网页的编码。默认为None None 保留先前的编码行为,这取决于基础解析器库(例如,解析器库将尝试使用文档提供的编码)。

decimal: str, 默认为 ‘.’可以识别为小数点的字符(例如,对于欧洲数据,请使用“,”)。

converters: dict, 默认为 None用于在某些列中转换值的函数的字典。键可以是整数或列标签,值是采用一个输入参数,单元格(而非列)内容并返回转换后内容的函数。

na_values: iterable, 默认为 None自定义NA值。

keep_default_na: bool, 默认为 True如果指定了na_values并且keep_default_na为False,则默认的NaN值将被覆盖,否则将附加它们。

displayed_only: bool, 默认为 True是否应解析具有“display:none”的元素。

最后, read_html() 仅支持静态网页解析,你可以通过其他方法获取动态页面加载后response.text 传入 read_html() 再获取表格数据。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK