Redirection,一般來說我們叫他重導向
很多人可能會有一個疑問「為什麼我看到的跟爬蟲看到的不一樣 ?」
網頁重導向只是其中一個可能性
大家可以看到目標網頁的 Status Code 是 302,302 就是暫時重導向的意思
試想我們點擊「我同意」的時候發生什麼事 ? 就直接跳轉到目標網頁了
所以重導向不是一個很難的概念,單純就是因為某事件觸發,導致網頁跳轉
根據我的理解,302 這種重導向做到的方法是透過 Web Server 或 PHP Code 做到的
而有另一種重導向是透過 JavaScript 做到的,透過腳本做到的就不會出現 302 而是 200
差別在於第一種是重導向,第二種是直接去請求另一個網站,但功能上都是網頁跳轉
這邊有一個網頁,當你點擊開來過 2 秒就會跳轉到以下網頁
這就是透過 JavaScript 做到的
如果你想要查看他的原始碼,那你得在 2 秒內按下 Ctrl + U,應該是綽綽有餘啦 !
import requests from bs4 import BeautifulSoup
# I am over 18 years old session = requests.Session() response = session.post('https://www.ptt.cc/ask/over18', data = {'from' : '/bbs/Beauty/M.1563888394.A.F76.html', 'yes' : 'yes'}) soup = BeautifulSoup(response.text, 'html.parser')
# Get images div_list = soup.find_all('div', class_ = 'richcontent') for div in div_list: print(div.img.get('src'))
|
我就不附上執行結果了,因為執行結果也一模一樣
差別在於它通過 Cookie 驗證後,沒有重新去請求目標網頁
因為網頁自動重導向了 !
沒錯,requests 真的是很強大的函式庫,它會自動處理重導向
如果你想要關閉重導向也是可以的,可以寫 allow_redirects = False
相較之下,如果是 JavaScript 的重導向,你用 requests 請求後就只會看到第一個網頁
因為原生的 Python 沒有能力執行 JavaScript,所以如果你想要爬的是重導向過後的網頁
那你應該直接用 requests 去請求跳轉後的那份網頁
注意 ! 原生的 Python 沒有能力執行 JavaScript,卻有一些第三方函式庫可以做到
可以搜尋看看 Python execute JavaScript 之類的關鍵字
總之重導向是一個網頁本來就會遇到的議題,所以爬蟲也有義務知道一下
至於網頁回應 302 的時候要不要調整 allow_redirects 屬性 ?
如果是 JavaScript 帶我跳轉到別的網頁,就會導致我和爬蟲看到的不一樣
但這些完全取決於你在意的「資料」在什麼位置