python爬蟲解決網頁重定向問題


 

筆者編寫的搜索引擎爬蟲在爬取頁面時遇到了網頁被重定向的情況,所謂重定向(Redirect)就是通過各種方法(本文提到的為3種)將各種網絡請求重新轉到其它位置(URL)。每個網站主頁是網站資源的入口,當重定向發生在網站主頁時,如果不能正確處理就很有可能會錯失這整個網站的內容。

筆者編寫的爬蟲在爬取網頁時遇到了三種重定向的情況。

 

1.服務器端重定向,在服務器端完成,一般來說爬蟲可以自適應,是不需要特別處理的,如響應代碼301(永久重定向)、302(暫時重定向)等。具體來說,可以通過requests請求得到的response對象中的url、status_code兩個屬性來判斷。當status_code為301、302或其他代表重定向的代碼時,表示原請求被重定向;當response對象的url屬性與發送請求時的鏈接不一致時,也說明了原請求被重定向且已經自動處理。

#請求重定向
#方法二
response.setStatus(302);
response.setHeader("location", "/day06/index.jsp");
        
#方法二
response.sendRedirect("/day06/index.jsp");

scrapy shell 獲取重定向頁面

scrapy shell -s ROBOTSTXT_OBEY=False --no-redirect "https://jigsaw.w3.org/HTTP/300/301.html"
fetch(response.headers['Location'])

2.meta refresh,即網頁中的<meta>標簽聲明了網頁重定向的鏈接,這種重定向由瀏覽器完成,需要編寫代碼進行處理。例如,某一重定向如下面的html代碼第三行中的注釋所示,瀏覽器能夠自動跳轉,但爬蟲只能得到跳轉前的頁面,不能自動跳轉。

<html> <head> <meta http-equiv="refresh" content="0.1;url=http://www.redirectedtoxxx.com/"><!--本網頁會在0.1秒內refresh為url所指的網頁--> </head> </html>

解決辦法是通過得到跳轉前的頁面源碼,從中提取出重定向url信息(上述代碼第三行中的url屬性值)。一個具體的操作:

①使用xpath('//meta[@http-equiv="refresh" and @content]/@content')提取出content的值

②使用正則表達式提取出重定向的url值。

3.js 重定向,通過JavaScript代碼形式進行重定向。如下面JavaScript代碼

<script language=javascript>window.location.href='http://www.redirectedtoxxx.com'</script>

網頁包含內容這種情況是最容易解決的,一般來講基本上是靜態網頁已經寫死的內容,或者動態網頁,采用模板渲染,瀏覽器獲取到HTML的時候已經是包含所有的關鍵信息,所以直接在網頁上看到的內容都可以通過特定的HTML標簽得到javascript代碼加載內容,這種情況是由於雖然網頁顯示時,內容在HTML標簽里面,但是其實是由於執行js代碼加到標簽里面的,所以這個時候內容在js代碼里面的,而js的執行是在瀏覽器端的操作,所以用程序去請求網頁地址的時候,得到的response是網頁代碼和js的代碼,所以自己在瀏覽器端能看到內容,解析時由於js未執行,肯定找到指定HTML標簽下內容肯定為空,這個時候的處理辦法,一般來講主要是要找到包含內容的js代碼串,然后通過正則表達式獲得相應的內容,而不是解析HTML標簽。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM