webscrap时自动重定向

时间:2016-09-30 03:00:38

标签: python-3.x web-scraping beautifulsoup

我试图网页废弃这个网页以及所有"下一页"这次搜索

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

当我转到搜索的第2页时,我正确地删除了所有链接。

当我转到一个不存在的网页时,网站会重定向到搜索的第一页。

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")

我的目标是废弃所有可用的页面并在此之后停止代码。要做到这一点,首先,我需要了解正在发生的事情。

由于

2 个答案:

答案 0 :(得分: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")])

如果您使用请求想检查您是否已被重定向,则可以访问.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")])

答案 1 :(得分:-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!"