首页 > 其他分享 >提取申请人和产品名称

提取申请人和产品名称

时间:2024-01-11 15:47:10浏览次数:24  
标签:product 提取 产品名称 chrome self driver df 申请人 options

 

import random
import re
import os
import time
import pandas as pd
from pyvirtualdisplay import Display
import undetected_chromedriver as uc
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup


class INTERFACING():

    def __init__(self):
        self.driver_initialized = False
        self.driver = ''
        self.MAX_TRIALS = 2
        self.chrome_version =get_google_chrome_version()

    def make_soup(self):
        return BeautifulSoup(self.driver.page_source, 'lxml')  # etree.HTML()

    def current_url(self):
        return self.driver.current_url

    def get_driver(self):

        uc.TARGET_VERSION = get_google_chrome_version()
        chrome_options = uc.ChromeOptions()
        # chrome_options.add_argument("--headless")
        chrome_options.add_argument("--window-size=1920.,1080")
        chrome_options.add_argument("--disable-extensions")
        chrome_options.add_argument("--disable-dev-shm-usage")
        chrome_options.add_argument("--disable-popup-blocking")
        chrome_options.add_argument("--profile-directory=Default")
        chrome_options.add_argument("--ignore-certificate-errors")
        chrome_options.add_argument("--disable-plugins-discovery")
        chrome_options.add_argument("--incognito")
        chrome_options.add_argument("--no-first-run")
        chrome_options.add_argument("--no-service-autorun")
        chrome_options.add_argument("--no-default-browser-check")
        chrome_options.add_argument("--password-store=basic")
        chrome_options.add_argument("--no-sandbox")
        chrome_options.add_argument('--disable-application-cache')
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument("--disable-setuid-sandbox")
        chrome_options.add_argument(
            "user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36"
        )
        self.driver = uc.Chrome(options=chrome_options, version_main=get_google_chrome_version())
        time.sleep(10)
        self.driver_initialized = True

    def close_driver(self):
        self.driver.quit()

    def get_selenium_response(self, url):

        # try:
        if not self.driver_initialized:
            self.get_driver()
        else:
            pass
        self.driver.get(url)
        time.sleep(3)
        soup = self.make_soup()
        return soup

    def get_page_source(self):
        return self.driver.page_source

    def clicking(self, xpath):
        elem = self.driver.find_element(By.XPATH, xpath)
        elem.click()
        time.sleep(random.randint(2, 3))

    def entering_values(self, xpath, value):
        elem = self.driver.find_element(By.XPATH, xpath)
        elem.clear()
        elem.send_keys(value)
        time.sleep(random.randint(2, 4))

    def send_keys(self, xpath):
        elem = self.driver.find_element(By.XPATH, xpath).send_keys(Keys.RETURN)

    def going_back(self):
        self.driver.execute_script("window.history.go(-1)")
        time.sleep(1)

    def refresh_page(self):
        self.driver.refresh()

    def close_handle(self):
        self.driver.close()

    def get_current_handle(self):
        return self.driver.current_window_handle

    def get_all_handles(self):
        return self.driver.window_handles

    def swtich_to_window(self, handle):
        self.driver.switch_to.window(handle)


def get_google_chrome_version():
    try:
        search_pattern = "(\d+?)\."
        chrome_version = os.popen("google-chrome -version").read()
        chrome_version = re.search(search_pattern, chrome_version).group(1)
        return chrome_version
    except Exception as e:
        raise Exception(f"获取google chrome的版本错误,详情:{e}")


def extract_product_applicant(soup):
    product_pattern = re.compile(r'产品名称:\s*([^<>]+)')
    applicant_pattern = re.compile(r'申\s*请\s*人:\s*([^<>]+)')

    product_matches = soup(text=product_pattern)
    applicant_matches = soup(text=applicant_pattern)

    products = [product_pattern.findall(match)[0] for match in product_matches]
    applicants = [applicant_pattern.findall(match)[0] for match in applicant_matches]
    if not products:
        product_pattern = re.compile("产品名称<\/strong>:\s*([^<>]+)")
        applicant_pattern = re.compile("申\s*请\s*人<\/strong>:\s*([^<>]+)")

        product_matches = soup(text=product_pattern)
        applicant_matches = soup(text=applicant_pattern)

        products = [product_pattern.findall(match)[0] for match in product_matches]
        applicants = [applicant_pattern.findall(match)[0] for match in applicant_matches]

    return list(zip(products, applicants))


base_url = "https://www.cmde.org.cn"
result_df = pd.DataFrame(columns=["index", "time", "product_name", "product_company", "ID", "reason"])
num = -1
with Display(visible=False, size=(1920, 1080)) as display:
    for page in range(1, 10):
        if page == 1:
            soup = INTERFACING().get_selenium_response("https://www.cmde.org.cn/xwdt/shpgzgg/cxyxgsh/index.html")
        else:
            soup = INTERFACING().get_selenium_response(
                f"https://www.cmde.org.cn/xwdt/shpgzgg/cxyxgsh/index_{page - 1}.html")

        groups_selector = soup.select('.list > ul >li')
        for index, group in enumerate(groups_selector[17:]):
            group_href = group.find('a')['href']
            update_time = group.find('span').text[1:-1]
            group_href = group_href if "http" in group_href else base_url + "/" + group_href.replace("../", "")
            detail_soup = INTERFACING().get_selenium_response(group_href)
            if not detail_soup:
                print(f"第{page}页,第{index}条没有抓取到")
                continue

            data = extract_product_applicant(detail_soup)
            if not data:
                # 找到表格
                table = detail_soup.find('table')
                if not table:
                    print(f"!!!!!!!!!!!!!!!!!!!!!!第{page}页,第{index}条没有抓取到")
                    continue
                # 提取表格数据
                rows = table.find_all('tr')
                data = []
                for row in rows[1:]:
                    cells = row.find_all('td')
                    values = [cell.text.strip() for cell in cells]
                    data.append(values)

                # 提取表头
                header_cells = rows[0].find_all('td')
                headers = [cell.text.strip() for cell in header_cells]

                # 将数据转换为DataFrame
                df = pd.DataFrame(data, columns=headers)

                # 输出结果
                print(df)
                for i in range(len(df)):
                    num += 1
                    result_df.loc[num, "index"] = num
                    result_df.loc[num, "time"] = update_time
                    result_df.loc[num, "product_name"] = df.loc[i, '产品名称']
                    result_df.loc[num, "product_company"] = df.loc[i, '申请人']
                    result_df.loc[num, "ID"] = df.loc[i, '受理号']
                    result_df.loc[num, "reason"] = df.loc[i, '同意理由']
                result_df.to_excel("result.xlsx")
                print(f"第{page}页,第{index}条抓取完成")
                continue

            for i, (product_name, applicant) in enumerate(data):
                num += 1
                result_df.loc[num, "index"] = num
                result_df.loc[num, "time"] = update_time
                result_df.loc[num, "product_name"] = product_name
                result_df.loc[num, "product_company"] = applicant
            result_df.to_excel(f"result_1_4.xlsx")

            print(f"第{page}页,第{index}条抓取完成")

 

标签:product,提取,产品名称,chrome,self,driver,df,申请人,options
From: https://www.cnblogs.com/avivi/p/17958691

相关文章

  • 提取 PE文件 / 目标程序 的各种信息
    前段时间项目需要实现对WindowsPE文件版本信息的提取,如文件说明、文件版本、产品名称、版权、原始文件名等信息。获取这些信息在Windows下当然有一系列的API函数供调用,简单方便。我们先看一下PE文件结构,PE文件由DOS首部,PE文件头,块表,块和调试信息组成,有关PE文件的数据结构......
  • PageOfficeV6.0提取在线编辑保存的excel单元格数据
    转载:提取单元格数据提取单元格数据查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。在实际的开发过程中,经常会遇到提取Excel文档中数据保存到数据......
  • 安卓之从视频中提取音频的应用场景及技术优劣分析
    引言随着移动设备性能的不断提升和多媒体内容的广泛传播,从视频中提取音频已成为众多开发者与用户日常操作的一部分。在安卓平台上,这项技术经历了从早期的复杂专业工具到现今便捷易用的应用程序的演变过程。本文旨在探讨安卓系统中视频转音频(VideotoAudioExtraction,VAE)技术的发......
  • 安卓之从视频中提取音频的应用场景及技术优劣分析
    引言随着移动设备性能的不断提升和多媒体内容的广泛传播,从视频中提取音频已成为众多开发者与用户日常操作的一部分。在安卓平台上,这项技术经历了从早期的复杂专业工具到现今便捷易用的应用程序的演变过程。本文旨在探讨安卓系统中视频转音频(VideotoAudioExtraction,VAE)技......
  • 一键与图片对话!LLM实现图片关键信息提取与交互
    本期文心开发者说邀请到飞桨开发者技术专家徐嘉祁,主要介绍了如何通过小模型与大模型的结合,解决数据分析中的问题。项目背景在智能涌现的大模型时代,越来越多的企业和研究机构开始探索如何利用大模型来提升工作效率,助力业务智能化转型。但其实小模型与大模型结合后,能够更加高效、低成......
  • 手撕Vuex-提取模块信息
    前言在上一篇【手撕Vuex-模块化共享数据】文章中,已经了解了模块化,与共享数据的注意点。那么接下来就要在我们自己的Nuex中实现共享数据模块化的功能。那么怎么在我们自己的Nuex中实现共享数据模块化的功能呢?处理数据也非常的简单,是不是就是处理一下子模块的数据,处理一下子模块......
  • 手撕Vue-Router-提取路由信息
    前言好了经过上一篇的学习,我们已经知道了如何监听Hash的变化,如何监听路径的一个变化,本篇我们就可以来实现我们自己的VueRouter了,那么怎么实现呢,在实现之前我们先来回顾一下官方的VueRouter是怎么使用的。VueRouter的使用首先需要去下载官方的VueRouter,如果是通过npm的......
  • 无涯教程-jsoup - 提取属性
    以下示例将HTML解析为Document对象后,使用Elements方法来获取dom元素的属性。Documentdocument=Jsoup.parse(html);Elementlink=document.select("a").first();System.out.println("Href:"+link.attr("href"));元素对象代表dom元素,并提供了各种获取dom元素属性的方法。......
  • C++汇总路径下全部文件名并提取出指定类型或名称的文件
      本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法。  首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多文件,如下图所示;我们如果想获取其中所有类型为.bmp格式的文件的名称,如果文件数量比较多的话,手动筛选就会很麻烦。而借......
  • 简单记录下python视频提取语音,语音转文字(web版本)
    一、直接贴代码,有些离线文件需要下载,python依赖包也需要下载。#coding=utf-8fromflaskimportFlask,render_template_string,jsonify,requestfromflask_corsimportCORSfromtkinterimportfiledialogfrompydubimportAudioSegmentfromnoisereduceimportredu......