動(dòng)態(tài)網(wǎng)站爬蟲

爬取網(wǎng)站:http://output.nsfc.gov.cn/projectQuery
網(wǎng)站特點(diǎn):需要根據(jù)輸入的表單信息進(jìn)行檢索,返回的信息在html里不直接顯示,并且在翻頁(yè)的時(shí)候url不變化。
這種情況就是需要我們向服務(wù)器發(fā)送請(qǐng)求,然后拿到數(shù)據(jù)之后,網(wǎng)站就會(huì)把各種數(shù)據(jù)填充到頁(yè)面上,因?yàn)槭峭ㄟ^js填充的,所以html代碼里并不會(huì)出現(xiàn)。
比如我們需要搜的是[植物學(xué),面上項(xiàng)目,結(jié)題年度2009]


在chrome里可以右鍵檢查。數(shù)據(jù)請(qǐng)求都是XHR類型的。我們點(diǎn)到XHR,我們按檢索后可以在Name中發(fā)現(xiàn)新的一條更新記錄。

點(diǎn)到Response

發(fā)現(xiàn)就是我們需要的json文件。接下來寫腳本開爬。

import requests
import json
def getProject(expert, code, projectType, ratifyYear):
    url = "http://output.nsfc.gov.cn/baseQuery/data/conclusionQueryResultsData"
    #url就是在Headers里的Request URL 
    #data就是我們需要提交的表單信息Headers里的Request Playload
    data = {
            "ratifyNo":"",
            "projectName":"",
            "personInCharge":"",
            "dependUnit":"",
            "code":"F02",  # 申請(qǐng)代碼
            "projectType":"218", # 面上項(xiàng)目
            "subPType":"",
            "psPType":"",
            "keywords":"", # 項(xiàng)目主題詞
            "ratifyYear":"2010", # 批準(zhǔn)年度
            "conclusionYear":"", 
            "beginYear":"",
            "endYear":"",
            "checkDep":"",
            "checkType":"",
            "quickQueryInput":"",
            "adminID":"",
            "pageNum":1, # 頁(yè)碼,從0開始
            "pageSize":5, # 頁(yè)面大小
            "queryType":"input",
            "complete":"true"
    }
    data['code'] = code
    data['personInCharge'] = expert
    data['projectType'] = projectType
    data['ratifyYear'] = ratifyYear
    payload = json.dumps(data)
    # headers就是Request Headers 我們要偽裝成自己的瀏覽器去發(fā)送請(qǐng)求
    headers = {
        'origin': "http://output.nsfc.gov.cn",
        'accept-encoding': "gzip, deflate",
        'accept-language': "zh-CN,zh;q=0.9,en;q=0.8",
        'user-agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
        'content-type': "application/json",
        'accept': "*/*",
        'referer': "http://output.nsfc.gov.cn/projectQuery",
        'x-requested-with': "XMLHttpRequest",
        'connection': "keep-alive",
        'cache-control': "no-cache",
        }

    response = requests.request("POST", url, data=payload, headers=headers)#發(fā)送請(qǐng)求并獲得返回?cái)?shù)據(jù)

    print(response.text) #打印爬下來的數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容