python爬蟲案例——東方財富股票資料採集
阿新 • • 發佈:2019-01-04
通過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()