思路:
1、首先需要找到一个将股票信息存放在html上的股票网站
2、因为每一个股票都是一个独立的页面,所以在抓取时,首先要了解每个股票网址的规律(网址最后结尾都是股票的代码)
3、先要找到所有股票代码,从东方财富网股票列表处来获取所有股票的代码
4、在一个个打开,获取信息
代码框架:
1、抓取页面的函数
import re
from bs4 import BeautifulSoup
import requests as rs
import traceback as tb
#1、抓取函数
def getContent(url):
try:
r = rs.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print('爬取失败')
2、获取存放着所有股票代码的列表
def producer(stock_url,info_list):
html = getContent(stock_url) #获取股票列表页面
soup = BeautifulSoup(html,'html.parser')
a = soup.find_all('a') #找到所有a标签全部存放到列表当中,此时a已经变成了一个列表
for i in a :
try:
href = i.attrs['href'] #寻找到所有href属性的内容
info_list.append(re.findall(r"[s][hz]\d{6}",href)[0]) #利用正则表达式寻找符合内容的条件,因为输出的是一个列表所以用[0]可以将外面的框消除
except:
continue #因为在找的过程中会出现各种错误,所以用try continue来保证程序继续运行
3、存储
def Save(inf_list,stock_url,fpath):
for i in info_list: #遍历各个股票的代码 一个一个打开网站
url = stock_url + i +'.html' #生成每支股票的url
html = getContent(url) #获取页面
try:
if html =='':
continue
soup = BeautifulSoup(html,'html.parser')
info_dict ={} #创建一个字典用来存放信息
a_list = soup.find('div',attrs={'class':'stock-bets'}) #找到div标签下的属性为class 到stock-bets的内容
name = a_list.find_all(attrs = {'class':'bets-name'})[0] #找出名字
info_dict.update({'股票名称',name.text.split()[0]}) #以字典的形式存放到字典当中
key_list = a_list.find_all('dv') #dv标签下对应的是这只股票所有键的名称,生成该列表
value_list = a_list.find_all('dd')#所有值的名称生成列表
for ee in range(len(key_list)):
key = key_list[i].text
value = value_list[i].text
info_dict[key]=value
with open(fpath,'w',encoding='utf-8') as f:
f.write(str(info_dict)+'\n')
except:
tb.print_exc() #打印错误的原因
continue
4、主函数运行
def main():
stock_list_url = 'http://quote.eastmoney.com/stock_list.html'
stock_url ='https://gupiao.baidu.com/stock/'
list = []
fpath = 'E:\\Text\\'
producer(stock_list_url,list)
Save(list,stock_url,fpath)
main()
总结:
1、BeautifulSoup()用来解析页面,可以使得目标内容更好找(提高效率)
2、soup.find_all(‘标签’) #把改标签的内容存入一个list
3、soup.find_all(attrs = {‘属性名’:‘属性名’}) #可以找到目标属性名
4、注意:要从不同网页获取信息,就要先获取各个网页之间的联系和规律
5、要经常的记得用异常处理来保证程序可以稳定的运行