爬虫实例(三)——股票数据定向爬虫

来源:互联网 发布:php server 编辑:程序博客网 时间:2024/04/29 08:51

功能描述

目标:获取上交所和深交所所有股票的名称和交易信息
输出:保存到文件中
技术路线:requests‐bs4‐re

候选数据网站的选择

选取原则:股票信息静态存在于HTML页面中,非js代码生成
没有Robots协议限制
选取方法:浏览器F12,源代码查看等
选取心态:不要纠结于某个网站,多找信息源尝试

具体选取过程请看课程视频:北京理工大学公开课《Python网络爬虫与信息提取》

数据网站的确定

获取股票列表:
东方财富网:http://quote.eastmoney.com/stocklist.html

获取个股信息:
百度股票:https://gupiao.baidu.com/stock/
单个股票:https://gupiao.baidu.com/stock/sz002439.html

查看东方财富网的源代码,可以发现个股链接在标签 <a> 中,并且链接都是在东方财富网的链接后面加上 sh(上海) 或者 sz(深圳) 再加上 6 个数字加 “.html”。

我们在东方财富网上获得个股链接(获得 sh/sz+6个数字)即可,然后在百度股票上查看信息。将在东方财富网上的信息加在百度股票后面即可得到单个股票的链接。(见上面举例)

这里写图片描述

以上面的单个股票为例 (https://gupiao.baidu.com/stock/sz002439.html), 查看其源代码,可以看出,股票所有信息都在 class 属性为 “stock-info” 的标签中。查看其基本信息,股票名字在 class 属性为 “bets-name” 的标签中,而成交量等信息在标签 <dt><dd> 中。

这里写图片描述

程序的结构设计

这里写图片描述

(其中,个股信息采用键值对维护)

代码:

import requests as reqfrom bs4 import BeautifulSoup# traceback模块被用来跟踪异常返回信息import tracebackimport redef getHTMLText(url):    try:        r = req.get(url)        r.raise_for_status()        r.encoding = r.apparent_encoding        return r.text    except:        return ""def getStockList(lst, stockURL):    html = getHTMLText(stockURL)    soup = BeautifulSoup(html, 'html.parser')    # 个股链接在 <a> 标签中    a = soup.find_all('a')    for i in a:        try:            # 个股链接在 <a> 标签的 href 属性中            # 我们需要获得 sh/sz + 6 个数字,利用正则表达式            href = i.attrs['href']            lst.append(re.findall(r"[s][hz]\d{6}", href)[0])        except:            continuedef getStockInfo(lst, stockURL, fpath):    for stock in lst:        url = stockURL + stock + ".html"        html = getHTMLText(url)        try:            if html == "":                continue            # 使用键值对记录个股信息            infoDict = {}            soup = BeautifulSoup(html, 'html.parser')            stockInfo = soup.find('div', attrs={'class':'stock-bets'})            # 获取股票名称            name = stockInfo.find_all(attrs={'class':'bets-name'})[0]            infoDict.update({'股票名称':name.text.split()[0]})            # 在 <dt><dd> 标签中获取其他信息,用键值对维护            keyList = stockInfo.find_all('dt')            valueList = stockInfo.find_all('dd')            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')        # 利用 traceback 跟踪并输出异常信息        except:            traceback.print_exc()            continuedef main():    stock_list_url = "http://quote.eastmoney.com/stocklist.html"    stock_info_url = "https://gupiao.baidu.com/stock/"    output_file = "C:/Users/ChenJX/Desktop/爬虫/Result_stock.txt"    lst = []    getStockList(lst, stock_list_url)    getStockInfo(lst, stock_info_url, output_file)main()    

去相应文件查看输出结果即可。需要注意的是,运行过程中可能会抛出异常信息,如下图所示。这是因为代码中的 stockInfo 可能为空,发生异常。

这里写图片描述

【参考】北京理工大学网络公开课《Python网络爬虫与信息提取》

原创粉丝点击