404 HTTP 错误,尽管能够在浏览器中看到页面

Posted

技术标签:

【中文标题】404 HTTP 错误,尽管能够在浏览器中看到页面【英文标题】:404 HTTP error, despite being able to see the page in the browser 【发布时间】:2021-07-22 10:34:04 【问题描述】:

我正在尝试绘制此网站的地图,但在尝试完全抓取该网站时遇到了问题。即使 URL 存在,我也会收到错误 404。

这是我的代码:

import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re

csvFile = open("C:/Users/Pichau/codigo/govbr/brasil/govfederal/govbr/arquivos/teste.txt",'wt')
paginas = set()
def getLinks(pageUrl):
    global paginas
    html = urlopen("https://www.gov.br/pt-br/"+pageUrl)
    bsObj = BeautifulSoup(html, "html.parser")
    writer = csv.writer(csvFile)
    for link in bsObj.findAll("a"):
      if 'href' in link.attrs:
       if link.attrs['href'] not in paginas:
             #nova página encontrada
                newPage = link.attrs['href']
                print(newPage)
                paginas.add(newPage)
                getLinks(newPage)
                csvRow = []
                csvRow.append(newPage)
                writer.writerow(csvRow)

   
getLinks("")
csvFile.close()  

这是我在尝试运行该代码后收到的错误消息:

#wrapper
/
#main-navigation
#nolivesearchGadget
#tile-busca-input
#portal-footer
http://brasil.gov.br
Traceback (most recent call last):
  File "c:\Users\Pichau\codigo\govbr\brasil\govfederal\govbr\teste2.py", line 26, in <module>
    getLinks("")
  File "c:\Users\Pichau\codigo\govbr\brasil\govfederal\govbr\teste2.py", line 20, in getLinks
    getLinks(newPage)
  File "c:\Users\Pichau\codigo\govbr\brasil\govfederal\govbr\teste2.py", line 20, in getLinks
    getLinks(newPage)
  File "c:\Users\Pichau\codigo\govbr\brasil\govfederal\govbr\teste2.py", line 20, in getLinks
    getLinks(newPage)
  [Previous line repeated 4 more times]
  File "c:\Users\Pichau\codigo\govbr\brasil\govfederal\govbr\teste2.py", line 10, in getLinks
    html = urlopen("https://www.gov.br/pt-br/"+pageUrl)
  File "C:\Users\Pichau\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 214, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\Pichau\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 523, in open
    response = meth(req, response)
  File "C:\Users\Pichau\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 632, in http_response
    response = self.parent.error(
  File "C:\Users\Pichau\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 561, in error
    return self._call_chain(*args)
  File "C:\Users\Pichau\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 494, in _call_chain
    result = func(*args)
  File "C:\Users\Pichau\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 641, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found
PS C:\Users\Pichau\codigo\govbr>

我尝试只使用主链接,它工作正常,但只要我将 pageurl 变量添加到 url,它就会给我这个错误。我该如何解决这个错误?

【问题讨论】:

如果您不知道 pageUrl 包含什么内容,我们将无法为您提供帮助。请花点时间阅读"How to create a Minimal, Complete, and Verifiable example" 和"How do I ask a good question?"。按照这些文章中的提示,您将获得更好的结果。 【参考方案1】:

据我所知,您是对的 - 页面就在那里......对于浏览器上的我们来说。我假设正在发生的是一些基本的反机器人机制,它禁止不常见的 UserAgent,或者换句话说,只允许浏览器查看页面。但是,由于 User Agent 是我们可以控制的标头,因此我们可以对其进行操作,使其不会引发 404 错误。

我目前无法输入代码,但您需要配对this *** answer describing how to change a header in urllib,并且您必须编写一些代码来获取该答案并将“UserAgent”标头更改为Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36之类的值,我取自here。

更改 UserAgent 标头后,您应该可以成功下载页面了。

【讨论】:

所以,我现在确实更改了标题,感谢您对此的澄清,但现在我得到了一个不同的错误: urllib.error.URLError: 您输入的 URL 错误或服务器已关闭。如果我的回答对您有帮助,请务必点赞并点击它左侧的复选标记按钮!

以上是关于404 HTTP 错误,尽管能够在浏览器中看到页面的主要内容,如果未能解决你的问题,请参考以下文章

Angular:$http 404 错误处理

使用标准 http 包显示自定义 404 错误页面

自定义404报错页面

HTTP 404 错误 的具体意思是啥

使用 Angular 7、NGINX 和 Docker 刷新页面时出现 404 错误

Failed to load resource: the server responded with a status of 404 (Not Found)