【问题标题】:Requests is unable to get page请求无法获取页面
【发布时间】:2020-06-30 19:02:29
【问题描述】:

我正在尝试使用 Beautiful Soup 检索 this page

这是我尝试过的代码:

import requests
from bs4 import BeautifulSoup

page = requests.get("https://www.nasdaq.com/market-activity/stocks/msft/news-headlines")

每次我运行我的代码时,它都会卡住并且无法检索页面。但是,我收到了一次 ReadTimeout 异常 (requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='www.nasdaq.com', port=443): Read timed out. (read timeout=None))。

对于此问题的任何帮助或修复将不胜感激。

【问题讨论】:

  • 此代码尝试使用 requests 读取 URL,而不是 BeautifulSoup。您请求的网站似乎发送了大量数据或从未真正关闭连接,导致您提到的ReadTimeout,或者它只是挂起。我不确定解决方案,但我确信研究“Why requests.get hangs”之类的内容会产生有用的结果。

标签: python beautifulsoup python-requests user-agent


【解决方案1】:

我在请求中包含了标头,它似乎有效。我使用了浏览器发送的相同标头,您可以使用开发人员工具(如indicated here)找到这些标头。

import requests

headers = {
    "authority": "www.nasdaq.com",
    "method": "GET",
    "path": "/market-activity/stocks/msft/news-headlines",
    "scheme": "https",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "en-CA,en;q=0.9,ro-RO;q=0.8,ro;q=0.7,en-GB;q=0.6,en-US;q=0.5",
    "cache-control": "max-age=0",
    "dnt": "1",
    "if-modified-since": "Tue, 30 Jun 2020 19:43:05 GMT",
    "if-none-match": "1593546185",
    "sec-fetch-dest": "document",
    "sec-fetch-mode": "navigate",
    "sec-fetch-site": "none",
    "sec-fetch-user": "?1",
    "upgrade-insecure-requests": "1",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
}

page = requests.get("https://www.nasdaq.com/market-activity/stocks/msft/news-headlines", headers=headers)

【讨论】:

  • 我怀疑标题中只需要用户代理部分,例如"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"。您可以尝试在标题中仅包含 user-agent 字段。
  • 我赞同@zmike 的评论。网站需要一个“合法的”用户代理标头是非常常见的 IME。我说合法是因为有些人会拒绝没有特别“正常”的用户代理标头的请求,这当然可能是完全合法的,尽管很奇怪。
【解决方案2】:

而不是这样做

import requests
from bs4 import BeautifulSoup

page = requests.get("https://www.nasdaq.com/market-activity/stocks/msft/news-headlines")

尝试以这种方式检索网页:

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup 

page = Request("https://www.nasdaq.com/market-activity/stocks/msft/news-headlines")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多