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

爬前叨叨

緣由

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

在這裏插入圖片描述

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

在這裏插入圖片描述
有很明顯的分頁表示

列表如下

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

在這裏插入圖片描述

對付這種小數據的網站,其實採用Selenium也未嘗不可啊~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章