我试图网页废弃这个网页以及所有"下一页"这次搜索
当我转到搜索的第2页时,我正确地删除了所有链接。
当我转到一个不存在的网页时,网站会重定向到搜索的第一页。
例如,如果我转到第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")
我的目标是废弃所有可用的页面并在此之后停止代码。要做到这一点,首先,我需要了解正在发生的事情。
由于
答案 0 :(得分:1)
当您到达最后一页时,该按钮被禁用:
<a data-pagina="2" href="?ss=4da73052cb8296b5&st=G1&q=incerteza+pol%C3%ADtica+economia&cat=a&species=not%C3%ADcias&page=2"
class="proximo fundo-cor-produto"> próximo</a>
^^^^
# ok
<a data-pagina="41" href="?ss=4da73052cb8296b5&st=G1&q=incerteza+pol%C3%ADtica+economia&cat=a&species=not%C3%ADcias&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!"