股票数据的定向爬虫——嵩天老师网课学习

#-------------------------------------------------------------------------------
#任务:定向爬取股票数据
#技术路线:requests-BeautifulSoup-re
#股票列表获取:东方财富网
#股票信息获取:雪球网
#因为雪球网与百度股票的html是不一样的,因此只能通过搜索一个个属性中的数值来爬取
#在这里仅爬取股票名称,股票价格,股票当前状态与交易时间
#该代码的爬取结果:前小部分的股票仅能爬取到名字,后面大部分都能爬取到名称,价格,状态和时间,原因未知
#-------------------------------------------------------------------------------
import requests
from bs4 import BeautifulSoup
import traceback
import re

def getHTMLText(url,code='utf-8'):
    try:
        #东方财富网的列表数据可以直接获取,但是爬取雪球网需要就行浏览器的伪装
        kv={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
        r=requests.get(url,headers=kv,timeout=30)
        r.raise_for_status()
        r.encoding=code
        return r.text
    except:
        return "1?"

#从东方财富网爬取股票代码,并存入到列表中
def getStockList(lst,stockURL):
    html=getHTMLText(stockURL)
    soup=BeautifulSoup(html,'html.parser')
    a=soup.findAll('a')
    for i in a:
        try:
            href=i.attrs['href']
            lst_s=re.findall(r"[s][hz]\d{6}",href)[0]
            #根据雪球网的网址,股票代码前面的字母均需要变为大写
            lst.append(lst_s.upper())
        except:
            continue
    for lists in lst:
        print(lists)

#从雪球网获取每个股票代码对应的股票信息
def getStockInfo(lst,stockURL,fpath):
    count=0
    for stock in lst:
        url=stockURL+stock
        html=getHTMLText(url)
        try:
            #如果网页为空,则跳过这一次,继续循环
            if html=="":
                continue
            infoDict={}
            soup=BeautifulSoup(html,'html.parser')

            #stock_name_Info=soup.find('div',attrs={'class':'page-row'})
            #.find如果无法查找到该属性,会返回NoneType,其值为None
            #字典的更新需要一对键值对
            name=soup.find('div',attrs={'class':'stock-name'})
            if name is None:
                infoDict.update({'股票名称':'查询不到该股票'})
                #print("查询不到该股票")
            else:
                infoDict.update({'股票名称':name.text.split()[0]})

            #stockInfo=soup.find_all('div',attrs={'class':'stock-info'})[0]
            price=soup.find('div',attrs={'class':'stock-current'})
            if price is None:
                infoDict.update({'当前价格':'查询不到当前价格'})
                #print("无当前价格")
            else:
                infoDict.update({'当前价格':price.text.split()[0]})

            flags=soup.find(attrs={'class':'stock-flag'})
            if flags is None:
                infoDict.update({'当前状态':'查询不到当前状态'})
                #print("无当前状态")
            else:
                infoDict.update({'当前状态':flags.text.split()[0]})

            times=soup.find('div',attrs={'class':'stock-time'})
            if times is None:
                infoDict.update({'交易时间':'查询不到交易时间'})
                #print("无交易时间")
            else:
                infoDict.update({'交易时间':times.span.text.split()[0]})

            #keyList=stockInfo.find_all('td')
            #valueList=stockInfo.find_all('span')

            #for i in range(len(keyList)):
                #key=keyList[i].text
                #val=valueList[i].text
                #infoDict[key]=val

            with open(fpath,'a',encoding='utf-8') as f:
                f.write(str(infoDict)+'\n')
                count=count+1
                print('\r当前速度:{:.2f}%'.format(count*100/len(lst)),end="")
                #print("文件已经保存")
        except:
            traceback.print_exc()
            count=count+1
            print('\r当前速度:{:.2f}%'.format(count*100/len(lst)),end="")
            #print("2?")
            continue

def main():
    stock_list_url='http://quote.eastmoney.com/stock_list.html'
    stock_info_url='https://xueqiu.com/S/'
    output_file='F:\TecentstockInfo.txt'
    slist=[]
    getStockList(slist,stock_list_url)
    getStockInfo(slist,stock_info_url,output_file)


if __name__ == '__main__':
    main()

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值