2016-09-30 71 views
1

我想網絡報廢此網頁和該搜索的所有的「下一個頁面」自動重定向時webscrap

http://g1.globo.com/busca/?q=incerteza+pol%C3%ADtica+economia&cat=a&ss=4da73052cb8296b5&st=G1&species=not%C3%ADcias

當我去搜索的第2頁,我正確excract所有鏈接。

當我轉到一個不存在的頁面時,網站會重定向到搜索的第一頁。

http://g1.globo.com/busca/?q=incerteza+pol%C3%ADtica+economia&cat=a&ss=4da73052cb8296b5&st=G1&species=not%C3%ADcias&page=5000

例如,如果我去2500頁我沒有得到一個錯誤,這是我想要的,我回去第一頁。

以下是一段我的代碼:

try: 
     html = urlopen("http://g1.globo.com/busca/?q=economia&cat=a&ss=1885518dc528dd9b&st=G1&species=not%C3%ADcias&page=110") #Search Link 
     bsObj = BeautifulSoup(html) #BeautifulSoup's Link 
     print(bsObj) 
    except OSError: 
     print("test") 

我的目標是到報廢所有可用的頁面,之後停止代碼。要做到這一點,首先,我需要了解發生了什麼。

感謝

回答

1

當你到達最後一頁,按鈕被禁用:

<a data-pagina="2" href="?ss=4da73052cb8296b5&amp;st=G1&amp;q=incerteza+pol%C3%ADtica+economia&amp;cat=a&amp;species=not%C3%ADcias&amp;page=2" 
class="proximo fundo-cor-produto"> próximo</a> 
      ^^^^ 
      # ok 

<a data-pagina="41" href="?ss=4da73052cb8296b5&amp;st=G1&amp;q=incerteza+pol%C3%ADtica+economia&amp;cat=a&amp;species=not%C3%ADcias&amp;page=41" 
    class="proximo disabled">próximo</> 
      ^^^^ 
      # no more next pages 

所以纔不斷循環,直到然後:

from bs4 import BeautifulSoup 
import requests 
from itertools import count 

page_count = count(1) 
soup = BeautifulSoup(requests.get(url.format(next(page_count))).content) 
disabled = soup.select_one("#paginador ul li a.proximo.disabled") 
print([a["href"] for a in soup.select("div.busca-materia-padrao a")]) 
print(soup.select_one("a.proximo.disabled")) 
while not disabled: 
    soup = BeautifulSoup(requests.get(url.format(next(page_count))).content) 
    disabled = soup.select_one("#paginador ul li a.proximo.disabled") 
    print([a["href"] for a in soup.select("div.busca-materia-padrao a")]) 

如果你正在使用請求想檢查你是否d被重定向你可以訪問.history屬性:

In [1]: import requests 

In [2]: r = requests.get("http://g1.globo.com/busca/?q=incerteza%20pol%C3%ADtica%20economia&cat=a&ss=4da73052cb8296b5&st=G1&species=not%C3%ADcias&page=5000") 

In [3]: print(r.history) 
[<Response [301]>] 
In [4]: r.history[0].status_code == 301 
Out[4]: True 

使用請求將禁止重定向和趕上301返回碼的另一種方式。

soup = BeautifulSoup(requests.get(url.format(next(page_count))).content) 
print([a["href"] for a in soup.select("div.busca-materia-padrao a")]) 

while True: 
    r = requests.get(url.format(next(page_count)), allow_redirects=False) 
    if r.status_code == 301: 
     break 
    soup = BeautifulSoup(r.content) 
    print([a["href"] for a in soup.select("div.busca-materia-padrao a")]) 
+0

我認爲你的邏輯是正確的,但while條件不會停止代碼,當它達到頁數。 –

+0

@ThalesMarques,是的,我在我的選擇器中有一個錯字,它現在可以正常工作 –

+0

第二個代碼仍然在最後一頁之後循環,但最後一個代碼工作正常。我會努力工作。非常感謝你! –

-1

你總是可以存儲從第一頁響應的哈希值(如果它的實際相同),然後檢查是否每個頁面的響應第一頁的哈希值相匹配。

此外,您可以使用的urllib2

import urllib2, urllib 
opener = urllib2.build_opener() 
urllib2.install_opener(opener) 
try: 
    response = urllib2.urlopen('http://g1.globo.com/busca/?q=incerteza+pol%C3%ADtica+economia&cat=a&ss=4da73052cb8296b5&st=G1&species=not%C3%ADcias&page=5000') 
    bsObj = BeautifulSoup(response.read()) #BeautifulSoup's Link 
    print(bsObj) 

except urllib2.HTTPError, err: 
    if err.code == 404: 
     print "Page not found!"