Scrapy+splash抓取js生成的數據

一、python、lua、js間參數傳遞原理

抓取過程是python調用splash的lua腳本,lua中又調用了js代碼實現相關頁面內容的提取及js動作的模擬。在python中通過meta的splash中的args設置python將要傳入splash的參數信息,在splash中通過splash:jsfunc的接口封裝js代碼成爲lua函數,進而將lua中的參數傳入js代碼中。

(1)具體形式如下:

meta = {

          'splash':{

                       'endpoint':'execute',

                       'args':{'lua_source':script,'pagenum':i+1}

                 }

      }

 

(2)具體形式如下:

local gotopage = splash:jsfunc([[

                        function(x) {

                           $('#goInt').val(x);

                           $('#contenttable:nth-child(4) td:nth-child(8) input').click();

                        }

                    ]])

gotopage(3)

 

 

二、總結在lua中jquery的調試方法

Lua腳本中所含的js代碼,是在splash引擎中執行的,相關打印信息無法執行顯示,爲了保證jquery代碼的正確性,可以對jquery代碼進行單獨調試。將要抓取的網頁單獨保存,在網頁源碼中導入jquery-1.4.2.min.js,在<script></script>中寫入jquery代碼,刷新頁面就可以對jquery單獨調試,調試通過後可以將jquery代碼複製進lua中。

 

 

三、以國家藥品食品監督管理局網站的數據抓取爲例,總結splash的抓取流程,本流程中實現了翻頁的動作,分別對翻頁的每一頁進行操作

首先、在start_requests方法中,對start_url集合中的url,加入meta信息,重新創建request。 在request中植入的js腳本中,不能出現操作本地文件的代碼,否則會報http的400狀態碼,提示該請求不合法,因此保存抓取結果的持久化操作,只有在python的scrapy 的parse中進行;

其次、第一次會返回首頁信息及總頁數信息,在根據得到的總頁數信息,在parse中創建總頁數個request,每個request的splash中接收當前的頁數,通過模擬跳轉到該頁進行當前頁內容的獲取。

附:模擬點擊“下一頁”,直到“下一頁”按鈕失效,雖然能將內容抓到,但是在請求中無法通過寫文件進行保存,寫文件代碼會被視爲不合法的request請求。

抓取的數據格式如下:

 


抓取的數據格式如下:

 

1.北京東邵渠食品廠(SC11711281711709)"content.jsp?tableId=120&tableName=TABLE120&tableView=食品生產許可獲證企業(SC)&Id=594"

2.北京順利康食品有限公司(SC12411132511803)"content.jsp?tableId=120&tableName=TABLE120&tableView=食品生產許可獲證企業(SC)&Id=595"

3.貴港市新鑫米業有限公司(SC10145080300039)"content.jsp?tableId=120&tableName=TABLE120&tableView=食品生產許可獲證企業(SC)&Id=596"

4.北京尚世超越食品有限責任公司(SC13111130311819)"content.jsp?tableId=120&tableName=TABLE120&tableView=食品生產許可獲證企業(SC)&Id=597"

5.北京溪漫昌興飲用水有限公司



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