python股票数据定向爬取

可紊 提交于 2020-01-29 17:22:50

说明:所有内容均作为学习用途


一.功能描述

1.获取上交所所有股票的名称和交易信息;
2.保存到文件中
3.技术路线 requests-bs4-re

二.候选网站数据选择

1.股票信息静态存在于HTML页面中,非js代码生成;无robots协议限制;
2.选取方法:源代码查看,例如 本案例选取的 同花顺,右键网页查看源代码,复制关键词,如 中国平安,可在源代码中找到,此为代码写在HTML中;

在这里插入图片描述
候选网站:同花顺,作为获取沪交所股票代码编号;集思录获取具体的股票信息。

目标获取的信息如下:

在这里插入图片描述

三.程序结构的设计

1. 从东方财富网获取股票列表
2. 根据股票列表逐个到百度股票获取个股信息
3. 将结果存储到文件

在这里插入图片描述
源代码分析:只要获取到 a 标签,然后获取到其中链接的股票代码即可(使用正则表达式\d{6}

这一部代码:

def getStockList(lst,stockURL):
    # 在同花顺网站获取股票编码
    html = getHTMLText(stockURL)
    soup = BeautifulSoup(html,'lxml')
    a = soup.find_all('a')
    for i in a:
        try:
            href = i.attrs['href']
            if re.findall(r'\d{6}',href)[0] not in lst:
                lst.append(re.findall(r'\d{6}',href)[0])
        except:
            continue
    print(lst) # 股票编码

接着根据获取的目标股票代码,https://www.jisilu.cn/data/stock/601318,其最后的数字为股票代码;
在这里插入图片描述
获取响应的html代码片段
在这里插入图片描述

def getStockInfo(lst,stockURL,fpath):
    for stock in lst:
        # 根据在同花顺网站获取的股票编码+集思录url获取某个股票的具体信息
       url = stockURL + stock;
       html = getHTMLText(url)
       try:
           if html=="":
                continue
           infoDict = {}
           soup = BeautifulSoup(html,'lxml')
           divList = soup.find('div',attrs={'class':'grid data_content'})
           count = 0
           mystr = ""
           for div in divList:
               # print(div)
               mystr = mystr + str(div)
               count += 1
               if count >= 8:
                   break
           # 这一部分就是仅获取图片中的那一部分的数据,为什么是8?我是一点一点数字放大打印出来的
           mystr = mystr.replace('<td> </td>', '')# 将代码中的空格替换掉
           mystr = mystr.replace('<td style="width:  20px;"> </td>','') # 同上
           myhtml = BeautifulSoup(mystr,'html.parser')

           name = myhtml.find_all('li',attrs={'class':'active'})[0]
           infoDict.update({'股票名称':name.text.split()})
           keylist = myhtml.find_all('td')
           keykeylist = []
           for key in keylist:
               strkey = str(key)
               strkey = strkey.replace('\n','')
               match = re.search(r'(?<=\>).*?(?=\<span)',strkey) or re.search(r'(?<=\>).*?(?=\<sup)',strkey)
               # 将<td title="5年平均股息率:-">股息率<sup>TTM</sup><span class="dc">15.066%</span>和 
               # <td style="width: 150px;">现价 <span class="dc">5.310</span></td>
               # 将关键字 现价  和 股息率 提取出来
               if match:
                   keykeylist.append(match.group(0).replace(' ','').replace('<sup>TTM</sup>',''))
			# 将关键字中的空格换行,其他没有信息替换掉
           valuelist = myhtml.find_all('span',attrs={'class':'dc'})

           for i in range(len(valuelist)):
               key = keykeylist[i]
               val = valuelist[i].text
               infoDict[key] = val
           #print(infoDict)

           with open(fpath,'a',encoding='utf-8') as f:
               f.write(str(infoDict)+'\n')
       except:
           traceback.print_exc()
           continue

获取html文本的代码

def getHTMLText(url):
    try:
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
                   'Cookie':'Hm_lvt_78c58f01938e4d85eaf619eae71b4ed1=1580215573; Hm_lvt_60bad21af9c824a4a0530d5dbf4357ca=1580215582; Hm_lvt_f79b64788a4e377c608617fba4c736e2=1580215582; refreshStat=off; historystock=603157; spversion=20130314; log=; Hm_lpvt_60bad21af9c824a4a0530d5dbf4357ca=1580224645; Hm_lpvt_78c58f01938e4d85eaf619eae71b4ed1=1580224645; Hm_lpvt_f79b64788a4e377c608617fba4c736e2=1580224645; v=Alq6cdiH0GXMClzJxLUTFzQoqwt_i941UA9SCWTTBu241_S9TBsudSCfoL03'}
        r = requests.get(url,headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

其中header中的数据来源和原因可见 链接

最后代码的主体部分
import requests
from bs4 import BeautifulSoup
import traceback
import re
def main():
    stock_list_url_hg = "http://data.10jqka.com.cn/hgt/hgtb/"  #沪股
    stock_info_url = "https://www.jisilu.cn/data/stock/"
    output_file = "D:\\self_taught\\python\\WebCrawler\\BaiduStockInfo.txt"
    slist = []
    getStockList(slist,stock_list_url_hg)
    getStockInfo(slist,stock_info_url,output_file)
main()

运行结果:

在这里插入图片描述
我是打印出来,也可在文本文件中查看。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!