【问题标题】:Automatic redirect when webscrape网页抓取时自动重定向
【发布时间】:2016-09-30 03:00:38
【问题描述】:

我正在尝试网络抓取此网页以及此搜索的所有“下一页”

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

我的目标是清除所有可用页面并在此之后停止代码。为此,首先,我需要了解发生了什么。

谢谢

【问题讨论】:

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


    【解决方案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")])
    

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

    【讨论】:

    • 我认为你的逻辑是正确的,但是while条件并没有在达到页数时停止代码。
    • @ThalesMarques,是的,我的选择器中有错字,现在可以正常使用了
    • 第二个代码在最后一页之后仍然循环,但最后一个代码工作正常。我会做类似的事情。非常感谢!
    【解决方案2】:

    您始终可以存储来自第一页的响应的哈希值(如果它实际上相同),然后检查每个页面的响应是否与第一页的哈希值匹配。

    另外你可以使用 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!"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      相关资源
      最近更新 更多