看了北理老师的视频,那时用的百度股票这个网站现在你可以试试还能用吗?
目标:获取上交所和深交所所有的股票名称和交易信息,输出到文件
技术路线:requests+ bs4+ re
获取股票信息列表
东方财富网http://quote.eastmoney.com/stock_list.html
这个网站登陆的时候,可能一下子登陆进去不是下图的形式,反正我是登陆好几次才是。
获取单个股票信息
新浪股票https://finance.sina.com.cn/stock/
步骤1:从东方财富网获取股票列表
步骤2:根据股票列表逐个到新浪股票获取个股信息
步骤3:将结果存储到文件网页源代码部分信息
这里没有给出准确的数据,是用字符表示的,所以爬取的结果也是字符的形式,不知道是什么地方出了问题,有大佬路过可以指点迷津,感谢。
代码如下
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()
结果部分截图如下:
问题是存在的,目前还是不知道如何解决。有解决方案能力的大佬,可以帮助一下。