Python爬虫入门教程 39-100 天津市科技计划项目成果库数据抓取 scrapy

简介: 爬前叨叨缘由今天本来没有打算抓取这个网站的,无意中看到某个微信群有人问了一嘴这个网站,想看一下有什么特别复杂的地方,一顿操作下来,发现这个网站除了卡慢,经常自己宕机以外,好像还真没有什么特殊的..

爬前叨叨

缘由

今天本来没有打算抓取这个网站的,无意中看到某个微信群有人问了一嘴这个网站,想看一下有什么特别复杂的地方,一顿操作下来,发现这个网站除了卡慢,经常自己宕机以外,好像还真没有什么特殊的....

image

爬取网址 http://cgk.kxjs.tj.gov.cn/navigation.do

image

有很明显的分页表示

列表如下

Request URL: http://cgk.kxjs.tj.gov.cn/navigation.do
Request Method: POST

参数说明,里面两个比较重要的 pageNum 页码,numPerPage 每页显示的数据

trades: 
fields: 
enterprise_type: 
archive_year: 
hsql: 
searchKey: 
pageNum: 2
numPerPage: 25
date_low: 
date_high: 

拼接地址

由于是POST请求,所以需要引入FormRequest 类。重写start_requests方法,注意

 yield FormRequest(url=self.start_url,callback=self.parse,formdata=data,dont_filter=True)  

dont_filter=True 不过滤重复请求。

import scrapy
from scrapy import Request,FormRequest,Selector
import time

class TjSpider(scrapy.Spider):
    name = 'Tj'
    allowed_domains = ['cgk.kxjs.tj.gov.cn']
    start_url = "http://cgk.kxjs.tj.gov.cn/navigation.do"

    def start_requests(self):
        #yield scrapy.Request(url="http://cgk.kxjs.tj.gov.cn/detail.do?id=1", callback=self.parse_detail)
        for i in range(1,73): #73
            data = {
                "trades":"",
                "fields":"",
                "enterprise_type":"",
                "archive_year":"",
                "hsql":"",
                "searchKey":"",
                "pageNum": str(i),
                "numPerPage": "25",
                "date_low":"",
                "date_high":"",
            }
            print("正在爬取{i}".format(i=i))
            yield FormRequest(url=self.start_url,callback=self.parse,formdata=data,dont_filter=True)
            time.sleep(10)

数据解析

这个步骤分为2步,第一步解析列表页,获取详情页面的链接,第二步获取具体的字段,在匹配字段的时候采用字典动态更新,用来生成mongodb的字典格式。

    def parse(self, response):

        links = response.css('#Result tr td:nth-child(1)>a::attr(href)').extract()
        date = response.css('#Result tr td:nth-child(2)::text').extract()

        for item in range(len(links)):
            # yield {
            #     "link":links[item],
            #     "date":date[item]
            # }
            yield scrapy.Request(url=response.urljoin(links[0]),callback=self.parse_detail,meta={"date":date[item]})


    def parse_detail(self,response):

        trs = Selector(response).xpath("//table[@class='tab_lx003'][2]/tbody/tr")
        item = {}
        item.update({"date":response.meta["date"]})
        for tr_item in trs:
            item.update({tr_item.xpath("td[1]/text()").extract_first():tr_item.xpath("td[2]/text()").extract_first()})
        yield item
        time.sleep(3)

科技计划项目成果数据入库

入库操作非常简单了,走一遍之前的博客就可以,这个网站爬取的过程中没有太多问题,就是总是宕机掉,采用代理IP也没有解决,应该只是访问速度慢的原因,建议多爬取一下。

最后,发现详情页,最后的id=数字是连续性的,可以直接迭代

http://cgk.kxjs.tj.gov.cn/detail.do?id=60

image

对付这种小数据的网站,其实采用Selenium也未尝不可啊~~

相关文章
|
18小时前
|
分布式计算 DataWorks 调度
阿里云DataWorks-部署自定义python项目问题
阿里云DataWorks-多种方式部署自定义python项目并进行调度
|
2天前
|
存储 Linux Docker
python项目 以docker形式打包部署全流程
在很久很久以前,我已经听过Docker的大名,当时服务着急上线虽然考虑过用Docker来部署我的服务,但是因为赶期的原因放弃了。 这两天因为华为云服务器到期,而且阿里云服务器优惠力度特别大的原因,我要把华为云服务器里的工程迁移到阿里云。 迁移的过程中,大量的时间精力浪费在了重装python,加载依赖,迁移项目,配置端口等环境配置的工作上。 我在想,如果当时用了Docker部署,我至于受这气?
|
3天前
|
监控 数据可视化 数据库
【python项目推荐】键盘监控--统计打字频率
【python项目推荐】键盘监控--统计打字频率
37 13
|
3天前
|
数据采集 NoSQL MongoDB
使用多进程和 Scrapy 实现高效的 Amazon 爬虫系统
在这篇博客中,将展示如何使用多进程和 Scrapy 来构建一个高效的 Amazon 爬虫系统。通过多进程处理,提高爬虫的效率和稳定性,同时利用 Redis 进行请求调度和去重。
|
3天前
|
小程序 前端开发 JavaScript
计算机Python项目|django傣族节日及民间故事推广小程序
计算机Python项目|django傣族节日及民间故事推广小程序
|
3天前
|
前端开发 JavaScript 数据安全/隐私保护
计算机Python项目|django学生成绩管理系统
计算机Python项目|django学生成绩管理系统
|
4天前
|
机器学习/深度学习 传感器 算法
基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
|
4天前
|
机器学习/深度学习 算法 数据库
【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目
【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目
|
4天前
|
机器学习/深度学习 传感器 人工智能
敢不敢和AI比猜拳?能赢算我输----基于手势识别的AI猜拳游戏【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
敢不敢和AI比猜拳?能赢算我输----基于手势识别的AI猜拳游戏【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
|
4天前
|
Python
Python基础教程(第3版)中文版 第20章 项目1: 自动添加标签(纯文本转HTML格式) (笔记2)
Python基础教程(第3版)中文版 第20章 项目1: 自动添加标签(纯文本转HTML格式) (笔记2)