0


[数据爬取】国家知识产权局(2008及以后)专利统计数据的收集(request+lxml+selenium)

【数据爬取】国家知识产权局(2008及以后)专利统计数据的收集(request+lxml+selenium)

前言

寒假里补数据分析课的实验报告,断断续续写了三四天,在这里记录下我稚嫩的代码。还有许多值得改进的地方,希望和大家互相学习。

任务要求

1、 百度搜索:国家知识产权局首页,打开以上链接

点击“数据”,找到“国家知识产权局统计年报”,输入年份,点击查询
在这里插入图片描述

2、 获取各年专利统计年报的子页面专利申请状况、专利申请授权状况、专利有效状况、专利行政执法状况的url。(提示由于url类似,可以考虑直接生成)
在这里插入图片描述

3、获取专利申请状况(专利申请授权状况、专利有效状况、专利行政执法状况做相同处理)子页面的所有url,
在这里插入图片描述

4、抓取对应页面的表格数据,并且输出到excel中
在这里插入图片描述

最终效果图

在这里插入图片描述直接下载在了python文件目录
在这里插入图片描述

思路

一共有两种思路,第一种做着做着做不下去了,太笨太麻烦了;我最后用的是第二种

思路一

直接获取子url里每个表格的源码,用xpath解析表格里的数据,然后将数据整理写进excel中。

import requests
from lxml import etree
header1={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.54'
}
page_text = requests.get(url='https://www.cnipa.gov.cn/tjxx/jianbao/year2018/a/a1.html', headers=header1).text
tree=etree.HTML(page_text)
title=tree.xpath('//body/table[2]/tr/td/b/span/text()')
tr_list=tree.xpath('/html/body/table[4]/tr')

for lines in range(len(tr_list)):
    a1line=get_a1line(lines,tr_list)
    print(a1line)

下面是整理之前的数据:
在这里插入图片描述

下面是整理所用的方法:(很笨)

def get_a1line(lines,tr_list):
    line = tr_list[lines].xpath('./td//text()')
    if lines==0:
        line0=['','','','','','']
        for j in [1,3,5,7]:
            line0.insert(j+1,line[j])
        return line0
    if lines==1:
        line1=['','']
        for j in [0,2,4,6,8,10,12,14]:
            line1.append(line[j])
        return line1
    if lines in (2,5,8):
        del line[1]
        del line[2]
        return line
    else:
        del line[1]
        line_new=['']
        line_new=line_new+line
        return line_new

而且后面还要用到合并表格的一系列麻烦操作,而且每个表格得重新写这个方法,总共有百八十个表格,我最终放弃了……

思路二

后面我观察表格页面,下面有一个下载按钮,点击可以直接下载excel表格,因此要做的就只是定位每个表格页面这个按钮,并将文件下载到指定位置就好!!主要就是用到了selenium.

下面是主程序

import requests
import os
from selenium import webdriver
from lxml import etree
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

#首先以年为单位,然后是四个类型,每个类型下有十多个表格
if __name__ == '__main__':
    header1 = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.54'
    }
    for year in range(2009,2022):
        #新建目录
        mkdir(r'./十年情况/' + str(year))
        for index1 in ['a','b','c','h']:
            url1="https://www.cnipa.gov.cn/tjxx/jianbao/year{}/{}.html".format(year,index1)
            #获取每个子页面下的表格数量
            excel_number=get_excels(url1)
            #遍历
            for index2 in range(1,excel_number+1):
                #下载excel到指定位置
                download_excel(year, index1,index2)

下面是用到的一些方法

#新建文件夹
def mkdir(path):
    isExists = os.path.exists(path)
    # 判断结果
    if not isExists:
        # 如果不存在则创建目录
        # 创建目录操作函数
        os.makedirs(path)
#获取该页面下子url的数量(表格的数量)
def get_excels(url1):
    page_text = requests.get(url=url1, headers=header1).text
    tree = etree.HTML(page_text)
    tr_list = tree.xpath('/html/body/table[2]/tr')
    return len(tr_list)

下面这个方法是关键,有两个关键点,首先是启动参数的设置,然后就是观察下载按钮的xpath路径规律

def download_excel(year,index1,index2):
    #编写一个字典,方便文件夹命名,增加可读性
    dict = {'a': '专利申请受理状况',
            'b': '专利申请授权情况',
            'c': '专利有效状况',
            'h': '专利行政执法状况'
            }
    #设置启动参数
    options=Options()
    #启动参数列表:默认不加载图片;设置默认下载路径
    prefs = {"profile.managed_default_content_settings.images": 2,
             "download.default_directory": 'D:\pythonProject1\python数据分析\实验报告一\十年情况\{}\{}'.format(year,dict[index1])}
    options.add_experimental_option("prefs", prefs)
    #使用无头浏览器
    options.add_argument('--headless')
    #禁用GPU加速功能
    options.add_argument('--disable-gpu')
    # 实例化一个浏览器对象
    chrome_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
    bro = webdriver.Chrome(executable_path=chrome_path,chrome_options=options)

    excel_url = "https://www.cnipa.gov.cn/tjxx/jianbao/year{}/{}/{}{}.html".format(year,index1,index1,index2)
    # 让浏览器发起一个网页请求
    bro.get(excel_url)

    #定位下载按钮
    # 获取每个表格里下载按钮所在的位置(行数)
    page_text = requests.get(url=excel_url, headers=header1).text
    tree = etree.HTML(page_text)
    table_list = tree.xpath('/html/body/table')
    cols=len(table_list)
    btn_download = bro.find_element(By.XPATH, r'/html/body/table[{}]/tbody/tr/td[2]'.format(cols))
    # /html/body/table[6]/tbody/tr/td[2]
    # /html/body/table[5]/tbody/tr/td[2]
    # /html/body/table[5]/tbody/tr/td[2]
    # /html/body/table[6]/tbody/tr/td[2]
    # /html/body/table[5]/tbody/tr/td[2]
    #/html/body/table[3]/tbody/tr/td[2]

    #点击下载按钮
    btn_download.click()
    sleep(3)

小结

这第二种思路和第一种比起来真的简便了许多,然后写的过程中自己也学到了很多,代码里需要改进的地方欢迎大家提意见,互相交流!

标签: selenium python

本文转载自: https://blog.csdn.net/weixin_58364000/article/details/128576107
版权归原作者 终极白月光 所有, 如有侵权,请联系我们删除。

“[数据爬取】国家知识产权局(2008及以后)专利统计数据的收集(request+lxml+selenium)”的评论:

还没有评论