一、背景
在日常的數據分析工作中,經常會去尋找數據來源,因此會時常見到網頁表格信息,並且不能直接復制到excel表中。為了能快速的將網頁中的表格信息獲取,並進行分析總結,最后呈報上級領導。所以需要思考怎么去獲取信息更方便快捷,當然正常的網頁爬取也是可行,但是要相對復雜一些,這里我們選用pandas庫進行操作,表格爬取易如反掌。
二、必要知識
在開始獲取表格信息之前,需要了解一些pandas方法。pandas庫的文檔可以參考:https://www.pypandas.cn/docs/
1、pandas.DataFrame.to_csv方法:將數據保存為csv格式
DataFrame.to_csv(self, path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, mode='w', encoding=None, compression='infer', quoting=None, quotechar='"', line_terminator=None, chunksize=None, date_format=None, doublequote=True, escapechar=None, decimal='.')
- 文件路徑(path_or_buf):這個需要注意相對路徑和絕對路徑的區別。
- 分隔符(sep):默認情況下,數據是逗號進行分割。
- 替換空值(na_rep):默認情況下是空。
- 格式(float_format):可以設置格式。
- 保留例(columns):可以在columns填需要保留的例。
- 是否保留列名(header):默認情況是保留。
- 是否保留索引(index):默認情況下保留。
2、pandas.read_html方法:將HTML網頁中的表格解析為DataFrame對象,返回列表。詳參:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_html.html#pandas.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):接收網址、文件、字符串。
- 正則匹配數據(match):正則表達式,返回與正則表達式匹配的表格。
- 解析方式(flavor):解析器默認為‘lxml’,如果失敗則返回bs4 + html5lib。
- 標題行(header):指定列標題所在的行,list為多重索引。
- 解碼方式(encoding):解碼方式,默認使用網頁文檔中的編碼方式。
三、爬取表格數據
1、分析網站
本次示例的網站地址是:http://www.compassedu.hk/qs_。經過分析,網站的請求方式GET,爬取難度比較小。
然后,定位獲取表格數據。
最后,代碼實現表格數據的爬取。
import pandas as pd
import requests
from fake_useragent import UserAgent
import random
from lxml import etree
'''請求頭函數'''
def agent():
ua = UserAgent()
# 隨機選擇chrome、ie、firefox請求頭
useragent = random.choice([ua.chrome, ua.ie, ua.firefox])
headers = {
'User-Agent': useragent,
'Referer': 'https: // cn.bing.com /'
}
return headers
'''解析網頁數據'''
def parse_html(url):
try:
resp = requests.get(url, headers=agent())
# 將編碼方式設置為從內容中分析出的響應內容編碼方式
resp.encoding = resp.apparent_encoding
if resp.status_code == 200:
tree = etree.HTML(resp.text)
# 定位獲取表格信息
tb = tree.xpath('//table[@id="rk"]')
# 將byte類型解碼為str類型
tb = etree.tostring(tb[0], encoding='utf8').decode()
return tb
else:
print('爬取失敗')
except Exception as e:
print(e)
def main():
url = 'http://www.compassedu.hk/qs_'
tb = parse_html(url)
# 解析表格數據
df = pd.read_html(tb, encoding='utf-8', header=0)[0]
# 轉換成列表嵌套字典的格式
result = list(df.T.to_dict().values())
# 保存為csv格式
df.to_csv('university.csv', index=False)
print(result)
if __name__ == '__main__':
main()
結果展示:
四、分析表格數據信息
1、編碼格式轉換
雖然,表格數據已經保存到本地.csv文件中,但是用excel打開時發現是亂碼,而在代碼編輯器中打開又顯示正常,這是什么原因。其實,很簡單,擼代碼的時候經常會遇到編碼問題。只需要把excel編碼的方式改變,並保存為excel格式的數據文件即可。
首先,創建一個university.xlsx文件,然后打開它。在工具欄“數據”中找到“從文本/csv”導入數據,選擇數據源文件,也就是網上爬取的university.csv數據文件。最后點擊“導入”
選擇文件編碼方式,這里選擇的是utf-8的編碼方式。這里csv默認情況下數據是逗號進行分隔,所以不用再選擇。最后點擊加載即可。
2、數據分析
現在數據已經全部正常展示在excel表中,接着點擊“插入”數據透視表,或者用快捷方式ctrl+q也可以。最后點擊確定。
接着,再在數據透視表中進行調整,分析數據,得出結論。
最后,所以對於數據量不是非常大的情況,用excel的數據透視表功能,靈活的處理、分析、展示數據信息也是一種十分高效的方法。