一、read_html函數
Pandas
包中的 read_html()
函數是最簡單的爬蟲,可以爬取靜態網頁表格數據。
但只適合於爬取 table
表格型數據,例如:
## 通過F12查看HTML結構
## http://www.air-level.com/air/guangzhou/
<table class="..." id="...">
<thead>
<tr>
<th>...</th>
</tr>
</thead>
<tbody>
<tr>
<td>...</td>
</tr>
<tr>...</tr>
<tr>...</tr>
...
<tr>...</tr>
<tr>...</tr>
</tbody>
</table>
1.語法解釋
import pandas as pd
pd.read_html(io, match='.+', flavor=None, header=None, index_col=None,
skiprows=None, attrs=None, parse_dates=False, tupleize_cols=None,
thousands=',', encoding=None, decimal='.', converters=None,
na_values=None, keep_default_na=True, displayed_only=True)
# 常用的參數
io:url、html文本、本地文件等
flavor:解析器
header:標題行
skiprows:跳過的行
attrs:屬性,例如:attrs = {'id':'table'}
parse_dates:解析日期
# 注意:返回的結果是DataFrame組成的list
2.實操
import pandas as pd
data = pd.read_html("http://www.air-level.com/air/guangzhou/", encoding='utf-8', header=0)[0]
'''
監測站 AQI 空氣質量等級 PM2.5 PM10 首要污染物
0 廣州番禺大學城 53 良 33 μg/m3 55 μg/m3 PM10
1 廣州市八十六中 41 優 21 μg/m3 40 μg/m3 NaN
2 廣州廣東商學院 37 優 26 μg/m3 36 μg/m3 NaN
3 廣州南沙黃閣 31 優 8 μg/m3 30 μg/m3 NaN
4 廣州市監測站 30 優 18 μg/m3 29 μg/m3 NaN
'''
Pandas
獲取網頁表格時,會同時解析所有表格,並存儲為 list
格式,因此需要通過切片的方式 table[x]
指定表格。
import pandas as pd
data = pd.read_html("http://www.air-level.com/rank", encoding='utf-8', header=0)[1]
# 即可獲取右邊表格
3.批量
以新浪財經機構持股匯總數據為例:
# 網址:http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml?p=46
# 共47頁
import pandas as pd
data = pd.DataFrame()
for i in range(1, 48):
url = r"http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml?p={}".format(i)
print(url)
data = pd.concat([data, pd.read_html(url)[0]])
# 爬取並且合並DataFrame
data2 = data.loc[data["證券代碼"].notna(),:].reset_index(drop=True)
data.shape # (3688, 9)
二、to_html函數
Pandas
導出數據有 to_csv
、to_sql
、to_excel
等,還可以利用 pd.to_html()
函數將數據存儲為 html
格式。
import os
import pandas as pd
os.chdir(r"C:\Users\Hider\Desktop")
data = pd.read_excel(r"C:\Users\Hider\Desktop\test.xlsx")
data.head()
html_table = data.to_html('test.html')
生成 test.html
文件,通過瀏覽器可打開。
通過 print
打印,可以看到 DataFrame
的內部結構被自動轉換為嵌入表格的 <TH><TR><TD>
標簽,保留所有內部層級結構。
print(data.to_html())
'''
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>證券代碼</th>
<th>證券簡稱</th>
<th>機構數</th>
<th>機構數變化</th>
<th>持股比例(%)</th>
<th>持股比例增幅(%)</th>
<th>占流通股比例(%)</th>
<th>占流通股比例增幅(%)</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
'''
1.參數
data.to_html('test.html', header=True, index=False, justify='center')
DataFrame.to_html(buf=None, columns=None, col_space=None,
header=True, index=True,na_rep='NaN',
formatters=None, float_format=None, sparsify=None,
index_names=True,justify=None,
bold_rows=True,classes=None, escape=True, max_rows=None,
max_cols=None,show_dimensions=False,
notebook=False, decimal='.', border=None)
# 參數解釋
buf : StringIO-like, 可選
寫入緩沖區。
columns : sequence,可選
要轉化的列的列名;默認值 None 為所有列轉化。
col_space : int,可選
每列的最小寬度。
header : bool,可選
是否打印列標簽,默認為 True。
index : 布爾值,可選
是否打印索引(行)標簽,默認為 True。
na_rep : 字符串,可選
指定 NAN 的字符串表示形式,默認為 'NaN'。
formatters : 多個單參數函數組成的列表或字典,可選
格式化程序可按列表的所索引或字典的鍵名稱應用於列元素,默認為 None。
每個單參數函數的結果必須是一個 unicode 字符串。列表的長度必須等於列數。
float_format: 單參數函數,可選
用於將列元素設置為浮點數的格式化程序功能,默認為無。
此單參數函數的結果必須是 unicode 字符串。
sparsify : bool,可選
默認為 True。輸入 False 時,對於具有層次結構索引的 DataFrame,會在每一行打印多重索引。
index_names : bool,可選
打印索引名稱,默認為 True。
line_width : int,可選
換行符的寬度,默認為不換行。
justify : 列標簽對齊方式, 可選
左右對齊列標簽。默認為 None時,使用打印配置中的選項(由 set_option 控制),則右對齊。
bold_rows : bool, 可選
對橫向表格線進行加粗。
classes : CSS類(es)適用於生成的html表, 可選
默認 None
escape : bool, 可選
將 "<", ">", "&" 轉化成 html 安全序列(??),默認 True。
max_rows : int, 可選
顯示最大行數。
max_cols : int, 可選
顯示最大列數。
decimal : str, 可選
小數分隔符, 默認為 '.'。
border : int, 可選
表格外邊框寬度,默認為 1,參數為 0 時表格無邊框。數值越大外邊框越寬。
還可對標題、顏色等進行調整。
2.拓展
結合 Flask
庫可實現頁面交互展示。
參考鏈接1:最簡單的爬蟲:用Pandas爬取表格數據
參考鏈接2:活用Pandas:將Excel轉為html格式