爬蟲獲取 js 動態(tài)數(shù)據(jù) (萬方數(shù)據(jù)庫文獻下載)

今天講講用爬蟲下載萬方數(shù)據(jù)庫文獻。



這是我們要爬取的文獻鏈接:
http://www.wanfangdata.com.cn/details/detail.do?_type=perio&id=zgtx201803009

右鍵那個下載按鈕 -> 檢查,我們可以看見,按鈕的點擊事件是一個 js 函數(shù) upload()。

在網(wǎng)頁源代碼中,尋找這個 upload() 函數(shù),發(fā)現(xiàn)它只在按鈕處出現(xiàn)了一次。所以,這個函數(shù)應(yīng)該是由 js 文件加載的。
在網(wǎng)頁源代碼中,尋找 .js(搜索 js 文件),點擊每一個 js 文件的鏈接,看看里面有沒有 upload() 函數(shù)(這個方法貌似有點蠢,不知有沒有更高效的方法)。最后在下圖這個文件找到了:



upload() 函數(shù)代碼如下:

function onlineReading(page_cnt,id,language,source_db,title,isoa,type,resourceType){
    title=window.encodeURI(window.encodeURI(title));
    var type = $("#document_type").val();
    if(type == "standards"){
        type="standard";
    }
    window.open("/search/onlineread.do?page_cnt="+page_cnt+"&language="+language+"&resourceType="+type+"&source="+source_db+"&resourceId="+id+"&resourceTitle="+title+"&isoa="+isoa+"&type="+type);
}

可以看到,這個函數(shù)構(gòu)造了一個 url, 并在一個新的標(biāo)簽頁打開了這個 url。
把參數(shù)填進去,構(gòu)造出的 url 為

http://www.wanfangdata.com.cn/search/downLoad.do?page_cnt=16&language=eng&resourceType=perio&source=WF&resourceId=zgtx201803009&resourceTitle=Spectral Efficiency and Power Allocation for Mixed-ADC Massive MIMO System&isoa=0&type=perio



在瀏覽器中訪問該 url ,發(fā)現(xiàn)我們看到的網(wǎng)址,并不是我們構(gòu)造出的請求 url,說明應(yīng)該是發(fā)生了重定向。

在一個新標(biāo)簽頁中,按 F12 監(jiān)聽請求,并打開我們的請求 url

可以看到,我們構(gòu)造的 url(也就是 downLoad.do? ),重定向到了 submitWeb.do? 。點擊 submitWeb.do ,我們可以看到它重定向到了 transaction?,最后才重定向到 downloadliterature.do?

寫爬蟲時,我們要確保能夠到達 downliterature.do?,后面才能下載文件。所以我們先寫程序看看能不能提取出這個 downloadliterature.do? 的詳細 url。

首先是用正則表達式提取 upload() 函數(shù)的參數(shù),然后構(gòu)造出請求 url,這里我懶得寫了,直接 copy 一下:

url = 'http://www.wanfangdata.com.cn/search/downLoad.do?page_cnt=16&language=eng&resourceType=perio&source=WF&resourceId=zgtx201803009&resourceTitle=Spectral Efficiency and Power Allocation for Mixed-ADC Massive MIMO System&isoa=0&type=perio'

接著發(fā)起請求:

import requests
r = requests.get(url)
print(r.status_code)
print(r.url)

運行結(jié)果如下:

200
http://www.wanfangdata.com.cn/pay/downloadliterature.do?type=perio&title=Spectral+Efficiency+and+Power+Allocation+for+Mixed-ADC+Massive+MIMO+System&id=zgtx201803009&isresult=false&transaction=%7B%22id%22%3Anull%2C%22transferOutAccountsStatus%22%3Anull%2C%22transaction%22%3A%7B%22id%22%3A%221004368608312180736%22%2C%22status%22%3A1%2C%22createDateTime%22%3Anull%2C%22payDateTime%22%3A1528295111145%2C%22authToken%22%3A%22TGT-4001230-O5ZS0q7FIl2vYtxeLVbVr1LQu2Auh7D4pAjaGsfFg0EAc2oqNa-my.wanfangdata.com.cn%22%2C%22user%22%3A%7B%22accountType%22%3A%22Group%22%2C%22key%22%3A%22hnlgdx%22%7D%2C%22transferIn%22%3A%7B%22accountType%22%3A%22Income%22%2C%22key%22%3A%22PeriodicalFulltext%22%7D%2C%22transferOut%22%3A%7B%22GTimeLimit.hnlgdx%22%3A3.0%7D%2C%22turnover%22%3A3.0%2C%22productDetail%22%3A%22perio_zgtx201803009%22%2C%22productTitle%22%3Anull%2C%22userIP%22%3A%22183.6.159.220%22%2C%22organName%22%3Anull%2C%22memo%22%3Anull%2C%22webTransactionRequest%22%3Anull%2C%22signature%22%3A%22jFHSx941kWx4WEX3sb40p%2B36UW9cduGMuYGPL8yCRS3Gdg0BvqNSKwYJxVTKdMGTRec1pF1an8xM%5CnnIgvniLkT3%2FivH6myLpZ%2BlHCJdj3OxoKIlk3AEQq8%2B4QTDLnfJI5YKW554i2SIyruQpCVCxDBfMS%5CnIh%2Fe8%2BYtbwmuAXcUYwk%3D%22%2C%22delete%22%3Afalse%7D%2C%22isCache%22%3Afalse%7D

還是挺順利的,一下子就得到了 downloadliterature.do? 的詳細 url。這里解釋一下:默認情況下,除了 requests.head() 方法,requests 會自動幫我們處理所有重定向。而 response.url 就會返回初始請求重定向后的最終網(wǎng)址。(差點忘了說了,我是用的學(xué)校網(wǎng)絡(luò),所以能免登陸下載。



將得到的網(wǎng)址復(fù)制到瀏覽器中打開,會出現(xiàn)一個網(wǎng)頁,再彈出下載對話框。這說明,downloadliterature.do? 并不是文件的最終下載鏈接,如果是文件的最終下載鏈接的話,就應(yīng)該會直接彈出對話框。所以,我們的下一步就是找出真正的下載鏈接。

觀察 downloadliterature.do? 網(wǎng)頁:

這里有個點擊下載的地方,通過 F12 以及查看網(wǎng)頁源代碼,我們可以看到文件的真正下載鏈接。接著,我們用正則表達式提取該鏈接,然后就可以用 requests 下載文件了。



最后,總結(jié)一下這一次尋找下載鏈接的思路:

  1. F12 檢查 下載按鈕 元素,發(fā)現(xiàn),點擊后觸發(fā)的是一個 js 函數(shù) upload()。
  2. 在網(wǎng)頁源代碼中找不到 upload() 的實現(xiàn),轉(zhuǎn)而在網(wǎng)頁包含的 js 文件中找。
  3. 找到 upload() 后,根據(jù)其實現(xiàn),構(gòu)造請求 url。
  4. 在瀏覽器中打開請求 url,發(fā)現(xiàn)網(wǎng)頁重定向了。用 requests 和 response 獲取重定向后的 url
  5. 得到重定向的 url 后,打開,并提取其中包含的文件下載鏈接
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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