python爬虫第八课:爬取深交所股票数据。
下面我们学习爬取深交所的数据。
思路如下:
1.在东方财富网上获取获取所有注册公司的编号。
2.根据公司编号构造出当天交易信息的url。
3.提取数据,保存信息。
由于股票的数据在很多网站上都有,但考虑到爬取的难易程度,所以选择在东方财富网上先找到上市公司编号,然后再到百度股票网站提取详细信息。
- 先定义一个发送请求的函数
def get_page(url):
try:
r=requests.get(url,headers=headers)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except Exception as e:
print(e)
- 获得所有注册公司编号
在东方财富网上找到每个上市公司的信息
url为’http://quote.eastmoney.com/stocklist.html’
在源码码中找到注册编码,上图画红线的部分是我们要提取的编码。
提取公司编号的代码如下
def get_stock_list(stock_list_url):
try:
stock_list=[]
page=get_page(stock_list_url)
stocks=re.findall(r'<li><a target="_blank" href="http://quote.eastmoney.com/sz(.*?).html">',page,re.S)
for stock in stocks:
stock_list.append(stock)
return stock_list
except Exception as e:
print(e)
- 根据公司编号构造出百度股票的url
stock_list_url='http://quote.eastmoney.com/stocklist.html'
stock_list=get_stock_list(stock_list_url,)
for stock in stock_list:
stock_info_url='https://gupiao.baidu.com/stock/sz'+str(stock)+'.html'
- 提取百度股票中的数据
打开源代码,找到里面的信息
提取信息的代码如下:
def get_stock_info(url,stock):
try:
stock_info={}
page=get_page(url)
name=re.findall('<a class="bets-name".*?>(.*?)\(',page,re.S)
name=name[0].strip()
stock_info['stock']=name
stock_info['num']=stock
datas=re.findall(r'<dl><dt>(.*?)</dt><dd.*?>(.*?)</dd>',page,re.S)
for data in datas:
key=data[0]
val=data[1].strip()
stock_info[key]=val
with open("E:\\股票数据.txt","a",encoding="utf-8") as f:
f.write(str(stock_info) + '\n')
except Exception as e:
print(e)
- 主程序
stock_list_url='http://quote.eastmoney.com/stocklist.html'
stock_list=get_stock_list(stock_list_url,)
count=0
for stock in stock_list:
stock_info_url='https://gupiao.baidu.com/stock/sz'+str(stock)+'.html'
get_stock_info(stock_info_url,stock)
count=count+1
print('\r当前进度:{:.2f}%'.format(count*100/len(stock_list)),end='') #方便显示当前进度
爬取结果
所有代码:
import requests
import re
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"}
def get_page(url):
try:
r=requests.get(url,headers=headers)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except Exception as e:
print(e)
stock_list_url='http://quote.eastmoney.com/stocklist.html'
def get_stock_list(stock_list_url):
try:
stock_list=[]
page=get_page(stock_list_url)
stocks=re.findall(r'<li><a target="_blank" href="http://quote.eastmoney.com/sz(.*?).html">',page,re.S)
for stock in stocks:
stock_list.append(stock)
return stock_list
except Exception as e:
print(e)
def get_stock_info(url,stock):
try:
stock_info={}
page=get_page(url)
name=re.findall('<a class="bets-name".*?>(.*?)\(',page,re.S)
name=name[0].strip()
stock_info['stock']=name
stock_info['num']=stock
datas=re.findall(r'<dl><dt>(.*?)</dt><dd.*?>(.*?)</dd>',page,re.S)
for data in datas:
key=data[0]
val=data[1].strip()
stock_info[key]=val
with open("E:\\爬虫\\@爬虫教程\\数据\\股票数据.txt","a",encoding="utf-8") as f:
f.write(str(stock_info) + '\n')
except Exception as e:
print(e)
stock_list_url='http://quote.eastmoney.com/stocklist.html'
stock_list=get_stock_list(stock_list_url,)
count=0
for stock in stock_list:
stock_info_url='https://gupiao.baidu.com/stock/sz'+str(stock)+'.html'
get_stock_info(stock_info_url,stock)
count=count+1
print('\r当前进度:{:.2f}%'.format(count*100/len(stock_list)),end='')