'「Python爬蟲」如何爬取翻頁url不變的網站'

Python 網絡爬蟲 瀏覽器 XML JSON 程序員 操作系統 小姐姐愛編程 2019-09-09
"

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

幫忙轉發,關注,私信小編Python獲取相關學習資料!!!

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

1、什麼是ajax

幾個常見的用到ajax的場景。

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

還比如,我們在看視頻時,可以看到下面的評論沒有完全全部加載出來,而是你向下拖動一點,它給你加載一點。

從上述場景你應該也可以發現它的優點:

  1. 方便與用戶的交互,不用重新加載整個網頁,就可以實現刷新,不用中斷用戶的行為。你正在看程序員如何找對象呢,此時來個消息推送,整個網頁被刷新了,你說你氣不氣!
  2. 還是你在看程序員如何找對象,但是此時通信狀況不好啊。回答加載不出來,頁面就空白的卡那了,回答加載不出來,你說急不急!那這樣咯,先給你看幾個回答,在你看的時候我再悄悄的加載其它的數據,那不就解決了嗎?就跟吃飯一個道理,你點了一桌子菜,難道菜全做好了再給你上嗎?肯定不會的呀,做好一道上一道嘛,對不對。
  3. 從服務端的發送過來的ajax數據,體積比較小。瀏覽器知道怎麼渲染它,這樣就減輕了服務端的壓力,讓客戶端,也就是瀏覽器承擔了一些任務。

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

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

  • 在不重新加載頁面的情況下更新網頁
  • 在頁面已加載後從服務器請求數據
  • 在頁面已加載後從服務器接收數據
  • 在後臺向服務器發送數據

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

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

具體方法如下:

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

"

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

幫忙轉發,關注,私信小編Python獲取相關學習資料!!!

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

1、什麼是ajax

幾個常見的用到ajax的場景。

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

還比如,我們在看視頻時,可以看到下面的評論沒有完全全部加載出來,而是你向下拖動一點,它給你加載一點。

從上述場景你應該也可以發現它的優點:

  1. 方便與用戶的交互,不用重新加載整個網頁,就可以實現刷新,不用中斷用戶的行為。你正在看程序員如何找對象呢,此時來個消息推送,整個網頁被刷新了,你說你氣不氣!
  2. 還是你在看程序員如何找對象,但是此時通信狀況不好啊。回答加載不出來,頁面就空白的卡那了,回答加載不出來,你說急不急!那這樣咯,先給你看幾個回答,在你看的時候我再悄悄的加載其它的數據,那不就解決了嗎?就跟吃飯一個道理,你點了一桌子菜,難道菜全做好了再給你上嗎?肯定不會的呀,做好一道上一道嘛,對不對。
  3. 從服務端的發送過來的ajax數據,體積比較小。瀏覽器知道怎麼渲染它,這樣就減輕了服務端的壓力,讓客戶端,也就是瀏覽器承擔了一些任務。

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

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

  • 在不重新加載頁面的情況下更新網頁
  • 在頁面已加載後從服務器請求數據
  • 在頁面已加載後從服務器接收數據
  • 在後臺向服務器發送數據

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

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

具體方法如下:

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

「Python爬蟲」如何爬取翻頁url不變的網站

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

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

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

幫忙轉發,關注,私信小編Python獲取相關學習資料!!!

"

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

幫忙轉發,關注,私信小編Python獲取相關學習資料!!!

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

1、什麼是ajax

幾個常見的用到ajax的場景。

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

還比如,我們在看視頻時,可以看到下面的評論沒有完全全部加載出來,而是你向下拖動一點,它給你加載一點。

從上述場景你應該也可以發現它的優點:

  1. 方便與用戶的交互,不用重新加載整個網頁,就可以實現刷新,不用中斷用戶的行為。你正在看程序員如何找對象呢,此時來個消息推送,整個網頁被刷新了,你說你氣不氣!
  2. 還是你在看程序員如何找對象,但是此時通信狀況不好啊。回答加載不出來,頁面就空白的卡那了,回答加載不出來,你說急不急!那這樣咯,先給你看幾個回答,在你看的時候我再悄悄的加載其它的數據,那不就解決了嗎?就跟吃飯一個道理,你點了一桌子菜,難道菜全做好了再給你上嗎?肯定不會的呀,做好一道上一道嘛,對不對。
  3. 從服務端的發送過來的ajax數據,體積比較小。瀏覽器知道怎麼渲染它,這樣就減輕了服務端的壓力,讓客戶端,也就是瀏覽器承擔了一些任務。

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

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

  • 在不重新加載頁面的情況下更新網頁
  • 在頁面已加載後從服務器請求數據
  • 在頁面已加載後從服務器接收數據
  • 在後臺向服務器發送數據

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

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

具體方法如下:

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

「Python爬蟲」如何爬取翻頁url不變的網站

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

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

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

幫忙轉發,關注,私信小編Python獲取相關學習資料!!!

「Python爬蟲」如何爬取翻頁url不變的網站

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

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

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

接下來就可以正常訪問和翻頁了!

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

附源碼


import requests

import os

import 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 picList

def 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)

幫忙轉發,關注,私信小編Python獲取相關學習資料!!!

"

相關推薦

推薦中...