定向爬虫---股票数据

1.目标

获得上交所和深交所所有股票的名称和交易信息,输出到文件内

2.技术路线

采用requests库和BeautifulSoup库以及正则表达式re库

网站选择原则: 股票信息静态存在于html页面中,非js代码生成,没有Robbts协议限制。

选取方法: 打开网页,查看源代码,搜索网页的股票价格数据是否存在于源代码中。

3.数据网站的确定

新浪股票在页面上看到的股票代码在源代码中并没有,说明很可能是由JavaScript脚本生成的;而百度股票的每一支个股的信息都写在HTML代码中

所以对于这两个网站来讲,百度股票更适合作为定向爬虫的数据来源

获取股票列表:

东方财富网:http://quote.eastmoney.com/stocklist.html

获取个股信息:

百度股票:https://gupiao.baidu.com/stock/

单个股票:https://gupiao.baidu.com/stock/sz002439.html

4.实现步骤:

     1.从东方财富网获取股票列表

     2.根据股票列表逐个到百度股票获取个股信息

     3.将结果存储到文件内

5.优点与改进

1.在原来的通用框架下增加了code变量,是为了将减少代码遍历页面获得页面的编码格式,从而减少了爬虫时间

2.利用\r制作一个进程显示,\r可以使得打印完当前行之后,光标返回当前行的最开始部分

import requests
from bs4 import BeautifulSoup
import re
import traceback
#获得网页文本信息
def getHTMLText(url,code='utf-8'):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding=code
        #将已知的编码格式赋给encoding,从而使得代码不用解析页面的编码格式
        return r.text
    except:
        return ""

def getStockList(lst,stockURL):
    html=getHTMLText(stockURL,'GB2312')
    soup=BeautifulSoup(html,'html.parser')
    a=soup.find_all('a')
    for i in a:
        try:
            #将含有'href'的内容的标签赋给href
            href=i.attrs['href']
            #正则匹配六位数字
            lst.append(re.findall(r'[s][hz]\d{6}',href)[0])
        except:
            continue

def getStockInfo(lst,stockURL,fpath):
    count=0;
    for stock in lst:
        url=stockURL+stock+".html"
        html=getHTMLText(url)
        try:
            if html=="":
                continue
            infoDict={}
            soup=BeautifulSoup(html,"html.parser")
            #放在div内的名字
            stockInfo=soup.find('div',attrs={'class':'stock-bets'})
            name=stockInfo.find_all(attrs={'class':'bets-name'})[0]
            infoDict.update({'股票名称':name.text.split()[0]})
            #获取以键值对形式存放的信息
            keyList=stockInfo.find_all('dt')
            valueList=stockInfo.find_all('dd')
            #将信息放入字典内
            for i in range(len(keyList)):
                key=keyList[i].text
                value=valueList[i].text
                infoDict[key]=value
            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="")
        except:
            traceback.print_exc()
            continue
def main():
    stock_list_url='http://quote.eastmoney.com/stocklist.html'
    stock_info_url='https://gupiao.baidu.com/stock/'
    output_file='E://BaiduStockInfo.txt'
    slist=[]
    getStockList(slist,stock_list_url)
    getStockInfo(slist,stock_info_url,output_file)

if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值