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

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

如下列出遇到的3種重定向狀況(使用python2.7+requests編寫爬蟲):html


1.服務器端重定向

在服務器端完成,通常來講爬蟲能夠自適應,是不須要特別處理的,如響應代碼301(永久重定向)、302(暫時重定向)等。具體來講,能夠經過requests請求獲得的response對象中的url、status_code兩個屬性來判斷。當status_code爲30一、302或其餘表明重定向的代碼時,表示原請求被重定向;當response對象的url屬性與發送請求時的連接不一致時,也說明了原請求被重定向且已經自動處理。java

2.meta refresh

即網頁中的<meta>標籤聲明瞭網頁重定向的連接,這種重定向由瀏覽器完成,須要編寫代碼進行處理。例如,某一重定向以下面的html代碼第三行中的註釋所示,瀏覽器可以自動跳轉,但爬蟲只能獲得跳轉前的頁面,不能自動跳轉。python

<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代碼segmentfault

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

對於這種方式的跳轉,因爲能夠實現該功能的JavaScript語句有多種形式,不能再使用正則表達式提取url,只能考慮加載JavaScript代碼來進行解決,例如使用selenium 無頭瀏覽器phantomJS 模擬瀏覽器操做
關於phantomJS的一些簡單操做語法能夠在我這篇phantomJS中看下瀏覽器

相關文章
相關標籤/搜索