【Python爬蟲】如何爬取翻頁url不變的網站

點擊藍字python教程」關注咱們喲!

以前打算爬取一個圖片資源網站,可是在翻頁時發現它的url並無改變,沒法簡單的經過request.get()訪問其餘頁面。據搜索資料,瞭解到這些網站是經過ajax動態加載技術實現。便可以在不從新加載整個網頁的狀況下,對網頁的某部分進行更新。python

這樣的設置無疑給初期爬蟲新手製造了一些困難。程序員

一、什麼是ajaxajax

幾個常見的用到ajax的場景。瀏覽器

好比你在逛知乎,你沒有刷新過網頁,可是你卻能看到你關注的用戶或者話題有了新動態的消息提示。服務器

還好比,咱們在看視頻時,能夠看到下面的評論沒有徹底所有加載出來,而是你向下拖動一點,它給你加載一點。微信

從上述場景你應該也能夠發現它的優勢:app

  1. 方便與用戶的交互,不用從新加載整個網頁,就能夠實現刷新,不用中斷用戶的行爲。你正在看程序員如何找對象呢,此時來個消息推送,整個網頁被刷新了,你說你氣不氣!函數

  2. 仍是你在看程序員如何找對象,可是此時通訊情況很差啊。回答加載不出來,頁面就空白的卡那了,回答加載不出來,你說急不急!那這樣咯,先給你看幾個回答,在你看的時候我再悄悄的加載其它的數據,那不就解決了嗎?就跟吃飯一個道理,你點了一桌子菜,難道菜全作好了再給你上嗎?確定不會的呀,作好一道上一道嘛,對不對。工具

  3. 從服務端的發送過來的ajax數據,體積比較小。瀏覽器知道怎麼渲染它,這樣就減輕了服務端的壓力,讓客戶端,也就是瀏覽器承擔了一些任務。post

Ajax技術的核心是XMLHttpRequest對象(簡稱XHR),能夠經過使用XHR對象獲取到服務器的數據,而後再經過DOM將數據插入到頁面中呈現。雖然名字中包含XML,但Ajax通信與數據格式無關,因此咱們的數據格式能夠是XML或JSON等格式。(具體請訪問:https://www.w3.org/TR/XMLHttpRequest/

XMLHttpRequest對象用於在後臺與服務器交換數據,具體做用以下:

  • 在不從新加載頁面的狀況下更新網頁

  • 在頁面已加載後從服務器請求數據

  • 在頁面已加載後從服務器接收數據

  • 在後臺向服務器發送數據

二、如何爬取ajax動態加載的網頁

這裏用到的方法是經過分析響應請求,模擬響應參數。再經過requests庫的request.post()函數去post相對應的參數便可

具體方法以下:

打開開發者工具,快捷鍵F12,不行就Fn + F12.

標紅的1, network, 在其中能夠看到服務器加載過來的資源。

標紅的2, 是一個過濾器,你能夠按照文件格式篩選。

標紅的3,是加載過來的具體文件。

Headers中的request method 中顯示咱們使用的是POST方法。

並且FROM Data 中有一個參數,page。

利用Form Data 中的數據,編寫一個字典,賦值給requests.post()中的data便可

接下來就能夠正常訪問和翻頁了!

更爲具體的信息可見:https://zhuanlan.zhihu.com/p/27346009,很感謝其提供的思路和幫助

附源碼

import requestsimport osimport re def get_page(url,page_num): pageList =[] for i in range(1,page_num +1): formdata ={'type':'index' , 'paged': i} try: r = requests.post(url,data =formdata) r.raise_for_status() r.encoding = r.apparent_encoding print('連接成功') p = re.compile(r'href="(http://www.jdlingyu.net/\d{5}/)"') tempList = re.findall(p,r.text) for each in tempList: pageList.append(each) print('保存頁面成功') tempList = [] except: print('連接失敗') print(pageList) return pageList def get_picure(pageList): picList = [] for each in pageList: try: r = requests.get(each,headers = kv) r.raise_for_status() r.encoding = r.apparent_encoding p = re.compile('http://img.jdlingyu.mobi/[^"]+\.jpg|http://w[wx][23].sinaimg.cn/[^"]+\.jpg') tempList = re.findall(p,r.text) for each in tempList: picList.append(each) print('保存圖片連接成功') tempList = [] except: print('保存圖片連接失敗') return picListdef down_picture(picList,root): picList = list(set(picList)) if not os.path.exists(root): os.mkdir(root) for each in picList: path = root + each.split('/')[-1] if not os.path.exists(path): r = requests.get(each,headers = kv) r.raise_for_status() with open(path,'wb') as f: f.write(r.content) print('動圖已保存') else: print('動圖已存在') url = 'http://www.jdlingyu.net/'kv = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'}root = 'D://絕對領域//'pageList = get_page(url,2)picList = get_picure(pageList)down_picture(picList,root)

注意事項

01

對Python開發技術感興趣的同窗,歡迎加下方的交流羣一塊兒學習,相互討論。

02

python交流學習扣扣羣:934109170,多多交流問題,互幫互助,羣裏有不錯的學習教程和開發工具。學習python有任何問題(學習方法,學習效率,如何就業),能夠隨時來諮詢我

好啦!文章就給看官們分享到這兒

最後,若是以爲有幫助,記得關注、轉發、收藏



本文分享自微信公衆號 - python教程(pythonjc)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索