利用pandas快速獲取網頁中的表格數據


一、背景

在日常的數據分析工作中,經常會去尋找數據來源,因此會時常見到網頁表格信息,並且不能直接復制到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的數據透視表功能,靈活的處理、分析、展示數據信息也是一種十分高效的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM