跟小白学python网络爬虫实例3
实例3--股票数据定向爬虫
程序结构如下:
1.先从网站中获取股票代号列表(requests库,re库)
2.遍历每一只股票,从股票信息网站中获得详细信息
3.使用字典的数据结构,写入文本文件中
以下为代码:
1 # 股票数据定向爬虫 2 """ 3 Created on Thu Oct 12 16:12:48 2017 4 5 @author: DONG LONG RUI 6 """ 7 import requests 8 from bs4 import BeautifulSoup 9 import re 10 #import traceback 11 12 def getHTMLText(url,code='utf-8'):#参数code缺省值为‘utf-8’(编码方式) 13 try: 14 r=requests.get(url,timeout=30) 15 r.raise_for_status() 16 #r.encoding=r.apparent_encoding 17 r.encoding=code 18 return r.text 19 except: 20 return '' 21 22 def getStockList(lst,stockURL): 23 html=getHTMLText(stockURL,'GB2312') 24 soup=BeautifulSoup(html,'html.parser') 25 a=soup.find_all('a') 26 for i in a: 27 try: 28 href=i.attrs['href'] 29 lst.append(re.findall(r'[s][hz]\d{6}',href)[0]) 30 except: 31 continue 32 33 def getStockInfo(lst,stockURL,fpath): 34 count=0# 35 for stock in lst: 36 url=stockURL+stock+'.html' 37 html=getHTMLText(url) 38 try: 39 if html=='': 40 continue 41 infoDict={} 42 soup=BeautifulSoup(html,'html.parser') 43 stockInfo=soup.find('div',attrs={'class':'stock-bets'}) 44 45 name=stockInfo.find_all(attrs={'class':'bets-name'})[0] 46 infoDict.update({'股票名称':name.text.split()[0]})#用空格分开,得到股票名称 47 48 keyList=stockInfo.find_all('dt') 49 valueList=stockInfo.find_all('dd') 50 for i in range(len(keyList)): 51 key=keyList[i].text 52 val=valueList[i].text 53 infoDict[key]=val 54 55 with open(fpath,'a',encoding='UTF-8') as f: 56 f.write(str(infoDict)+'\n') 57 count=count+1# 58 print('\r当前进度:{:.2f}%'.format(count*100/len(lst)),end='')#动态显示进度,‘\r’实现光标移动,即为不换行的效果 59 except: 60 count=count+1 61 print('\r当前进度:{:.2f}%'.format(count*100/len(lst)),end='')#动态显示进度,‘\r’实现光标移动,即为不换行的效果 62 #traceback.print_exc() 63 continue 64 65 66 def main(): 67 stock_list_url='http://quote.eastmoney.com/stocklist.html' 68 stock_info_url='https://gupiao.baidu.com/stock/' 69 output_file='C:/Users/DONG LONG RUI/.spyder-py3/BaiduStockInfo.txt' 70 slist=[] 71 getStockList(slist,stock_list_url) 72 getStockInfo(slist,stock_info_url,output_file) 73 74 main()
由于requests库爬虫的限制,我运行后速度会比较慢,后续可尝试scrapy爬虫。
又想到bs4中的BeautifulSoup和re库都可用于搜索html中的目标信息,但两者一般结合起来使用:
先用BeautifulSoup找到目标信息所在的特定标签,然后在这些标签内容中使用正则表达式去匹配。