1.目标
获得上交所和深交所所有股票的名称和交易信息,输出到文件内
2.技术路线
采用requests库和BeautifulSoup库以及正则表达式re库
网站选择原则: 股票信息静态存在于html页面中,非js代码生成,没有Robbts协议限制。
选取方法: 打开网页,查看源代码,搜索网页的股票价格数据是否存在于源代码中。
3.数据网站的确定
新浪股票在页面上看到的股票代码在源代码中并没有,说明很可能是由JavaScript脚本生成的;而百度股票的每一支个股的信息都写在HTML代码中
所以对于这两个网站来讲,百度股票更适合作为定向爬虫的数据来源
获取股票列表:
东方财富网:http://quote.eastmoney.com/stocklist.html
获取个股信息:
百度股票:https://gupiao.baidu.com/stock/
单个股票:https://gupiao.baidu.com/stock/sz002439.html
4.实现步骤:
1.从东方财富网获取股票列表
2.根据股票列表逐个到百度股票获取个股信息
3.将结果存储到文件内
5.优点与改进
1.在原来的通用框架下增加了code变量,是为了将减少代码遍历页面获得页面的编码格式,从而减少了爬虫时间
2.利用\r制作一个进程显示,\r可以使得打印完当前行之后,光标返回当前行的最开始部分
import requests from bs4 import BeautifulSoup import re import traceback #获得网页文本信息 def getHTMLText(url,code='utf-8'): try: r=requests.get(url,timeout=30) r.raise_for_status() r.encoding=code #将已知的编码格式赋给encoding,从而使得代码不用解析页面的编码格式 return r.text except: return "" def getStockList(lst,stockURL): html=getHTMLText(stockURL,'GB2312') soup=BeautifulSoup(html,'html.parser') a=soup.find_all('a') for i in a: try: #将含有'href'的内容的标签赋给href href=i.attrs['href'] #正则匹配六位数字 lst.append(re.findall(r'[s][hz]\d{6}',href)[0]) except: continue def getStockInfo(lst,stockURL,fpath): count=0; for stock in lst: url=stockURL+stock+".html" html=getHTMLText(url) try: if html=="": continue infoDict={} soup=BeautifulSoup(html,"html.parser") #放在div内的名字 stockInfo=soup.find('div',attrs={'class':'stock-bets'}) name=stockInfo.find_all(attrs={'class':'bets-name'})[0] infoDict.update({'股票名称':name.text.split()[0]}) #获取以键值对形式存放的信息 keyList=stockInfo.find_all('dt') valueList=stockInfo.find_all('dd') #将信息放入字典内 for i in range(len(keyList)): key=keyList[i].text value=valueList[i].text infoDict[key]=value with open(fpath,'a',encoding='utf-8')as f: #将将字典内容写入字典内 f.write(str(infoDict)+'\n') count=count+1 #进度部分代码 print('\r当前速度:{:.2f}%'.format(count*100/len(lst)),end="") except: 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='E://BaiduStockInfo.txt' slist=[] getStockList(slist,stock_list_url) getStockInfo(slist,stock_info_url,output_file) if __name__ == '__main__': main()