看了北理老师的视频,那时用的百度股票这个网站现在你可以试试还能用吗?
目标:获取上交所和深交所所有的股票名称和交易信息,输出到文件
技术路线:requests+ bs4+ re

获取股票信息列表

东方财富网http://quote.eastmoney.com/stock_list.html 这个网站登陆的时候,可能一下子登陆进去不是下图的形式,反正我是登陆好几次才是。

docker股票爬虫 爬取股票数据_a标签


获取单个股票信息

新浪股票https://finance.sina.com.cn/stock/

docker股票爬虫 爬取股票数据_字符串_02

步骤1:从东方财富网获取股票列表

步骤2:根据股票列表逐个到新浪股票获取个股信息

步骤3:将结果存储到文件网页源代码部分信息

docker股票爬虫 爬取股票数据_a标签_03

这里没有给出准确的数据,是用字符表示的,所以爬取的结果也是字符的形式,不知道是什么地方出了问题,有大佬路过可以指点迷津,感谢。

代码如下

import requests
import traceback
import bs4
import re


# 获取HTML页面内容
# 默认的编码为utf-8这样可以提高速度
def getHTMLText(url ):
    try:
        kv = {'user-agent': 'Mozilla/5.0'}
        r = requests.get(url, headers=kv, timeout=60)
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("getHTMLTextError!")
        return ""


# 获取股票代码列表
def getStockList(ls, StockUrl):
    html = getHTMLText(StockUrl)
    soup = bs4.BeautifulSoup(html, "html.parser")
    # 使用find_all找到所有的a标签
    for i in soup.find_all('a'):
        try:
            # 定义href属性是所有的a标签中的带有href的内容(字符串)
            href = i.attrs['href']
            # 使用正则表达式库来找到所有的href的字符串内容中的‘股票代码部分’
            ls.append(re.findall(r'[s][zh]\d{6}', href)[0])
        except:
            continue
    # print(ls)
    print(len(ls))


# 获取股票信息
def getStockInfo(ls, StockUrl, fpath):
    # 使用for来遍历股票代码列表中的股票
    count = 0
    for stock in ls:
        url = StockUrl + stock + "/nc.shtml"
        html = getHTMLText(url)
        try:
            # 如果页面信息是空的,就跳过
            if html == "":
                continue
            # 构建一个新字典来存储单个股票的各种信息
            info = {}
            soup = bs4.BeautifulSoup(html, "html.parser")
            stockinfo = soup.find('div', attrs={"class": "hq_title"})
            if isinstance(stockinfo, bs4.element.Tag):
                # 获取股票的名称
                stockname = stockinfo.find_all(attrs={"class": "c8_name"})[0]
                # 更新字典中的信息
                info.update({"股票名称": stockname.text})
                # print(info)
                # <th>标签存储的是Key,<td>标签存储的是Value
                stockinfo = soup.find('div', attrs={"class": "other"})
                Keylist = stockinfo.find_all('th')
                Valuelist = stockinfo.find_all('td')
                # 使用for循环对键值对和键值进行匹配,并且存储
                for i in range(len(Keylist)):
                    key = "".join(Keylist[i].text.split())  # "".join(.split()清除中文之间的字符
                    value = Valuelist[i].text
                    # 向字典中新增内容
                    info[key] = value
                # 将字典中的相关信息全部写入到文件中
               # print(info)
                with open(fpath, 'a', encoding='utf-8') as f:
                    f.write(str(info) + '\n')
                # 可以增加进度条
                count = count + 1
                print("\r进度:{:.2f}%".format(count * 100 / len(ls)), end='')
        except:
            count = count + 1
            print("\r进度:{:.2f}%".format(count * 100 / len(ls)), end='')
            traceback.print_exc()
            continue


# 运行主函数
def main():
    stock_list_url = 'http://quote.eastmoney.com/stock_list.html'
    stock_info_url = 'https://finance.sina.com.cn/realstock/company/'
    output_file = 'D:\\Stockspider.txt'
    stocklist = []
    getStockList(stocklist, stock_list_url)
    getStockInfo(stocklist, stock_info_url, output_file)
    print("Complete Successfully!")


main()

结果部分截图如下:

docker股票爬虫 爬取股票数据_docker股票爬虫_04

问题是存在的,目前还是不知道如何解决。有解决方案能力的大佬,可以帮助一下。