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


    爬前叨叨

    缘由

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

    python3爬虫入门教程

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

    python3爬虫入门教程
    有很明显的分页表示

    列表如下

    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

    python3爬虫入门教程

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

    欢迎关注,我的微信号哦~~~

  • 相关阅读:
    矩阵乘法运算test
    c字符数组转整型【c语言复习1】
    (转载)JavaScript的那些书
    数据结构 排序算法
    (转载)给自己降降级你会发现一片广阔的天空
    Cocos2D简介
    JRE not compatible with workspace .class file compatibility: 1.7
    水晶报表问题,请高手指教。
    控件开发该如何入门?
    cnblogsDottext的FTB不生效,只是显示一个textarea标记,为什么呢?
  • 原文地址:https://www.cnblogs.com/happymeng/p/10425397.html
Copyright © 2020-2023  润新知