Python爬取重点产业专利信息网(仅供学习交流!!)

由于要做有关专利方面的研究,所以选择了重点产业专利信息网获取数据,该网站提供了数据下载功能,但由于网站响应比较慢,而且需要数量较多,所以选择爬虫进行爬取。

在这里插入图片描述

1.数据获取

经过分析发现该网站需要模拟登录才能实现数据获取,并且我们从post请求的数据可以看出登录的用户名为: ‘cnipr’,密码为:123456。
登录失请求的url为:‘http://chinaip.sipo.gov.cn/login’,该网站需要维持session,所以我们使用session = requests.session(),然后用session去提交请求。该网站的最后数据获取跳转次数较多,所以会有多次请求。具体代码如下:

import re
import csv
import time
import random
import pandas as pd
import eventlet  #导入eventlet这个模块

#获取jsp内容
def get_jsp(page,searchword):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
        'Accept': 'text / html, application / xhtml + xml, image / jxr, * / *',
        'Accept - Encoding': 'gzip, deflate',
        'Cache - Control': 'no - cache',
        'Content - Type': 'application / x - www - form - urlencoded',
        'Host': 'chinaip.sipo.gov.cn',
        'Cookie': 'cizi=2; DisplayCookies=%u7533%u8BF7%u53F7%7C120%23%u7533%u8BF7%uFF08%u4E13%u5229%u6743%uFF09%u4EBA%7C160%23%u56FD%u7701%u4EE3%u7801%7C100%23%u5206%u7C7B%u53F7%7C160%23%u516C%u5F00%uFF08%u516C%u544A%uFF09%u53F7%7C160%23%u4E3B%u5206%u7C7B%u53F7%7C120%23%u540D%u79F0%7C500%23%u53D1%u660E%uFF08%u8BBE%u8BA1%uFF09%u4EBA%7C160%23%u516C%u5F00%uFF08%u516C%u544A%uFF09%u65E5%7C160%23%u7533%u8BF7%u65E5%7C100%23%u672C%u56FD%u4E3B%u4E13%u5229%u4EE3%u7406%u673A%u6784%7C160%23%u4EE3%u7406%u4EBA%7C100%23%u5730%u5740%7C160; __tins__20911579=%7B%22sid%22%3A%201608962776970%2C%20%22vd%22%3A%201%2C%20%22expires%22%3A%201608964576970%7D; __51cke__=; __51laig__=1',
        'Referer': 'http: // chinaip.sipo.gov.cn /'
    }  # post隐藏登录的请求头
    form_data = {
        'errorurl': 'error.jsp',
        'url': 'zljs/index.jsp?navRootID=1506&t=2',
        'channelid': '14,15,16',
        'name': 'cnipr',
        'password': '123456',
        'chanye': '1506',
    }  # post隐藏登录的表单
    #第一次模拟隐藏登录
    session = requests.session()
    response = session.post(url='http://chinaip.sipo.gov.cn/login', headers=headers, data=form_data,
                            allow_redirects=False,)
    #print(response)
    if response.status_code == 302:
        #print('第一次请求成功!')
        #获取cookie
        cookie = session.cookies
        a = cookie.get_dict()
        # 保持登录
        re1 = session.get('http://chinaip.sipo.gov.cn/zljs/hyjs-jieguo-mixed.jsp?firstsearch=1&searchword=%67901&searchChannel=&searchFrom=0&searchType=0&FTS=0&t=IPC&channelid=14,15,16,17')
        #第二次表单提交参数
        form_data2 = {
            'searchword': searchword,
            'channelid': '14',
            'sortfield': 'RELEVANCE',
            'currentChannelID': '14',
            'extension': '',
            'searchType': '0',
            'sortcolumn': 'RELEVANCE',
            'sRecordNumber': '1',
            'strdb': '14',
            'savesearchword': 'ON',
            'searchFrom': '0',
            'issearch': 'on',
            'page': page,
            'cizi': '2', }
        #第二、三次请求头
        headers3 = {'Accept': 'text/html, application/xhtml+xml, image/jxr, */*',
                    'Accept-Encoding': 'gzip, deflate',
                    'Accept-Language': 'zh-CN,zh;q=0.9',
                    'Cache-Control': 'max-age=0',
                    'Connection': 'keep-alive',
                    'Content-Length': '21353',
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'Cookie': 'DisplayCookies=%u7533%u8BF7%u53F7%7C120%23%u7533%u8BF7%uFF08%u4E13%u5229%u6743%uFF09%u4EBA%7C160%23%u56FD%u7701%u4EE3%u7801%7C100%23%u5206%u7C7B%u53F7%7C160%23%u516C%u5F00%uFF08%u516C%u544A%uFF09%u53F7%7C160%23%u4E3B%u5206%u7C7B%u53F7%7C120%23%u540D%u79F0%7C500%23%u53D1%u660E%uFF08%u8BBE%u8BA1%uFF09%u4EBA%7C160%23%u516C%u5F00%uFF08%u516C%u544A%uFF09%u65E5%7C160%23%u7533%u8BF7%u65E5%7C100%23%u672C%u56FD%u4E3B%u4E13%u5229%u4EE3%u7406%u673A%u6784%7C160%23%u4EE3%u7406%u4EBA%7C100%23%u5730%u5740%7C160; JSESSIONID={}; __tins__20911579=%7B%22sid%22%3A%201609061045897%2C%20%22vd%22%3A%202%2C%20%22expires%22%3A%201609064216885%7D; __51cke__=; __51laig__=16; cizi=2; DisplayCookies=%u7533%u8BF7%u53F7%7C120%23%u7533%u8BF7%uFF08%u4E13%u5229%u6743%uFF09%u4EBA%7C160%23%u56FD%u7701%u4EE3%u7801%7C100%23%u5206%u7C7B%u53F7%7C160%23%u516C%u5F00%uFF08%u516C%u544A%uFF09%u53F7%7C160%23%u4E3B%u5206%u7C7B%u53F7%7C120%23%u540D%u79F0%7C500%23%u53D1%u660E%uFF08%u8BBE%u8BA1%uFF09%u4EBA%7C160%23%u516C%u5F00%uFF08%u516C%u544A%uFF09%u65E5%7C160%23%u7533%u8BF7%u65E5%7C100%23%u672C%u56FD%u4E3B%u4E13%u5229%u4EE3%u7406%u673A%u6784%7C160%23%u4EE3%u7406%u4EBA%7C100%23%u5730%u5740%7C160'.format(list(a.values())[0]),
                    'Host': 'chinaip.sipo.gov.cn',
                    'Origin': 'http://chinaip.sipo.gov.cn',
                    'Referer': 'http://chinaip.sipo.gov.cn/zljs/hyjs-jieguo-mixed.jsp?firstsearch=1&searchword=%231507&searchChannel=&searchFrom=0&searchType=0&FTS=0&t=IPC&channelid=14,15,16,17',
                    'Upgrade-Insecure-Requests': '1',
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko', }
        re2 = session.post(url='http://chinaip.sipo.gov.cn/zljs/hyjs-jieguo-mixed.jsp?', headers=headers3,
                           data=form_data2,)
        if re2.status_code == 200:
            page_re = r"\"<iframe id='sOutline' src=\'(.*)\' width='770'"  # 获取下一页参数
            page_mach = re.search(page_re, str(re2.text))
            page_random = page_mach.group(1)
            #print(page_random)
            # 构建下一页的URL
            Next_url = 'http://chinaip.sipo.gov.cn/zljs/RecordFrame.jsp?' + page_random
            #print('第{}页链接为:'.format(page),Next_url)
            # 获取JSP内容
            content = session.get(url=Next_url, headers=headers3, allow_redirects=False)

            if content.status_code == 200:
                print('第{}页获取jsp页面成功!'.format(page))
                return content.text
            else:
                print('第{}页获取jsp页面错误!!!!!!'.format(page))
                return None
        else:
            print("获取第{}页链接错误!!!!!!!".format(page))
            return None
    else:
        print("第一次请求错误")
        return None

2.说明与改进

由于网站响应较慢,所以爬取可以在晚上进行,既不影响其他用户使用,也可提高效率。经笔者实践后发现,由于需要获取的数据量较大以及该网站的响应较慢,所以采用了多协程进行爬取,极大的提高了爬取效率。再次说明以上代码仅供学习交流使用,在爬取时建议设置休眠时间,防止导致服务器崩溃。

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要香菜哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值