[数据爬取】国家知识产权局(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)

小结

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

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用selenium爬取链家网二手房数据的步骤如下: 1. 安装selenium库和对应的浏览器驱动,比如Chrome浏览器和Chrome驱动。 2. 打开链家网的二手房页面,使用selenium模拟搜索关键词或者直接进入目标城市的二手房页面。 3. 使用selenium模拟点击“下一页”操作,直到获取全部的二手房数据。 4. 使用BeautifulSoup或者正则表达式提取所需的二手房数据,比如房屋标题、房屋价格、房屋面积、房屋地址等。 5. 将提取的二手房数据保存到本地文件或者数据库中。 以下是一个示例代码,可以爬取上海市浦东新区的二手房数据: ``` python from selenium import webdriver from bs4 import BeautifulSoup # 设置浏览器驱动路径 driver_path = 'C:/chromedriver.exe' # 创建Chrome浏览器实例 driver = webdriver.Chrome(executable_path=driver_path) # 打开链家网二手房页面 driver.get('https://sh.lianjia.com/ershoufang/pudong/') # 最大化窗口 driver.maximize_window() # 定义一个空列表,用于存储所有二手房数据 house_list = [] while True: # 获取页面源代码 html = driver.page_source # 使用BeautifulSoup解析页面源代码 soup = BeautifulSoup(html, 'lxml') # 获取所有包含二手房信息的div标签 house_items = soup.find_all('div', class_='info clear') # 遍历每个二手房信息标签,提取所需数据 for item in house_items: # 获取房屋标题 title = item.find('div', class_='title').get_text().strip() # 获取房屋总价 price_total = item.find('div', class_='price').find('span').get_text() # 获取房屋单价 price_unit = item.find('div', class_='price-pre').get_text() # 获取房屋面积 area = item.find('div', class_='houseInfo').find_all('a')[1].get_text() # 获取房屋地址 address = item.find('div', class_='houseInfo').find_all('a')[0].get_text() # 将所有数据存储到字典中 house_dict = {'title': title, 'price_total': price_total, 'price_unit': price_unit, 'area': area, 'address': address} # 将字典添加到列表中 house_list.append(house_dict) # 查找下一页按钮 next_button = driver.find_element_by_css_selector('.house-lst-page-box .page-box a:last-child') # 如果下一页按钮可用,则点击进入下一页 if 'disabled' not in next_button.get_attribute('class'): next_button.click() # 否则,退出循环 else: break # 关闭浏览器实例 driver.quit() # 打印所有二手房数据 for house in house_list: print(house) ``` 上述代码中,使用了BeautifulSoup库解析页面源代码,并用find方法提取所需数据。同时,使用了selenium模拟点击下一页按钮,直到获取全部的二手房数据。最后,将所有二手房数据存储到一个列表中,并打印输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值