【问题标题】:Web scraping with requests not working correctly请求无法正常工作的 Web 抓取
【发布时间】:2019-12-12 20:46:50
【问题描述】:

我正在尝试从CNN 获取个人项目的 html。我正在使用 requests 库并且是新手。我已经按照基本教程使用请求从 CNN 获取 HTML,但是在我从浏览器中检查网页时,得到的响应与我发现的 HTML 不同。这是我的代码:

base_url = 'https://www.cnn.com/'
r = requests.get(base_url)
soup = BeautifulSoup(r.text, "html.parser")
print(soup.prettify())

我正在尝试从 CNN 获取文章标题,但这是我的第一个问题。感谢您的帮助!

更新 看来我知道的比我最初假设的还要少。我真正的问题是:如何从 CNN 主页中提取标题?我已经尝试了这两个答案,但请求中的 HTML 不包含标题信息。我怎样才能得到这个图片中的标题信息(我的浏览器截图)Screenshot of cnn article title with accompanying html side by side

【问题讨论】:

  • 每次响应都不一样吗?网页可能会动态变化。
  • 您的浏览器呈现 HTML 并执行例如Javascript。因此,您从请求中得到的结果是不同的。
  • 正如我在底部所指出的,我正在尝试从主页获取文章标题。我可以在 Web 浏览器上看到 HTML 中的标题。但是,请求响应不包含标题。
  • @Gabe 这完全正常,正如其他人已经说过的,这是由于浏览器渲染/JavaScript 造成的。您在浏览器中看到的 HTML 并没有反驳这一点。重要的是您打印的 HTML。说起来,你总是可以分享的。此外,当您的请求包含要传递给解析器的 HTML 时,请使用 .content,而不是 .text
  • 网页内容通过json加载。所以你必须从 json 请求中抓取这些数据

标签: python web-scraping beautifulsoup python-requests


【解决方案1】:

您可以使用Selenium ChromeDriver 刮取https://cnn.com

import bs4 as bs
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
driver = webdriver.Chrome("---CHROMEDRIVER-PATH---", options=chrome_options)

driver.get('https://cnn.com/')
soup = bs.BeautifulSoup(driver.page_source, 'lxml')

# Get Titles from HTML.
titles = soup.find_all('span', {'class': 'cd__headline-text'})
print(titles)

# Close ChromeDriver.
driver.close()
driver.quit()

输出:

[<span class="cd__headline-text"><strong>The West turned Aung San Suu Kyi into a saint. She was always going to disappoint </strong></span>, <span class="cd__headline-text"><strong>In Hindu-nationalist India, Muslims risk being branded infiltrators</strong></span>, <span class="cd__headline-text">Johnson may have stormed to victory, but he's got a problem</span>, <span class="cd__headline-text">Impeachment heads to full House after historic vote</span>, <span class="cd__headline-text">Supreme Court to decide on Trump's financial records</span>, <span class="cd__headline-text">Michelle Obama's message for Thunberg after Trump mocks her</span>, <span class="cd__headline-text">Actor Danny Aiello dies at 86</span>, <span class="cd__headline-text">The biggest risk at the North Pole isn't what you think</span>, <span class="cd__headline-text">US city declares state of emergency after cyberattack </span>, <span class="cd__headline-text">Reality TV show host arrested</span>, <span class="cd__headline-text">Big names in 2019 you may have mispronounced</span>, <span class="cd__headline-text"><strong>Morocco has Africa's 'first fully solar village'</strong></span>]

您可以从here下载ChromeDriver。

【讨论】:

    【解决方案2】:

    我尝试了以下代码,它对我有用。

    base_url = 'https://www.cnn.com/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'
    }
    r = requests.get(base_url, headers=headers)
    soup = BeautifulSoup(r.text, "html.parser")
    print(soup.prettify())
    

    请注意,我在requests.get() 中指定了headers 参数。它所做的只是试图模仿真实的浏览器,以使反抓取算法无法检测到它。
    希望这会有所帮助,如果没有,请随时在 cmets 中问我。干杯:)

    【讨论】:

      【解决方案3】:

      我刚刚检查过了。 CNN 似乎认识到您以编程方式尝试抓取网站并提供 404 / 缺失页面(上面没有内容)而不是主页。

      尝试像Selenium 这样的无头浏览器,例如像这样:

      from selenium import webdriver
      driver = webdriver.Firefox()
      driver.get('https://cnn.com')
      html = driver.page_source
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-03
        • 2014-04-21
        • 2014-06-08
        • 1970-01-01
        • 2018-07-13
        • 2017-04-30
        • 2015-09-16
        • 1970-01-01
        相关资源
        最近更新 更多