1. 程式人生 > >python利用pandas直接爬取表格類資料

python利用pandas直接爬取表格類資料

table型的表格可以直接利用pandas的read_html一句話抓取,而不需依賴requests等爬蟲庫

嘗試爬取A股上市公司資料,參照了上面的文章,並做了一些改進。

針對原文pandas爬取的程式碼有幾個問題:

1、預設保留了所有頁的標題列,這樣爬取完之後出現大量的標題重複行

2、深交所上市的股票程式碼為000開頭,在read_html讀取過程中便預設去掉了0的字首

3、178頁的資料用for迴圈爬取依舊緩慢,考慮引入程序池

第二個問題是在read_html的過程中就捨棄了字首0,目前沒有找到對應的修改引數,最終只能嘗試在excel中用公式解決

選擇股票程式碼一列,右鍵-設定單元格格式-數字-自定義,輸入000000即可。

改進過後的輸入如下,只需幾秒鐘即可抓取全部178頁資料。

附程式碼:

import pandas as pd
import csv
from multiprocessing import Pool
import time

    
def getdata(url):
    tb = pd.read_html(url)[3] #經觀察發現所需表格是網頁中第4個表格,故為[3]
    tb.to_csv(r'E:\stock.csv', mode='a', encoding='utf_8_sig', header=0, index=0)
    time.sleep(0.5)
    #print('第'+str(i)+'頁抓取完成')

#引入程序池
def myprocesspool(num=10):
    pool = Pool(num)
    results = pool.map(getdata,urls)
    pool.close()
    pool.join()
    return results

if __name__=='__main__':
    urls=[]
    for i in range(1,179):  # 爬取全部178頁資料
        tmp = 'http://s.askci.com/stock/a/?reportTime=2017-12-31&pageNum=%s' % (str(i))
        urls.append(tmp)
        #預先輸入好表格的列名
    with open(r'E:\stock.csv', 'w', encoding='utf-8-sig', newline='') as f:
        csv.writer(f).writerow(['序號', '股票程式碼', '股票簡稱', '公司名稱', '省份', '城市' ,
              '主營業務收入','淨利潤','員工人數','上市日期','招股書','財報','行業分類','產品型別','主營業務'])
    myprocesspool(10)