1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Pandas爬蟲,竟能如此簡單!

        共 4338字,需瀏覽 9分鐘

         ·

        2021-03-14 11:18


        眾所周知,一般的爬蟲套路無非是構造請求、解析網(wǎng)頁、提取要素、存儲數(shù)據(jù)等步驟。構造請求主要用到requests庫,提取要素用的比較多的有xpath、bs4、css和re。一個完整的爬蟲,代碼量少則幾十行,多則幾百行,對于新手來說學習成本還是比較高的。

        那么,有沒有什么方法只用幾行代碼就能爬下所需數(shù)據(jù)呢?答案是pandas。J哥自從知道了這個神器,嘗試了多個網(wǎng)頁數(shù)據(jù)爬取,屢戰(zhàn)屢勝,簡直不能再舒服!這家伙也太適合初學爬蟲的小伙伴玩耍了吧!

        本文目錄




        定 義


        pandas中的pd.read_html()這個函數(shù),功能非常強大,可以輕松實現(xiàn)抓取Table表格型數(shù)據(jù)。無需掌握正則表達式或者xpath等工具,短短的幾行代碼就可以將網(wǎng)頁數(shù)據(jù)抓取下來。





        原 理


        一.Table表格型數(shù)據(jù)網(wǎng)頁結構

        pandas適合抓取Table表格型數(shù)據(jù),那么咱們首先得知道什么樣的網(wǎng)頁具有Table表格型數(shù)據(jù)結構(有html基礎的大佬可自行跳過這一part)。

        我們先來看個簡單的例子。(快捷鍵F12可快速查看網(wǎng)頁的HTML結構)

        指南者留學網(wǎng)

        從這個世界大學排行的網(wǎng)站可以看出,數(shù)據(jù)存儲在一個table表格中,thread為表頭,tbody為表格數(shù)據(jù),tbody中的一個tr對應表中的一行,一個td對應一個表中元素。

        我們再來看一個例子:

        新浪財經(jīng)網(wǎng)

        也許你已經(jīng)發(fā)現(xiàn)了規(guī)律,以Table結構展示的表格數(shù)據(jù),大致的網(wǎng)頁結構如下:


        <table class="..." id="...">

             <thead>

             <tr>

             <th>...</th>

             </tr>

             </thead>

             <tbody>

                <tr>

                    <td>...</td>

                </tr>

                <tr>...</tr>

                <tr>...</tr>

                ...

                <tr>...</tr>

                <tr>...</tr>        

            </tbody>

        </table>

        Table表格一般網(wǎng)頁結構


        只要網(wǎng)頁具有以上結構,你就可以嘗試用pandas抓取數(shù)據(jù)。

        二.pandas請求表格數(shù)據(jù)原理

        基本流程

        針對網(wǎng)頁結構類似的表格類型數(shù)據(jù),pd.read_html可以將網(wǎng)頁上的表格數(shù)據(jù)都抓取下來,并以DataFrame的形式裝在一個list中返回。


        三.pd.read_html語法及參數(shù)


        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 :接收網(wǎng)址、文件、字符串;

        parse_dates:解析日期;

        flavor:解析器;

        header:標題行;

        skiprows:跳過的行;

        attrs:屬性,比如 attrs = {'id': 'table'}

        主要參數(shù)





        實 戰(zhàn)


        一.案例1:抓取世界大學排名(1頁數(shù)據(jù))

        1import pandas as pd 
        2import csv
        3url1 = 'http://www.compassedu.hk/qs'
        4df1 = pd.read_html(url1)[0] #0表示網(wǎng)頁中的第一個Table
        5df1.to_csv('世界大學綜合排名.csv',index=0)

        沒錯,5行代碼,幾秒鐘就搞定,我們來預覽下爬取到的數(shù)據(jù):

        世界大學排行榜


        二.案例2:抓取新浪財經(jīng)基金重倉股數(shù)據(jù)(6頁數(shù)據(jù))


        1import pandas as pd
        2import csv
        3df2 = pd.DataFrame()
        4for i in range(6):
        5    url2 = 'http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml?p={page}'.format(page=i+1)
        6    df2 = pd.concat([df2,pd.read_html(url2)[0]])
        7    print('第{page}頁抓取完成'.format(page = i + 1))
        8df2.to_csv('./新浪財經(jīng)數(shù)據(jù).csv',encoding='utf-8',index=0)


        沒錯,8行代碼搞定,還是那么簡單。如果對翻頁爬蟲不理解,可查看本公眾號歷史原創(chuàng)文章實戰(zhàn)|手把手教你用Python爬蟲(附詳細源碼),如果對DataFrame合并不理解,可查看本公眾號歷史原創(chuàng)文章基礎|Pandas常用知識點匯總(四)。


        我們來預覽下爬取到的數(shù)據(jù):


        基金重倉股數(shù)據(jù)


        三.案例3:抓取證監(jiān)會披露的IPO數(shù)據(jù)(217頁數(shù)據(jù))


         1import pandas as pd
        2from pandas import DataFrame
        3import csv
        4import time
        5start = time.time() #計時
        6df3 = DataFrame(data=None,columns=['公司名稱','披露日期','上市地和板塊','披露類型','查看PDF資料']) #添加列名
        7for i in range(1,218):  
        8    url3 ='http://eid.csrc.gov.cn/ipo/infoDisplay.action?pageNo=%s&temp=&temp1=&blockType=byTime'%str(i)
        9    df3_1 = pd.read_html(url3,encoding='utf-8')[2]  #必須加utf-8,否則亂碼
        10    df3_2 = df3_1.iloc[1:len(df3_1)-1,0:-1]  #過濾掉最后一行和最后一列(NaN列)
        11    df3_2.columns=['公司名稱','披露日期','上市地和板塊','披露類型','查看PDF資料'#新的df添加列名
        12    df3 = pd.concat([df3,df3_2])  #數(shù)據(jù)合并
        13    print('第{page}頁抓取完成'.format(page=i))
        14df3.to_csv('./上市公司IPO信息.csv', encoding='utf-8',index=0#保存數(shù)據(jù)到csv文件
        15end = time.time()
        16print ('共抓取',len(df3),'家公司,' + '用時',round((end-start)/60,2),'分鐘')


        這里注意要對抓下來的Table數(shù)據(jù)進行過濾,主要用到iloc方法,詳情可查看本公眾號往期原創(chuàng)文章基礎|Pandas常用知識點匯總(三)。另外,我還加了個程序計時,方便查看爬取速度。



        2分鐘爬下217頁4334條數(shù)據(jù),相當nice了。我們來預覽下爬取到的數(shù)據(jù)


        上市公司IPO數(shù)據(jù)


        需要注意的是,并不是所有表格都可以用pd.read_html爬取,有的網(wǎng)站表面上看起來是表格,但在網(wǎng)頁源代碼中不是table格式,而是list列表格式。這種表格則不適用read_html爬取,得用其他的方法,比如selenium。





        相關閱讀:


        瀏覽 56
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            又粗又硬又黄A级毛片伊人久 | 成人秘 高潮片免费视频在线观看 | 欧美熟妇乱伦视频 | 日韩AV一区二区三区四区 | 狼友视频首页入口 | 小妾成泄欲工具h | 玖玖视频在线观看免费 | 欧美黑人大屌 | 性生活2韩国 | 人人操人人叉 |