scrapy抓取国家社科基金项目数据库

1.明确任务

目标网站:http://fz.people.com.cn/skygb/sk/index.php/Index/seach

抓取任务:抓取近五年某关键词(例如"能源"、”大数据“等)的搜索结果,抓取内容包括项目编号、项目名称、学科分类等十一个字段。

2.网站分析

利用Fiddler工具分析,输入关键词,指定年份后,点击搜索,针对有多页码搜索结果点击下一页,发现此过程共包括一个POST请求和一个GET请求;其中,指定关键词和年份点击搜索的过程为POST请求,点击下一页的过程为GET请求。

POST请求参数:

formdata = {
        ‘xmname‘: ‘‘,
        ‘xktype‘: ‘0‘,
        ‘xmtype‘: ‘0‘,
        ‘cglevel‘: ‘0‘,
        ‘cbdate ‘: ‘0‘,
        ‘cgxs‘: ‘0‘,
        ‘lxtime‘: ‘‘,
        ‘ssxt‘: ‘0‘,
        ‘zyzw‘: ‘0‘,
        ‘dwtype‘: ‘0‘,
        ‘jxdata‘: ‘0‘,
        ‘szdq‘: ‘0‘,
        ‘pznum‘: ‘‘,
        ‘cgname‘: ‘‘,
        ‘jxnum‘: ‘‘,
        ‘cbs‘: ‘‘,
        ‘xmleader‘: ‘‘,
        ‘hj‘: ‘‘,
        ‘gzdw‘: ‘‘,
        ‘zz‘: ‘‘
    }

POST请求目标URL:http://fz.people.com.cn/skygb/sk/index.php/Index/seach

GET请求只需要指定参数p即可,因此构造GET请求url为:

n_url = self.url + ‘?‘ + ‘xmname={}&p={}‘.format(formdata[‘xmname‘], self.page)

其中,xmname为搜索关键词,p为第几页的页码。

3.代码编写

3.1 创建scrapy爬虫项目

创建项目,名为ProSearch,使用命令:

scrapy startproject ProSearch http://fz.people.com.cn

3.2 明确抓取字段

创建爬虫项目后,编写items.py文件,明确待抓取的字段

# -*- coding: utf-8 -*-
import scrapy
class ProsearchItem(scrapy.Item):

    # 关键词
    keyword = scrapy.Field()
    # 项目编号
    pronums = scrapy.Field()
    # 项目类别
    protype = scrapy.Field()
    # 学科类别
    subtype = scrapy.Field()
    # 项目名称
    proname = scrapy.Field()
    # 立项时间
    protime = scrapy.Field()
    # 负责人
    leaders = scrapy.Field()
    # 工作单位
    workloc = scrapy.Field()
    # 单位类别
    orgtype = scrapy.Field()
    # 所在省市
    provloc = scrapy.Field()
    # 所属系统
    systloc = scrapy.Field()

3.3 生成爬虫文件

在cmd窗口进入到ProSearch项目后,生成爬虫文件。使用命令:

scrapy genspider SearchPro

3.4 编写爬虫逻辑

生成爬虫文件后,来到spiders文件夹下的SearchPro.py文件,开始辨写爬虫逻辑。

# -*- coding: utf-8 -*-
import scrapy
from ProSearch.items import ProsearchItem

class SearchproSpider(scrapy.Spider):

    name = ‘SearchPro‘  # 爬虫名称
    allowed_domains = [‘fz.people.com.cn‘]
    # start_urls = [‘http://fz.people.com.cn/skygb/sk/index.php/Index/seach‘]
    page = 1

    # 指定检索关键词
    keywords = [‘可持续‘, ‘互联网‘, ‘大数据‘, ‘能源‘]
    # 角标
    index = 0
    # 年份
    years = 2018

    # POST提交参数
    formdata = {
        ‘xmname‘: ‘‘,
        ‘xktype‘: ‘0‘,
        ‘xmtype‘: ‘0‘,
        ‘cglevel‘: ‘0‘,
        ‘cbdate ‘: ‘0‘,
        ‘cgxs‘: ‘0‘,
        ‘lxtime‘: ‘‘,
        ‘ssxt‘: ‘0‘,
        ‘zyzw‘: ‘0‘,
        ‘dwtype‘: ‘0‘,
        ‘jxdata‘: ‘0‘,
        ‘szdq‘: ‘0‘,
        ‘pznum‘: ‘‘,
        ‘cgname‘: ‘‘,
        ‘jxnum‘: ‘‘,
        ‘cbs‘: ‘‘,
        ‘xmleader‘: ‘‘,
        ‘hj‘: ‘‘,
        ‘gzdw‘: ‘‘,
        ‘zz‘: ‘‘
    }

    # 参数提交的url
    url = "http://fz.people.com.cn/skygb/sk/index.php/Index/seach"

    def start_requests(self):
        """
        POST请求实现一般是重写start_requests函数,指定第一个关键词为默认检索关键词
        :return:
        """
        self.formdata[‘xmname‘] = ‘可持续‘
        self.formdata[‘lxtime‘] = str(self.years)
        yield scrapy.FormRequest(
            url=self.url,
            formdata=self.formdata,
            callback=self.parse,
            meta={‘formdata‘: self.formdata}
        )

    def parse(self, response):
        """
        解析数据
        :param response:
        :return:
        """
        if response.meta[‘formdata‘]:
            formdata = response.meta[‘formdata‘]

        # 每行数据所在节点
        try:
            node_list = response.xpath("//div[@class=‘jc_a‘]/table/*")[1:]
        except:
            print("关键词‘{}’无搜索结果!".format(formdata[‘xmname‘]))
        for node in node_list:
            # 提取数据
            item = ProsearchItem()
            # 关键词
            item[‘keyword‘] = formdata[‘xmname‘]
            # 项目编号
            item[‘pronums‘] = node.xpath(‘./td[1]/span/text()‘).extract_first()
            # 项目类别
            item[‘protype‘] = node.xpath(‘./td[2]/span/text()‘).extract_first()
            # 学科类别
            item[‘subtype‘] = node.xpath(‘./td[3]/span/text()‘).extract_first()
            # 项目名称
            item[‘proname‘] = node.xpath(‘./td[4]/span/text()‘).extract_first()
            # 立项时间
            item[‘protime‘] = node.xpath(‘./td[5]/span/text()‘).extract_first()
            # 负责人
            item[‘leaders‘] = node.xpath(‘./td[6]/span/text()‘).extract_first()
            # 工作单位
            item[‘workloc‘] = node.xpath(‘./td[8]/span/text()‘).extract_first()
            # 单位类别
            item[‘orgtype‘] = node.xpath(‘./td[9]/span/text()‘).extract_first()
            # 所属省市
            item[‘provloc‘] = node.xpath(‘./td[10]/span/text()‘).extract_first()
            # 所属系统
            item[‘systloc‘] = node.xpath(‘./td[11]/span/text()‘).extract_first()
            yield item

        # 匹配下一页的数据
        if ‘下一页‘ in response.xpath("//div[@class=‘page clear‘]/a").extract():
            self.page += 1
            n_url = self.url + ‘?‘ + ‘xmname={}&p={}‘.format(formdata[‘xmname‘], self.page)
            yield scrapy.Request(url=n_url, callback=self.parse, meta={‘formdata‘: formdata})

        # 匹配其他年份的数据
        searcy_year = int(formdata[‘lxtime‘])
        if not searcy_year <= 2014:
            searcy_year -= 1
            formdata[‘lxtime‘] = str(searcy_year)
            print("检索关键词:{}!".format(formdata[‘xmname‘]))
            yield scrapy.FormRequest(
                    url=self.url,
                    formdata=formdata,
                    callback=self.parse,
                    meta={‘formdata‘: formdata}
            )
        # 其他关键词搜索
        else:
            self.index += 1
            if not self.index > len(self.keywords)-1:
                keyword = self.keywords[self.index]
                print("更新检索关键词为:{}".format(keyword))

                formdata[‘xmname‘] = keyword
                formdata[‘lxtime‘] = str(self.years)

                yield scrapy.FormRequest(
                        url=self.url,
                        formdata=formdata,
                        callback=self.parse,
                        meta={‘formdata‘: formdata}
                )

3.5 编写数据保存逻辑

本项目用excel对数据进行保存。在pipelines.py文件中编写数据保存的逻辑。

# -*- coding: utf-8 -*-
from openpyxl import Workbook

class ProsearchPipeline(object):

    def __init__(self):
        # 创建excel表格保存数据
        self.workbook = Workbook()
        self.booksheet = self.workbook.active
        self.booksheet.append([‘关键词‘, ‘项目编号‘, ‘项目类别‘, ‘学科类别‘, ‘项目名称‘, ‘立项时间‘, ‘负责人‘, ‘工作单位‘, ‘单位类别‘, ‘所在省市‘, ‘所属系统‘])

    def process_item(self, item, spider):

        DATA = [
            item[‘keyword‘], item[‘pronums‘], item[‘protype‘], item[‘subtype‘], item[‘proname‘], item[‘protime‘], item[‘leaders‘], item[‘workloc‘], item[‘orgtype‘], item[‘provloc‘], item[‘systloc‘]
        ]

        self.booksheet.append(DATA)
        self.workbook.save(‘./data/ProSearch.xls‘)
        return item

3.6 其他细节

到此基本内容完成,设置一下settings.py文件对细节进行处理基本爬虫就可以运行了。

处理一:打开pipline通道

处理二:添加随机请求头并打开下载中间件

处理三:添加重拾、延时、log级别等

处理四:编写脚本main.py文件

scrapy默认使用命令行进行创建、生成、爬去等任务,可尝试在整个项目下编写一个main.py文件,将爬去命令添加到py文件中,直接在编辑器中F5运行。

下次每次运行main.py文件就可以直接运行了。

4.完整代码

完整代码参见github



原文地址:https://www.cnblogs.com/pythoner6833/p/10272133.html

时间: 2024-11-05 20:44:04

scrapy抓取国家社科基金项目数据库的相关文章

scrapy抓取的页面中文会变成unicode字符串

不了解编码的,需要先补下:http://www.cnblogs.com/jiangtu/p/6245264.html 现象:从scrapy抓取的页面中文会变成unicode字符串,如下图 2017-03-28 23:00:12 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.lagou.com/jobs/2617468.html> {'describe': [u'<div>\n <p>\u5c97\u

分布式爬虫:使用Scrapy抓取数据

分布式爬虫:使用Scrapy抓取数据 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. 官方主页: http://www.scrapy.org/ 中文文档:Scrapy 0.22 文档 GitHub项目主页:https://github.com/scrapy/scrapy Scrapy 使用了 Twisted 异步网络库来处理网络通讯.整体架构大致如下(注:图片来自

通过Scrapy抓取QQ空间

毕业设计题目就是用Scrapy抓取QQ空间的数据,最近毕业设计弄完了,来总结以下: 首先是模拟登录的问题: 由于Tencent对模拟登录比较讨厌,各个防备,而本人能力有限,所以做的最简单的,手动登录后,获得Cookie信息,然后携带访问. 其次是数据接口: 通过对QQ空间的网页分析,数据主要是通过Json的形式返回.选择了两个数据接口进行数据抓取 每个QQ的详细信息接口: "http://user.qzone.qq.com/p/base.s8/cgi-bin/user/cgi_userinfo_

Scrapy抓取起点中文网排行榜

项目名称:qidian 项目描述:利用scrapy抓取七点中文网的"完本榜"总榜的500本小说,抓取内容包括:小说名称,作者,类别,然后保存为CSV文件 目标URL:https://www.qidian.com/rank/fin?style=1 项目需求: 1.小说名称 2.作者 3.小说类别 第一步:在shell中创建项目 scrapy startproject qidian 第二步:根据项目需求编辑items.py 1 #-*- coding: utf-8 -*- 2 import

scrapy抓取拉勾网职位信息(一)——scrapy初识及lagou爬虫项目建立

本次以scrapy抓取拉勾网职位信息作为scrapy学习的一个实战演练 python版本:3.7.1 框架:scrapy(pip直接安装可能会报错,如果是vc++环境不满足,建议直接安装一个visual studio一劳永逸,如果报错缺少前置依赖,就先安装依赖) 本篇主要对scrapy生成爬虫项目做一个基本的介绍 tips:在任意目录打开cmd的方式可以使用下面这两种方式 shift + 右键打开cmd(window10的powershell你可以简单理解为cmd升级版) 在路径框直接输入cmd

scrapy抓取某些网站出现AttributeError_ object has no attribute 的解决办法的代码.txt

把写内容过程中经常用的内容段备份一下,下面的内容内容是关于scrapy抓取某些网站出现AttributeError: 'Response' object has no attribute 'body_as_unicode'的解决办法的内容,应该是对码农们也有用. def parse(self, response): hxs=Selector(response) for url in detail_url_list: if 'goods' in url: yield Request(url, ca

【1.1】Scrapy抓取4步走、新建项目

Scrapy抓取4步走 新建项目 明确目标 制作爬虫 存储内容 scrapy startproject 项目名 scrapy genspider 文件名 域名 scrapy.cfg 原文地址:https://www.cnblogs.com/zydeboke/p/11619751.html

scrapy抓取学院新闻报告

抓取四川大学公共管理学院官网(http://ggglxy.scu.edu.cn)所有的新闻咨询. 实验流程 1.确定抓取目标.2.制定抓取规则.3.'编写/调试'抓取规则.4.获得抓取数据 1.确定抓取目标 我们这次需要抓取的目标为四川大学公共管理学院的所有新闻资讯.于是我们需要知道公管学院官网的布局结构. 微信截图_20170515223045.png 这里我们发现想要抓到全部的新闻信息,不能直接在官网首页进行抓取,需要点击"more"进入到新闻总栏目里面. Paste_Image.

爬虫scrapy抓取w3school课程列表

首先还是先创建scrapy项目,当然这都是在你安装scrapy之后啊,这个scrapy还是在linux系统下最省事,一行指令瞬间安装,这酸爽..... 言归正传啊,创建scrapy文件. <span style="font-size:14px;">scrapy startproject w3school</span> 之后可以查看一下,这个文件的结构,上一次抓取天气的时候还记得吗,我们采用的是tree命令. <span style="font-s