爬蟲必須解決的翻頁問題-獲取動態翻頁信息地址的方法(1)
寫爬蟲最重要的一點是獲取待爬取的頁面的地址,首頁是必須給定的(不然沒得玩!)
但是其他頁面呢?
最簡單的情況是,下一頁的鏈接地址直接給出。
1.頁面源碼中直接給出了下一頁的地址
標準樣板網站:www.tianya.cn
可以清楚看到下一頁的地址是:href="/post-house-713727-2.shtml"
因此可以輕易的獲得下頁的實際地址:http://bbs.tianya.cn/post-house-713727-2.shtml
而這樣其他的頁地址也可以利用以下源碼輕鬆拼接出來。
urls = ["http://bbs.tianya.cn/post-house-713727-{0}.shtml".format(str(i)) fori inrange(1, 6)]
有些頁面的翻頁時並沒有給定明確的url地址,而是採用javascript的操作進入到下一頁,對於這種情況,找到正確的下一頁的鏈接非常的重要。
2.動態JavaScript翻頁模式案例
下面根據不同的給出方式,分別進行討論。
(1)、湖北招標網
http://www.ccgp-hubei.gov.cn/
要進行翻頁處理:
此時會發現,在下頁的地方是通過:onclick方式處理的。
(2)、東方財富交易數據
http://data.eastmoney.com/stock/tradedetail.html
其翻頁如下處理:
可以發現,其翻頁也是通過一個函數完成。找不到下一頁的URL。
(3)、百度查詢
https://www.baidu.com/s?wd=%E6%88%90%E8%AF%AD&rsv_spt=1&rsv_iqid=0xb0efb94400419a86&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&rqlang=&tn=baiduhome_pg&rsv_enter=1&inputT=2296
以上網站是百度查找一個成語的結果。得到如下界面。
而在裡面的結果的翻頁中,是如下情況,很難有一個明確的url
其也是通過一個JavaScript函數進行處理,而不能得到其url地址。
在以上的三種情況中,如果想要不斷爬取各個頁面的數據,得到各頁面的地址非常重要,為此可以採用Firefox的firebug或者chrome來進行分析,進而得到其url地址
(4)、中華人民共和國住建部信
http://ginfo.mohurd.gov.cn/index.aspx?tabid=1
分析以上的代碼,可以發現,基本上沒有明確的URL地址,而是採用JavaScript動態翻頁。
而且其與前面的百度、東方財富還不同,後續分析提到。
類似的還有:湖南省招標投標監測網
http://www.bidding.hunan.gov.cn/item/itemCandidate.aspx
3.基於Firefox的Firebug路徑分析
那麼對於以上採用動態翻頁的情況,如何得到其下一頁的地址呢?
我們需要祭出我們的必殺利器:Firefox+FireBug
(1)、Firebug基本介紹
Firebug是網頁瀏覽器 Mozilla Firefox 下的一款開發類擴展,現屬於Firefox的五星級強力推薦擴展之一。它集HTML查看和編輯、Javascript控制檯、網絡狀況監視器於一體,是開發JavaScript、CSS、HTML和Ajax的得力助手。Firebug如同一把精巧的瑞士軍刀,從各個不同的角度剖析Web頁面內部的細節層面,給Web開發者帶來很大的便利。例如 Yahoo! 的網頁速度優化建議工具 YSlow。
Firebug也是一個除錯工具。用戶可以利用它除錯、編輯、甚至刪改任何網站的 CSS、HTML、DOM 以及JavaScript 代碼 。【來源:百度百科】
(2)、Firebug使用
安裝好firebug後,用F12或者直接在菜單欄打開firebug即可。
(3)、湖北招標網招標信息路徑分析
利用“清除”操作,把打開頁面看到的部分數據清除,然後選擇“網絡”下面的“html”得到如下頁面:
這時,再點擊原網頁的下頁。在firebug裡面的html裡面會出現請求地址。
這是點擊兩條後的情況,就會發現兩個url地址竟然一樣。
此時,右鍵點擊其中的地址,選擇“複製帶參數的地址”
http://www.ccgp-hubei.gov.cn/fnoticeAction!listFNoticeInfos_n.action?queryInfo.BEGINTIME1=2017-01-09&queryInfo.CGFS=&queryInfo.CGLX=&queryInfo.ENDTIME1=2017-02-13&queryInfo.FBRMC=&queryInfo.GGLX=%E6%8B%9B%E6%A0%87%E5%85%AC%E5%91%8A&queryInfo.JHHH=&queryInfo.QYBM=420001&queryInfo.TITLE=&queryInfo.curPage=5&queryInfo.pageSize=15&rank=
http://www.ccgp-hubei.gov.cn/fnoticeAction!listFNoticeInfos_n.action?queryInfo.BEGINTIME1=2017-01-09&queryInfo.CGFS=&queryInfo.CGLX=&queryInfo.ENDTIME1=2017-02-13&queryInfo.FBRMC=&queryInfo.GGLX=%E6%8B%9B%E6%A0%87%E5%85%AC%E5%91%8A&queryInfo.JHHH=&queryInfo.QYBM=420001&queryInfo.TITLE=&queryInfo.curPage=6&queryInfo.pageSize=15&rank=
再複製一條,對比這兩個參數的地址,就會發現,有個參數“&queryInfo.curPage=6”,這個就是變化的量,只要變化這個量,就可以得到不同的頁面。
至此完成地址確認工作。
該地址返回的數據是html頁面,直接用xpath進行數據提取即可。
(5)、東方財富交易數據路徑分析
利用“清除”操作,把打開頁面看到的部分數據清除,然後選擇“網絡”下面的“html”
得到如下頁面:
東方財富非常友好,我們已經發現兩個地址是不一樣的了,因此這兩個地址就直接作為不同頁面的地址。
直接右鍵點擊--》“複製地址”,得到以下數據:
http://data.eastmoney.com/DataCenter_V3/stock2016/TradeDetail/pagesize=50,page=1,sortRule=-1,sortType=,startDate=2017-01-01,endDate=2017-02-13,gpfw=0,js=var%20data_tab_2.html?rt=24782546
http://data.eastmoney.com/DataCenter_V3/stock2016/TradeDetail/pagesize=50,page=2,sortRule=-1,sortType=,startDate=2017-01-01,endDate=2017-02-13,gpfw=0,js=var%20data_tab_2.html?rt=24782546
對比兩條數據,可以發現“page=1”就是不同的量。
只是這裡返回的數據是json格式,這需要採用json包處理該數據。
(6)、百度查詢數據路徑分析
對於百度的數據採用同樣的分析方法,卻發現html下的記錄為0.
改為查看全部的數據:
終於發現不同的請求記錄。
複製地址如下:
https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?resource_id=6848&from_mid=1&&format=json&ie=utf-8&oe=utf-8&query=%E6%88%90%E8%AF%AD&sort_key=&sort_type=1&stat0=&stat1=&stat2=&stat3=&pn=0&rn=30&cb=jQuery1102030517880882542847_1486953305668&_=1486953305688
https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?resource_id=6848&from_mid=1&&format=json&ie=utf-8&oe=utf-8&query=%E6%88%90%E8%AF%AD&sort_key=&sort_type=1&stat0=&stat1=&stat2=&stat3=&pn=1&rn=30&cb=jQuery1102030517880882542847_1486953305668&_=1486953305690
對比兩條地址,可以發現:“&pn=0”就是其不同的變化的參數。在新的地址欄打開,即可訪問。但是這裡得到的還是json格式數據。
(7)、中華人民共和國住建部信息查詢路徑分析
採用同樣的方法分析:
右鍵,複製其帶參數的地址:
http://ginfo.mohurd.gov.cn/index.aspx?tabid=1&__EVENTARGUMENT=&__EVENTTARGET=ctl00%24lbtShouYe&__EVENTVALIDATION=%2FwEWEAKc%2F7n0AQLe%2BOO6CQLglpvOCAL1vp%2BVBgL0p6%2BGCQKBjLy2DQL9sOihAgL9sNyhAgL9n%2BCOAgK4xMTxDAKxq5vyDAKF5LqzCALdj%2FudCwKdwfHgDgLt%2FYHUCAKx3o%2BTDKzOaZxzeyoAvcGGlt1iydySDlYNT8YzuSI1kBarKvyI&__VIEWSTATE=%2FwEPaA8FDzhkNDU0Yzc4ZDRiZTU0M2SxbsTntI5ydy%2FBpmyZuKEV9lZehgqivC%2FUDqFniOWQgA%3D%3D&__VIEWSTATEGENERATOR=90059987&_ctl5%3AtbxGJC=&ctl00%24HFPageIndex=2&ctl00%24cldBegin=&ctl00%24cldEnd=&ctl00%24ddlType1=0&ctl00%24ddlType2=0&ctl00%24txtFWDW=&ctl00%24txtPage=&ctl00%24txtWH=&ctl00%24txtWJMC=
http://ginfo.mohurd.gov.cn/index.aspx?tabid=1&__EVENTARGUMENT=&__EVENTTARGET=ctl00%24lbtPageDown&__EVENTVALIDATION=%2FwEWDgKMmLaVDALe%2BOO6CQLglpvOCAL1vp%2BVBgL0p6%2BGCQKBjLy2DQL9sOihAgL9sNyhAgL9n%2BCOAgK4xMTxDALdj%2FudCwKdwfHgDgLt%2FYHUCAKx3o%2BTDMegkkrKiFAW82dG57AwwkFuOBl4yvtnrW1yyQEVgiBR&__VIEWSTATE=%2FwEPaA8FDzhkNDU0YzljNmM5ZDY0N2SVwccY1JT7a1NVarfS3NRaG7%2B%2FzGXyyWBZ%2BQ3KionKjw%3D%3D&__VIEWSTATEGENERATOR=90059987&_ctl5%3AtbxGJC=&ctl00%24HFPageIndex=1&ctl00%24cldBegin=&ctl00%24cldEnd=&ctl00%24ddlType1=0&ctl00%24ddlType2=0&ctl00%24txtFWDW=&ctl00%24txtPage=&ctl00%24txtWH=&ctl00%24txtWJMC=
這樣就很麻煩了,也就不能直接用百度裡面的方法得到其URL地址。
這樣再分析Post參數:
這裡發現前面6個都是以”_”開頭的變量。
特別是查詢後得知:
“id”屬性為“__EVENTVALIDATION”的隱藏字段(hiddern)是ASP.NET 2.0的新增的安全措施。該功能可以阻止由潛在的惡意用戶從瀏覽器端發送的未經授權的請求.
為了確保每個回發和回調事件來自於所期望的用戶界面元素,ASP.NET運行庫將在事件中添加額外的驗證層。服務器端通過檢驗表單提交請求的內容,將其與“id”屬性為“__EVENTVALIDATION”隱藏字段中的信息進行匹配。根據匹配結果來驗證未在瀏覽器端添加額外的輸入字段(有可能為用戶在瀏覽器端惡意添加的字段),並且該值是在服務器已知的列表中選擇的。ASP.NET運行庫將在生成期間創建事件驗證字段,而這是最不可能獲取該信息的時刻。像視圖狀態一樣,事件驗證字段包含散列值以防止發生瀏覽器端篡改。
說明:“id”屬性為“__EVENTVALIDATION”隱藏字段一般在表單的最下方,如果表單在瀏覽器端尚未解析完畢時,用戶提交數據有可能導致驗證失敗。
因此猜測這六個字段應該在源碼中都可以得到,因此繼續查詢源文件:
果然在頁面的源碼中發現了這個類型為hidden的input,如果我們可以獲取這個值的話,就可以拼接出這個url,或者採用post的方式進行處理了。至此問題完美解決。
另外:
類似的還有:湖南省招標投標監測網
http://www.bidding.hunan.gov.cn/item/itemCandidate.aspx
而且其hidden的數據更多更加噁心,但是沒有關係,方法還是一樣的。
4.小結
用Firebug工具,在“網絡”-》“html”-》“複製url地址”的方式得到其路徑。
對於一些採用了反扒的網站,可能附加了一些hidden的數據,因此我們要提前發現,並從網頁中提出,最後組裝成url即可。
在得到路徑之後,可以直接在瀏覽器中訪問,但是返回的數據可能是html或者json,這需要根據具體的情況採用不用的處理策略。
5.後續
話說這樣就夠了嗎?
你去看看http://www.jb51.net/article/58942.htm內容,查看源碼,估計你連頁面內容都看不到?為什麼?怎麼辦?
還有一種情況,就是很多頁面不是點擊下一頁翻頁的,而是拖動滾動條翻頁的,比如google的圖片搜索,目前騰訊的評論,這些該怎麼辦呢?請等待第二篇乾貨總結。