Python self-study-class20-crawling datos de acciones de Oriental Fortune.com (rastreador)

Hace dos días aprendí las expresiones regulares y las aplicaciones básicas de rastreo, así que combiné algunos de los conocimientos previos sobre el diseño de la interfaz de la interfaz de usuario para crear una herramienta de consulta de datos de stock, pero no tiene la función de análisis de datos;
acabo de comenzar a usar la URL proporcionada por algunos bloggers ( "http://quote.eastmoney.com/stocklist.html") para obtener la lista de acciones

import re
import urllib
import urllib.request
def getpage(path):
    data=urllib.request.urlopen(path).read().decode('utf-8')
    return data
#find没有括号抓取全部,有括号抓取括号内,内容有括号转义字符\(  \)
def getcode(data):
    regex_str="<li><a href=\"list,([6|9]\d{5}).html\">"
    #regex_str="<li><a href=\"list,hk([0-9]\d{4}).html\">\D\d{5}\D(.*?)<"
    pat=re.compile(regex_str)  #预编译
    codelist=pat.findall(data)
    return codelist
path="http://quote.eastmoney.com/stocklist.html"
data=getpage(path)   #抓取网页源代码
print(data)     #打印网页全部信息
codelist=getcode(data)

Pero no pude sacarlo. Cambié la expresión regular durante mucho tiempo, pero no funcionó. Luego imprimí el código fuente de la página web y busqué mucho. Luego no encontré el número ni la información del nombre. del stock específico (WTF ???) en el código fuente de la página web. Lo extraño es que puedo encontrar información relevante utilizando las herramientas de desarrollo en la página web, lo que significa que no capturé esta parte de la información cuando rastreé el código fuente de la página web (¡daño!) Este problema está más allá de mi capacidad;
así que busco otra manera, busque la lista de acciones en las acciones de la comunidad de acciones de la web (http://guba.eastmoney.com/remenba.aspx?type = 1 & tab = 1).
Inserte la descripción de la imagen aquí
A continuación, mire el formato del código fuente en las herramientas de desarrollo y escríbalo. La expresión regular es
suficiente. La expresión regular que utilicé para extraer el código de stock y el nombre:

regex_str = "<li><a href=\"list,([0-9]\d{5}).html\">\D\d{6}\D(.*?)<"

Luego descubrí que había confusión al retirar las acciones de Hong Kong, ¡Gan! ¡Mala suerte! Luego fui a verificar el código fuente de las acciones de Hong Kong y vi: Oh, el código de las acciones de Hong Kong tiene solo 5 dígitos, y hk se agrega al frente, así que escribiré otro para distinguirlo:

regex_str = "<li><a href=\"list,hk([0-9]\d{4}).html\">\D\d{5}\D(.*?)<"

Así que ya está, la función de búsqueda que escribí (SearchStock) es la siguiente :

import urllib
import urllib.request
import re

class Search:
    def __init__(self,slect):
        self.choice=slect
    def SearchAll(self):
        path = "http://guba.eastmoney.com/remenba.aspx?type=1&tab=" + self.choice
        if self.choice == '3':   #港股规则不同需要重新判断
            regex_str = "<li><a href=\"list,hk([0-9]\d{4}).html\">\D\d{5}\D(.*?)<"
        else:
            regex_str = "<li><a href=\"list,([0-9]\d{5}).html\">\D\d{6}\D(.*?)<"
        data = self.getpage(path)
        codelist = self.getcode(data, regex_str)
        if self.choice != '3':      #港股
            codelist[0:] = codelist[30:]
        return codelist
    def getpage(self,path):
        data = urllib.request.urlopen(path).read().decode('utf-8')
        return data

    def getcode(self,data, regex_str):
        pat = re.compile(regex_str)  # 预编译
        codelist = pat.findall(data)
        return codelist

Inserte la descripción de la imagen aquí
La lista de acciones está terminada, parece un poco simple, luego obtenga otra descarga de datos de acciones y baje y guarde los datos históricos. Buscando en Internet, encontré 163 sitios web mágicos, que pueden descargar los datos históricos de Oriental Wealth (WOW !!!)

#http://quotes.money.163.com/service/chddata.html?code=1300133&end=20210201&fields=TCLOSE;HIGH;LOW;TOPEN;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP
#code=1300133&end=20210201   1代表深市(0代表沪市) 300133代表股票代码  20210201代表截至日期

Simplemente hágalo, use urlretrieve (url, ruta) para descargar acciones y guárdelo como un archivo .csv:

import urllib.request
import urllib
url="http://quotes.money.163.com/service/chddata.html?code=1300133&end=20210201&fields=TCLOSE;HIGH;LOW;TOPEN;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP"
path="D:\\Python代码\\class20\\down\\300133.csv"
urllib.request.urlretrieve(url,path)  #根据url下载到路径下

Ok, la función básica está resuelta, así que si la ruta de descarga está personalizada, ¿cómo puedo juzgar si hay la misma carpeta debajo de la ruta personalizada y cómo crear una si no hay nadie? En este momento, uso la programación de Baidu , Encontré una función de os:

    if not os.path.exists(path):
        os.makedirs(path)  #指定路径创建文件夹

Dado que la ruta de guardado se puede personalizar, las acciones que desea encontrar también deben personalizarse, así que cambie la dirección de descarga mágica anterior a:

url = "http://quotes.money.163.com/service/chddata.html?code="+"0"+code[0]+"&end="+data+"&fields=TCLOSE;HIGH;LOW;TOPEN;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP"

Mejore mi función de descarga y saldrá (DownloadStock) :

import urllib
import urllib.request
import os
class Down:
    def __init__(self,code,data,path):
        self.code=code
        self.data=data
        self.path=path
    def downloadstock(self):
        # 判断文件夹是否存在
        self.path = self.path + "\\" + self.data
        if not os.path.exists(self.path):
            os.makedirs(self.path)  # 指定路径创建文件夹
        url = "http://quotes.money.163.com/service/chddata.html?code=" + self.code + "&end=" + self.data + "&fields=TCLOSE;HIGH;LOW;TOPEN;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP"
        datapath = self.path + "//" + self.code + ".csv"
        urllib.request.urlretrieve(url, datapath)  # 根据url下载到路径下

Miré la hora, um, todavía hay mucho tiempo de aprendizaje hoy, y no es hora de jugar, está bien, luego agregaré la interfaz de IU que aprendí antes y, por cierto, uso el método de herencia para inicializar la interfaz y simplificar el código., Por lo tanto, la función de entrada de la interfaz (inputview), hereda la función de clase base (BaseWindowShow), y la función de visualización de lista (ListShow ) se ha lanzado una tras otra: la función de entrada de la
interfaz (inputview):

#coding=gbk
import tkinter
from tkinter import ttk
import 爬取东方财富股票数据.SearchStock
import 爬取东方财富股票数据.DownloadStock
import 爬取东方财富股票数据.BaseWindowShow
import 爬取东方财富股票数据.ListShow
class InputView(爬取东方财富股票数据.BaseWindowShow.BaseWindowShow):
    def __init__(self):
        爬取东方财富股票数据.BaseWindowShow.BaseWindowShow.__init__(self)
        self.entry1 = tkinter.Entry(self.win)  #导入文本框,输入股票代码
        self.entry1.place(x=250,y=0)
        self.entry2 = tkinter.Entry(self.win)  #导入文本框,输入截至时间
        self.entry2.place(x=400,y=0)
        self.entry3 = tkinter.Entry(self.win)  #导入文本框,输入保存路径
        self.entry3.place(x=550,y=0)
        self.comdvalue = tkinter.StringVar()  # 窗体自带文本,新建一个值
        self.comboxdc = ttk.Combobox(self.win, textvariable=self.comdvalue,width=30)  # 初始化
        self.comboxdc["values"] = ("单个股票数据下载","下载多个","全部下载")
        self.comboxdc.current(0)  # 选择第一个
        self.comboxdc.bind("<<ComboboxSelected>>", self.go)  # 绑定事件与函数
        self.comboxdc.place(x=0,y=0)
        self.button2 = tkinter.Button(self.win,text = "下载",command = self.download)  #导入搜索键,command表示绑定search的行为
        self.button2.place(x=750,y=0)
        self.button1 = tkinter.Button(self.win,text = "股票一览表",command = self.search)  #导入搜索键,command表示绑定search的行为
        self.button1.place(x=300,y=50)
        self.comvalue = tkinter.StringVar()  # 窗体自带文本,新建一个值
        self.comboxlist = ttk.Combobox(self.win, textvariable=self.comvalue,width=30)  # 初始化
        self.comboxlist["values"] = ("沪市", "深市", "港股")
        self.comboxlist.current(0)  # 选择第一个
        self.comboxlist.bind("<<ComboboxSelected>>", self.go)  # 绑定事件与函数
        self.comboxlist.place(x=0,y=50)
        self.select="1"

    def go(self,*args):
        if(self.comboxlist.get()=='沪市'): #保存选中的值
            self.select='1'
        elif(self.comboxlist.get()=='深市'):
            self.select='2'
        elif(self.comboxlist.get()=='港股'):
            self.select='3'

    def search(self):
        data=爬取东方财富股票数据.SearchStock.Search(self.select)
        stockdata=data.SearchAll()
        inserstr=爬取东方财富股票数据.ListShow.Listshowdata()
        if(self.comboxlist.get()=='沪市'): #在股票网址中 sh表示沪市,sz表示深市,hk表示港股
            inser="sh"
        elif(self.comboxlist.get()=='深市'):
            inser="sz"
        elif(self.comboxlist.get()=='港股'):
            inser="hk"
        for data in stockdata:
            #按照规则拼接出股票网址
            inserstr.addata(inser+data[0]+'-'+data[1]+"网址:"+"http://quote.eastmoney.com/"+inser+data[0]+".html?code="+data[0])
    def download(self):
        if (self.comboxdc.get()=="单个股票数据下载"):
            #code 股票代码 data截至时间  path保存路径
            #这三个的赋值必须每次都重新赋值,不能放到if语句前简化代码
            code=self.entry1.get()
            print(type(code))
            data = self.entry2.get()
            path = self.entry3.get()
            data = 爬取东方财富股票数据.DownloadStock.Down(code, data, path)
            data.downloadstock()
        elif(self.comboxdc.get()=="下载多个"):
            codelist=self.entry1.get().split(" ")
            print(codelist)
            for code in codelist:
                print(type(code))
                data = self.entry2.get()
                path = self.entry3.get()
                data = 爬取东方财富股票数据.DownloadStock.Down(code, data, path)
                data.downloadstock()
        elif(self.comboxdc.get()=="全部下载"):
            data = 爬取东方财富股票数据.SearchStock.Search(self.select)
            stockdata = data.SearchAll()
            for datas in stockdata:
                code=datas[0]
                data = self.entry2.get()
                path = self.entry3.get()
                data = 爬取东方财富股票数据.DownloadStock.Down(code, data, path)
                data.downloadstock()


Heredar la función de clase base (BaseWindowShow):

import tkinter
class BaseWindowShow:
    def __init__(self):
        self.win=tkinter.Tk() #构造窗体
        self.win.geometry("800x800+300+0")   #搜索数据显示窗口
    def show(self):
        self.win.mainloop()

Función de visualización de lista (ListShow):

import 爬取东方财富股票数据.BaseWindowShow
import tkinter
class Listshowdata(爬取东方财富股票数据.BaseWindowShow.BaseWindowShow):
    def __init__(self):
        爬取东方财富股票数据.BaseWindowShow.BaseWindowShow.__init__(self)
        self.list=tkinter.Listbox(self.win,width=200)  #文本编辑器
        self.list.pack()
    def addata(self,inserstr):
        self.list.insert(tkinter.END,inserstr)

Finalmente, escribe una función principal (Main) por cierto :

import 爬取东方财富股票数据.inputview

start=爬取东方财富股票数据.inputview.InputView()
start.show()

Paquete Python:
Inserte la descripción de la imagen aquí

Luego mire el efecto:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
como soy demasiado vago para agregar juicios, al ingresar el código de acciones, agregue 0 a la Bolsa de Valores de Shenzhen y 1 a la Bolsa de Valores de Shanghai, y la ruta de guardado debe agregarse con caracteres de escape (esto no se puede resolver en el código si es demasiado comida), como se muestra en la figura a continuación. Se puede ver que la carpeta se ha creado y guardado correctamente.
Inserte la descripción de la imagen aquí
Permítanme echar un vistazo a la descarga de varios archivos al mismo tiempo: Inserte la descripción de la imagen aquí
Resumen: ¡Es
casi la hora de comer, y Ganfanren, Ganfanhun y Ganfan son todos seres humanos! ! ! !
De hecho, todavía hay muchas áreas que se pueden mejorar. Por ejemplo, se pueden agregar análisis y dibujos (gráficos de líneas, histogramas). Vale la pena aprender todos estos aspectos. La próxima vez, tengo tiempo para mejorar las funciones de análisis y dibujo; y Originalmente quería capturar un dato en tiempo real. Los datos lo muestran, pero descubrí que no es fácil capturar cada dato durante el horario de negociación. Durante el horario de negociación, los datos se muestran sin mostrar "-". Los datos solo se mostrará después del cierre del mercado. No puedo pensar en una solución por el momento, y la reserva de conocimiento es insuficiente.
Estos datos de rastreo aún son muy aproximados y aún debe trabajar más. Cuanto más trabaje, más suerte usted está;

Supongo que te gusta

Origin blog.csdn.net/weixin_46837674/article/details/113563740
Recomendado
Clasificación