2016-09-30 68 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!"