爬取股票數據


爬取股票數據

1 爬取前的分析

技術路線:使用 requests + bs4 + re

數據網站選取原則:股票信息靜態存在於 HTML 頁面中,非 js 代碼生成沒有 Robots 協議限制

獲取股票列表:
東方財富網:http://quote.eastmoney.com/stock_list.html
獲取個股信息:
百度股票:https://gupiao.baidu.com/stock/
單個股票:https://gupiao.baidu.com/stock/szee2439.html

2 爬取流程

步驟1:從東方財富網獲取股票列表
步驟2:根據股票列表逐個到百度股票獲取個股信息
步驟3:將結果存儲到文件

# -*- coding: utf-8 -*-
# @Time    : 2019/8/30 15:39
# @Author  : banshaohuan
# @Site    : 
# @File    : gupiao_baidu_youhua.py
# @Software: PyCharm
import requests
from bs4 import BeautifulSoup
import re


def getHTMLText(url, code="utf-8"):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = code
        return r.text
    except:
        return ""


def get_stock_list(lst, stock_url):
    html = getHTMLText(stock_url, "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"[s][hz]\d{6}", href)[0])
        except:
            continue


def get_stock_info(lst, stock_url, file_path):
    count = 0
    for stock in lst:
        url = stock_url + stock + '.html'
        html = getHTMLText(url)
        try:
            if html == "":
                continue
            info_dict = {}
            soup = BeautifulSoup(html, 'html.parser')
            stock_info = soup.find('div', attrs={"class":"stock-bets"})

            name = stock_info.find_all(attrs={"class":"bets-name"})[0]
            info_dict.update({'股票名稱': name.text.split()[0]})

            key_list = stock_info.find_all('dt')
            value_list = stock_info.find_all('dd')

            for i in range(len(key_list)):
                key = key_list[i].text
                val = value_list[i].text
                info_dict[key] = val

            with open(file_path, 'a', encoding='utf-8') as f:
                f.write(str(info_dict) + '\n')
                count += 1
                print("\r當前進度:{:.2f}%".format(count*100/len(lst)), end="")
        except:
            count += 1
            print("\r當前進度:{:.2f}%".format(count * 100 / len(lst)), end="")
            continue


def main():
    stock_list_url = 'https://quote.eastmoney.com/stock_list.html'
    stock_info_url = 'https://gupiao.baidu.com/stock/'
    output_file = 'D:/BaiduStockInfo.txt'
    stock_list = []

    get_stock_list(stock_list, stock_list_url)
    get_stock_info(stock_list, stock_info_url, output_file)


if __name__ == '__main__':
    main()

本文參考嵩天老師在中國 MOOC 大學的課程《python 網絡爬蟲與信息提取》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM