python:股票数据定向爬取

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

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


程序的结构设计
步骤1:从东方财富网获取股票列表
步骤2:根据股票列表逐个到百度股票获取个股信息
步骤3:将结果存储到文件
'''
import requests
import re
from bs4 import BeautifulSoup
import traceback


def getHTMLText(url,code="utf-8"):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encodind =code
        return r.text
    except:
        return print("")


def getStockList(list, stockURL):  # stockURL是获得股票列表的URL list用来存储
    html = getHTMLText(stockURL,"GB2312")
    soup = BeautifulSoup(html, "html.parser")
    a = soup.find_all("a")  # 返回一个a标签组成的列表,为什么?审查页面源代码你可看到所要的信息在a标签中
    # 返回了一个列表,里面是所有a标签
    for i in a:
        try:
            href = i.attrs["href"]  # 找到herf属性
            print(href)  # 用来测试
            print(re.findall(r'[s][hz]\d{6}', href))  # 用来测试
            # 用正则表达式
            list.append(re.findall(r'[s][hz]\d{6}', href)[0])  # 找到各支股票的代码信息 ,<>findall()返回一个列表
        except:
            continue


def getStockInfo(list, stockURL, fpath):  # 找到股票信息
    print(list)  # 用来测试
    count=0
    for stock in list:
        url = stockURL + stock + ".html"  # 获得股票信息的链接
        html = getHTMLText(url)
        try:
            if html == "":  # 判断当前页面是不是空页面
                continue
            infolist = {}
            soup = BeautifulSoup(html, "html.parser")

            stockinfo = soup.find("div",attrs={"class": "stock-bets"})  # <>.find()只返回一个结果,原页面中是<div class="stock-bets">
            # 返回的是字符串类型的
            name = stockinfo.find_all(attrs={'class': "bets-name"})[0]  
            infolist.update({"股票名称": name.text.split()[0]})  # stockinfo.text---找到文本部分

            keylist = stockinfo.find_all('dt')
            valuelist = stockinfo.find_all("dd")
            for i in range(len(keylist)):
                key = keylist[i]
                value = valuelist[i]
                infolist[key] = value  # 存储信息
            with open(fpath, 'a', encoding="utf-8") as f:
                f.write(str(infolist) + "\n")
                count=count+1
                print("\r当前进度:{:.2f}%".format(count*100/len(list)),end="")
        except:
            count = count + 1
            print("\r当前进度:{:.2f}%".format(count * 100 / len(list)), end="")
            # 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 = 'D://IDE//Pycharm//Spider//Re//baiduStockInfo.txt'  # 保存的路径
    slist = []  # 存储股票信息
    # 获得股票列表
    getStockList(slist, stock_list_url)
    # 获得股票信息
    getStockInfo(slist, stock_info_url, output_file)


main()
print("all done")

猜你喜欢

转载自blog.csdn.net/Yk_0311/article/details/81667761