大家好,我是陈诚。说到Pandas中的read.xxx系列函数,大家第一反应会想到比较常用的pd.read_csv()和pd.read_excel()。大多数人可能从未使用过pd.read_html()函数。虽然低调,但是非常强大,用来抓Table数据是神器。没错,这个神器可以用于爬虫!01定义pd.read_html()是一个强大的函数。您不需要掌握正则表达式或xpath等工具。只需几行代码,即可轻松抓取Table网页数据。02原理1.Table表格数据网页结构为了理解Table网页结构,我们来看一个简单的例子。没错,简单!又如:新浪财经的规律:Table结构中显示的表格数据,网页结构是这样的:... ... ... ... ...... ... 二、pandas请求表单数据的基本流程原理实际上,pd.read_html可以将网页上的表格数据抓取下来,以DataFrame的形式以列表的形式返回。3.pd.read_html语法和参数基本语法: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:接收URL、文件、字符串;parse_dates:解析日期;风味:解析器;header:标题行;skiprows:跳过的行;attrs:属性,如attrs={'id':'table'}实战1.案例一:抓取世界大学排名(1页数据)1importpandasaspd2importcsv3url1='http://www.compassedu.hk/qs'4df1=pd.read_html(url1)[0]#0表示第一个Table5df1.to_csv('世界大学综合排名.csv',index=0)5行代码,会在一个几秒钟,数据预览:2.案例2:抓取新浪财经基金重仓股的数据(6页数据)1importpandasaspd2importcsv3df2=pd.DataFrame()4foriinrange(6):5url2='http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml?p={page}'.format(page=i+1)6df2=pd.concat([df2,pd.read_html(url2)[0]])7print('{page}页面抓取完成'.format(page=i+1))8df2.to_csv('./新浪财经数据.csv',encoding='utf-8',index=0)8行代码就搞定了,还是那么简单。预览一下爬取的数据:3.案例三:抓取证监会披露的IPO数据(217页数据)1importpandasaspd2frompandasimportDataFrame3importcsv4importtime5start=time.time()#timing6df3=DataFrame(data=None,columns=['公司名称','披露日期','上市地点及板块','披露类型','查看PDF数据'])#addcolumnname7foriinrange(1,218):8url3='http://eid.csrc.gov.cn/ipo/infoDisplay.action?pageNo=%s&temp=&temp1=&blockType=byTime'%str(i)9df3_1=pd.read_html(url3,encoding='utf-8')[2]#必须加utf-8,否则乱码10df3_2=df3_1.iloc[1:len(df3_1)-1,0:-1]#过滤掉最后一行最后一列(NaNcolumn)11df3_2.columns=['公司名称','披露日期','上市地及行业','披露类型','查看PDF数据']#newdfaddcolumnname12df3=pd.concat([df3,df3_2])#DataMerge13print('{page}页面抓取完成'.format(page=i))14df3.to_csv('./上市公司IPO信息.csv',encoding='utf-8',index=0)#保存数据到csv文件15end=time.time()16print('totalcapture',len(df3),'companies,'+'time',round((end-start)/60,2),'min')这里注意抓取的Table数据要进行过滤,主要是使用iloc方法。另外,我还加了一个程序计时来检查爬取速度。217页4334条数据爬下来用了2分钟,还是蛮nice的。预览一下爬取的数据:上市公司IPO数据:注意不是所有的表都能用pd.read_html爬取。有些网站表面上看起来是表格,但在网页源代码中并不是表格格式。相反,它是列表列表格式。这种形式不适合read_html爬取,得用其他方法,比如selenium。
