美文网首页大数据 爬虫Python AI SqlPython小哥哥爬虫
利用python爬虫框架scrapy抓取某市科技计划项目成果库数

利用python爬虫框架scrapy抓取某市科技计划项目成果库数

作者: 轻松学Python111 | 来源:发表于2019-06-19 16:02 被阅读43次

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

    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=数字是连续性的,可以直接迭代,小编整理一套Python资料和PDF,有需要Python学习资料可以加学习群:1004391443,反正闲着也是闲着呢,不如学点东西啦~~

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

    python3爬虫入门教程

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

    相关文章

      网友评论

        本文标题:利用python爬虫框架scrapy抓取某市科技计划项目成果库数

        本文链接:https://www.haomeiwen.com/subject/zrlrxctx.html