天天看點

Python爬蟲入門教程 39-100 天津市科技計劃項目成果庫資料抓取 scrapy

爬前叨叨

緣由

今天本來沒有打算抓取這個網站的,無意中看到某個微信群有人問了一嘴這個網站,想看一下有什麼特别複雜的地方,一頓操作下來,發現這個網站除了卡慢,經常自己當機以外,好像還真沒有什麼特殊的....

Python爬蟲入門教程 39-100 天津市科技計劃項目成果庫資料抓取 scrapy

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

Python爬蟲入門教程 39-100 天津市科技計劃項目成果庫資料抓取 scrapy

有很明顯的分頁表示

清單如下

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
Python爬蟲入門教程 39-100 天津市科技計劃項目成果庫資料抓取 scrapy

對付這種小資料的網站,其實采用Selenium也未嘗不可啊~~