[python]-专利爬虫-SooPAT

目的

课题需要研究下专利信息,想把专利导出到excel,于是点击“Excel批量导出”,
在这里插入图片描述
结果需要充值信仰。在这里插入图片描述
土豪朋友本文到这里结束了,请回吧…

恩,我接着讲,本着自己动手丰衣足食的原则,用python自己爬一爬。

网页分析

网页url规律

如果想爬多个网页,需要分析下多个网页的URL的规律。
对比下多个网页的URL,每个网页的规律显而易见。本例链接
在这里插入图片描述

URL关键字

通过观察搜索结果的URL,分析关键字“MC:(雷达)ZY:(77GHz OR 毫米波)”在URL中位置(有个关键字SearchWord),
在这里插入图片描述
在这里插入图片描述
利用urllib中的quote和parse进行验证(对比上图中的url)。
在这里插入图片描述
因此可以将搜索使用的关键字作为函数参数,便于其他关键字搜索。

其中关键字中MC(名称)、ZY(摘要)可以参考SooPat的表格检索相关内容。
在这里插入图片描述

内容分析

接下来就是分析需要爬取的内容,浏览器F12,查看网页代码。
在这里插入图片描述
首先找到每一条专利信息所对应的代码,关键信息:div标签 ,style属性【用区别于上一行(非专利信息)】。
继续往下找标题信息,定位到h2标签。从中提取包括专利类型、名称、申请号等信息;
在这里插入图片描述
从span标签可以提取申请人、分类号、摘要内容等相关信息,通过class属性可以轻松区分内容。
在这里插入图片描述

数据保存

想要的信息特征都有了,现在就是通过BeautifulSoup来一勺尝一尝。
接下来的问题就是存储,使用xlwt模块将数据保存在excel中。

到此所有内容分析完毕,上硬菜…

代码分享

# -*- coding: UTF-8 -*-
from bs4 import BeautifulSoup
import requests
import sys
from attr import attributes
import xlwt
from urllib.request import quote
from urllib import parse

g_sheet = None
g_file  = None 
g_count = 0

#设置表格样式
def set_style(nameAndDate,height,bold=False):
    style = xlwt.XFStyle()
    font = xlwt.Font()
    font.nameAndDate = nameAndDate
    font.bold = False
    font.color_index = 4
    font.height = height
    style.font = font
    return style

#写Excel
def creatExl(data):
    global g_sheet,g_file,g_count
    g_file = xlwt.Workbook()
    g_sheet = g_file.add_sheet("雷达",cell_overwrite_ok=True)
    row0 = ["序号","类型","编号","名称","链接","发明人","摘要"]
    write_raw(row0)   
    
def write_raw(data):
    global g_sheet,g_file,g_count  
    default = xlwt.easyxf('font: name Arial;')
    for i in range(0,len(data)):
        #g_sheet.write(g_count,i,data[i],set_style('Times New Roman',220,True))
        g_sheet.write(g_count,i,data[i],default)
    g_count = g_count +1
    g_file.save('test.xls')

#下载专利信息 主函数
def download_pat_info(key,pageCnt):
    global g_count
    eachPageUrls = []
    
    creatExl(key);
    keyUrl = quote(key)    
    baseUrl = 'http://www2.soopat.com/Home/Result?SearchWord='+keyUrl+'&FMZL=Y&SYXX=Y&WGZL=Y&FMSQ=Y'
    
    for i in range(0,pageCnt):
        if i != 0:
            #第一页序号不一样 
            url = baseUrl + '&PatentIndex='+str(i*10)
        else:
            url = baseUrl
        eachPageUrls.append(url)
        print(url)      
    
    for url in eachPageUrls:  
        print(g_count)  
        req = requests.get(url)
        req.encoding = 'utf-8'
        html = req.text
        table_bf = BeautifulSoup(html,'lxml')
        
        try:
            for each in table_bf.find_all('div',attrs={"style":"min-height: 180px;max-width: 1080px;"}):#attrs={'scope':"col"}):
                #print(each.get_text())
                content = []
                #序号
                content.append(str(g_count))
                typeblock = each.find('h2')
                type = typeblock.find('font')                
                #[发明]
                nameAndDate = typeblock.find('a')  
                date = nameAndDate.find('font',attrs = {"size":"-1"})
                list  = nameAndDate.get_text().split(' - ')
                #201910993873.X
                date = list[1]
                #毫米波XXX
                name = list[0]
                content.append(date)
                #类型
                content.append(type.get_text()[1:])
                #名称
                content.append(name)
                #链接                
                content.append('http://www2.soopat.com'+nameAndDate['href'])
                #XXX有限责任公司
                head= each.find('span',attrs={"class":"PatentAuthorBlock"})
                company = head.find('a')
                content.append(company.get_text())
                 #摘要正文
                text =  each.find('span',attrs={"class":"PatentContentBlock"})
                content.append(text.get_text())
                write_raw(content)
                #print(content)
        except Exception as aa:
            print(aa)
#搜索页数
pageCnt = 20
#搜索关键字
key = "MC:(雷达)ZY:(77GHz OR 毫米波)"
download_pat_info(key,pageCnt)

print('gg')

有待改进

上述代码还不太稳定,获取一定数量数据后,会出现卡死的情况(求大神指点)。

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值