1. 程式人生 > >python爬蟲案例——東方財富股票資料採集

python爬蟲案例——東方財富股票資料採集

通過python爬取東方財富的股票資訊。獲取每隻股票的:總市值 淨資產 淨利潤 市盈率 市淨率 毛利率 淨利率 ROE

先爬取股票匯總頁面。 
這裡寫圖片描述

在進入每隻股票的詳情頁,爬取每隻股票的具體資訊。

這裡寫圖片描述

需要安裝BeautifulSoup包(點選下載)、requests包(點選下載)、lxml包(點選下載

python2.7、python3.6下

#coding=utf-8
import requests,re,json,time,os
import heapq

from bs4 import BeautifulSoup

class GPINFO(object):
    """docstring for GPINFO"""
def __init__(self): self.Url = 'http://quote.eastmoney.com/stocklist.html' self.BaseData = [] self.Date = time.strftime('%Y%m%d') self.Record = 'basedata'+self.Date if os.path.exists(self.Record): print ('record exist...') self.BaseData = self.get_base_data_from_record() else
: print ('fuck-get data again...') self.get_data() #將資料寫入到記錄檔案 def write_record(self,text): with open(self.Record,'ab') as f: f.write((text+'\n').encode('utf-8')) #從記錄檔案從讀取資料 def get_base_data_from_record(self): ll = [] with
open(self.Record,'rb') as f: json_l = f.readlines() for j in json_l: ll.append(json.loads(j.decode('utf-8'))) return ll #爬蟲獲取資料 def get_data(self): #請求資料 orihtml = requests.get(self.Url).content #建立 beautifulsoup 物件 soup = BeautifulSoup(orihtml,'lxml') #採集每一個股票的資訊 count = 0 for a in soup.find('div',class_='quotebody').find_all('a',{'target':'_blank'}): record_d = {} #代號 num = a.get_text().split('(')[1].strip(')') #獲取股票代號 if not (num.startswith('00') or num.startswith('60')):continue #只需要6*/0* 只要以00或60開頭的股票代號 record_d['num']=num #名稱 name = a.get_text().split('(')[0] #獲取股票名稱 record_d['name']=name #詳情頁 detail_url = a['href'] record_d['detail_url']=detail_url cwzburl = detail_url #傳送請求 try: cwzbhtml = requests.get(cwzburl,timeout=30).content #爬取股票詳情頁 except Exception as e: print ('perhaps timeout:',e) continue #建立soup物件 cwzbsoup = BeautifulSoup(cwzbhtml,'lxml') #財務指標列表 [浦發銀行,總市值 淨資產 淨利潤 市盈率 市淨率 毛利率 淨利率 ROE] roe:淨資產收益率 try: cwzb_list = cwzbsoup.find('div',class_='cwzb').tbody.tr.get_text().split() #獲取class為cwzb的div下第一個tbody下第一個tr獲取內部文字,並使用空格分割 except Exception as e: print ('error:',e) continue #去除退市股票 if '-' not in cwzb_list: record_d['data']=cwzb_list #將資料加入到字典中 self.BaseData.append(record_d) #將字典加入到總資料總 self.write_record(json.dumps(record_d)) #將字典型別轉化為字串,寫入文字 count=count+1 print (len(self.BaseData)) def main(): test = GPINFO() result = test.BaseData #[浦發銀行,總市值 淨資產 淨利潤 市盈率 市淨率 毛利率 淨利率 ROE] roe:淨資產收益率] top_10 = heapq.nlargest(10,result,key=lambda r:float(r['data'][7].strip('%'))) #獲取前10名利率最高者的資料 for item in top_10: for key in item['data']: print(key), print('\n') #列印字串時,使用print str.encode('utf8'); #列印中文列表時,使用迴圈 for key in list:print key #列印中文字典時,可以使用迴圈,也可以使用json: # import json # print json.dumps(dict, encoding='UTF-8', ensure_ascii=False) if __name__ == '__main__': main()