【数据爬取】国家知识产权局(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)
小结
这第二种思路和第一种比起来真的简便了许多,然后写的过程中自己也学到了很多,代码里需要改进的地方欢迎大家提意见,互相交流!
版权归原作者 终极白月光 所有, 如有侵权,请联系我们删除。