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)
  • 获得所有注册公司编号
    在东方财富网上找到每个上市公司的信息
    python爬虫第八课:爬取深交所股票数据。
    url为’http://quote.eastmoney.com/stocklist.html
    python爬虫第八课:爬取深交所股票数据。
    在源码码中找到注册编码,上图画红线的部分是我们要提取的编码。
    提取公司编号的代码如下
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'
  • 提取百度股票中的数据
    python爬虫第八课:爬取深交所股票数据。
    打开源代码,找到里面的信息
    python爬虫第八课:爬取深交所股票数据。
    提取信息的代码如下:
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='')  #方便显示当前进度

爬取结果
python爬虫第八课:爬取深交所股票数据。
所有代码:

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='')