目录
前言
遇到的一些问题
建议
完整代码
最近在中国大学MOOC平台学习北京理工大学的嵩天老师主讲的《Python网络爬虫与信息提取》课程,这门课程挺适合有些python基础的同学学习的,对我个人而言还是比较友好的。由于这门课程很早之前就已经发布,课程里面使用的一些链接在当前早就已经不适用。正如嵩天老师所说的,我们不应该纠结于某一个网站,应该多多尝试。虽然之前我也遇到过链接不适用的情况,但是之前的好像就是随堂的小练习,很容易找到合适的其他的网站用于练习,但是这次的股票爬虫实战项目,这个网站属实难找——我各种百度、查找各种博客,停滞了大约一天左右,才终于找到目前合适的用于实操的网站,虽然有差异,但是大差不差,总归是找到了。
不是一样的连接,所遇到的问题也就是未知的,那么这整个项目我主要遇到的难题如下:
(一)查找合适的网站
(1)查看博客https://blog.csdn.net/qq_38887171/article/details/109215911 找到能够查看具体某只股票信息的网站链接https://xueqiu.com/
(2)逛百度逛到适合当前能够查看所有股票代码的网站http://www.ytwhw.com/gupiao/list_sz.html
(二)程序运行不报错,但是也没有任何输出,E盘也没有得到文件,后来我以为是JavaScript写的,看视频并且比对信息差别,后来非常肯定我找的网站是没问题的。之后有检查,发现自己疏忽了一点,我开始使用的正则表达式还加了SZ,后面发现不用,下图是修改过的:
(三)在前面的弄完之后,运行程序开始报错NoneType,经查询,说是出现空值情况,然后就利用print()函数检查哪里出错,最终发现是访问每只股票的路径链接弄错了,下图是修改过的:
编程,复现的过程。遇到问题,仔细、冷静、认真,You can do it!
完整代码如下:
import re
import requests
from bs4 import BeautifulSoup
# 为了调试方便
import traceback
def getHTMLText(url,code='utf-8'):
try:
kv = {'user-agent': 'Mozilla/5.0'}
r=requests.get(url,headers=kv)
r.encoding=code
r.raise_for_status()
return r.text
except:
return '程序异常!'
# http://www.ytwhw.com/gupiao/000005/
def getStocklist(lst,stockURL):
html=getHTMLText(stockURL,'GB2312')
soup=BeautifulSoup(html,'html.parser')
a=soup.find_all('a')
for i in a:
try:
href=i.attrs['href']
lst.append(re.findall(r"\d{6}",href)[0])
except:
continue
def getStockInfo(lst,stockURL,fpath):
count=0
for stock in lst:
# 每只股票访问的页面链接
url=stockURL+"S/SZ"+stock
# print(url)
html=getHTMLText(url)
try:
if html=="":
continue
#存储所有股票信息
infoDict={}
soup = BeautifulSoup(html, 'html.parser')
stockinfo=soup.find('div',attrs={'class':'container-sm float-left stock__main'})
# print(stockinfo)
name=stockinfo.find_all(attrs={'class':'stock-name'})[0]
infoDict.update({'股票名称':name.text.split()[0]})
keylist=stockinfo.find_all('td')
valuelist=stockinfo.find_all('span')
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:
count = count + 1
print('\r当前速度:{:.2f}%'.format(count * 100 / len(lst)), end='')
traceback.print_exc()
continue
def main():
stock_list_url='http://www.ytwhw.com/gupiao/list_sz.html'
stock_info_url='https://xueqiu.com/'
output_path='E://BaiduStockInfo.txt'
slist=[]
getStocklist(slist,stock_list_url)
getStockInfo(slist,stock_info_url,output_path)
main()