[Python crawler combat] 1. Rastree el enlace del informe anual de las empresas que cotizan en acciones A y guárdelo en Excel

 1. Análisis del proyecto

  •  Fuente de datos: Información de Juchao
  •  Requisitos del proyecto: escriba la hoja de Excel de acuerdo con el código de acciones, el nombre de la empresa, el nombre completo del informe anual, el año, el enlace de descarga, etc.
  •  Idioma utilizado: pitón
  •  Bibliotecas de terceros: solicitudes, re, hora, etc.

Exhibición del producto terminado: 


2. Comience rápidamente

Esas son todas las tonterías, ¡comencemos!

1. Encuentra la interfaz

Como todos sabemos, el rastreo de datos de páginas web generalmente se puede realizar buscando reglas de estructura de páginas web e interfaces de rastreo. Para simplificar, el autor usa directamente la interfaz de búsqueda.

La siguiente imagen es la página de inicio de la Red de Información de Juchao.

Si tiene una mano pequeña, el informe anual aparecerá directamente. Este es el informe anual de una empresa específica que se puede buscar directamente, entonces, ¿cómo rastrear todos los registros?

F12 abre las herramientas de desarrollo y realiza una captura de red simple.

Al cambiar de página, se encuentra que hay una respuesta en la red y una interfaz de búsqueda.

¡Así es, este es el enlace!

searchkey: buscar contenido; pageNum: número de página actual; type = shj: tablero principal de Shanghai, Shenzhen y Beijing...

Por supuesto, también puede agregar el parámetro &sdate=2015-01-01&edate=2022-01-01& para especificar el enlace de búsqueda.

¡Obténgalo directamente y devuelva un archivo json, que también contiene el código de acciones, el nombre de la empresa y los enlaces de descarga clave!


2. Obtener datos

Ahora que ha encontrado el archivo json, es fácil iniciar y abrir pycharm directamente.

Primero escriba los parámetros de acceso según la interfaz.

import requests
import re
import openpyxl
import time

# 设置搜索参数
search_key = "年报"
url_template = "http://www.cninfo.com.cn/new/fulltextSearch/full?searchkey={}&sdate=2016-01-01&edate=2017-01-01&isfulltext=false&sortName=pubdate&sortType=desc&pageNum={}&type=shj"
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.5',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
    }

Luego use la solicitud para acceder, ¡preste atención a la robustez del programa! Es fácil informar errores al rastrear muchos archivos, por lo que es necesario manejar bien el mecanismo de excepción. El autor ha creado un mecanismo de reintento en caso de falla y omisión directamente después de múltiples fallas.

# 发送HTTP请求并获取响应
all_results = []
page_num =1 #设置首页
total_pages = 1 #初始化最大页面
max_retries = 2 #最大重试次数
retry_count = 0

while page_num <= total_pages:
    url = url_template.format(search_key, page_num)
    response = None

    # 重试机制
    while retry_count <= max_retries:
        # 发送请求
        try:
            response = requests.get(url,headers=headers)
            response.raise_for_status()
            break
        except requests.exceptions.RequestException as e:
            print(f"出现错误!: {e}")
            print(f"5秒后重试...")
            time.sleep(5)
            retry_count += 1

    if retry_count > max_retries:
        print(f"{max_retries} 次重试后均失败. 跳过第 {page_num}页.")
        page_num += 1
        retry_count = 0
        continue

Entonces es un ciclo continuo para fusionar los archivos json obtenidos cada vez en all_result

# 解析数据
    try:
        data = response.json()
        all_results.extend(data["announcements"])
        total_pages = data["totalpages"]
        print(f"正在下载第 {page_num}/{total_pages}页")
        page_num += 1
        retry_count = 0
    except (ValueError, KeyError) as e:
        print(f"Error parsing response data: {e}")
        print(f"5秒后重试...")
        time.sleep(5)
        retry_count += 1
        continue

 ¡Esta es la clave! Si se informa un error durante el procesamiento del archivo json, ¡es fácil desperdiciar todos los esfuerzos anteriores! Necesito empezar todo de nuevo.

Después de la prueba del autor, el número máximo de páginas de esta interfaz es de 2000, si es mayor a este número, se informará un error, por lo que se puede limitar el rango de tiempo al rastrear.


3. Guardar datos

Cuando los archivos json se fusionan, ¡es hora de analizar y guardar los datos!

El autor usa la biblioteca openpyxl para crear tablas de Excel.

Dado que los datos en el archivo json son demasiado desordenados, es necesario hacer un buen trabajo para eliminarlos.


# 创建Excel文件并添加表头
workbook = openpyxl.Workbook()
worksheet = workbook.active
worksheet.title = "Search Results"
worksheet.append(["公司代码", "公司简称", "标题", "发布日期", "年报链接"])

# 定义需要剔除的标题关键词
exclude_keywords = ["摘要", "英文版", "披露", "风险提示", "督导","反馈","回复","业绩","说明会","意见","审核","独立董事","半年","已取消","补充","提示性","制度","规程","审计","ST","公告","声明","说明","受托"]

# 解析搜索结果并添加到Excel表格中
for item in all_results:
    company_code = item["secCode"]
    company_name = item["secName"]
    title = item["announcementTitle"].strip()

    # 剔除不需要的样式和特殊符号,并重新组合标题
    title = re.sub(r"<.*?>", "", title)
    title = title.replace(":", "")
    title = f"《{title}》"

    adjunct_url = item["adjunctUrl"]
    year = re.search(r"\d{4}", adjunct_url).group()
    publish_time = f"{year}"
    #拼串,将PDF文件的下载链接拼完整!
    announcement_url = f"http://static.cninfo.com.cn/{adjunct_url}"

    # 检查标题是否包含排除关键词
    exclude_flag = False
    for keyword in exclude_keywords:
        if keyword in title:
            exclude_flag = True
            break

    # 如果标题不包含排除关键词,则将搜索结果添加到Excel表格中
    if not exclude_flag:
        worksheet.append([company_code, company_name, title, publish_time, announcement_url])

 Finalmente, solo necesitas guardar todos los datos, ¡y listo!

workbook.save(f"上市企业年报链接_2015.xlsx")

El autor ha empaquetado parte del informe anual y puede obtenerlo siguiendo la cuenta oficial del mismo nombre y respondiendo a "Informe anual" ~

Supongo que te gusta

Origin blog.csdn.net/w646645452/article/details/129960098
Recomendado
Clasificación