【问题标题】:Collecting the data displayed in browser but not in response收集浏览器中显示但不响应的数据
【发布时间】:2021-12-11 13:43:57
【问题描述】:

情况

我正在尝试抓取网页以获取一些数据。 对于我的应用程序,我需要在浏览器中作为一个整体可以查看的 html 数据。

问题

但是当我抓取一些 url 时,我得到的数据无法从浏览器中查看。但在 html 代码中。那么有什么方法可以抓取只能在浏览器中查看的数据

代码

    from bs4 import BeautifulSoup
    import requests
    from selenium import webdriver
    from selenium.common.exceptions import WebDriverException
    from selenium.webdriver.chrome.service import Service
    
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")
    service = Service("/home/nebu/selenium_drivers/chromedriver")
    
    URL = "https://augustasymphony.com/event/top-of-the-world/"
    try:
        driver = webdriver.Chrome(service = service, options = options)
        driver.get(URL)
        driver.implicitly_wait(2)
        html_content = driver.page_source
        driver.quit()
    except WebDriverException:
        driver.quit()
    
    soup = BeautifulSoup(html_content)
    for each in ['header','footer']:
            s = soup.find(each)
            if s == None:
                continue
            else:
                s.extract()
    text = soup.getText(separator=u' ')
    print(text)

问题

我哪里错了? 我该如何调试呢?

【问题讨论】:

  • 您能否更具体地了解抓取过程中发生的情况。因为如果它在返回的 HTML 中,那么从技术上讲,您可以收集所述数据?
  • @Kwsswart 在 html 代码中,我正在获取该数据。但我只想要在浏览器窗口中可见的数据。
  • HTML 是浏览器中可查看的内容。您能否发布一份您收到的 html 副本,我可以尝试查看其中的问题
  • 通常当你抓取一个页面时,你会一次得到整个页面,然后你需要通过该页面只从整个 html 中获取你想要的数据
  • first:服务器可能会检测到Selenium并发送不同的内容。第二:某些元素可能在 HTML 中,但可能不会显示,因为它可能使用 CSS 隐藏它 - 但 BeautifulSoup 不能使用 CSS 删除它。最好使用BeautifulSoupSelenium 来仅获取您真正需要的值 - 但它需要更复杂的代码。

标签: python selenium web-scraping beautifulsoup


【解决方案1】:

这只是您需要以更具体的方式提取数据的情况。

你真的有两个选择:

选项 1:(我认为更好,因为它更快,资源更少。)

import requests
from bs4 import BeautifulSoup as bs


headers = {'Accept': '*/*',
 'Connection': 'keep-alive',
 'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683 Safari/537.36 OPR/57.0.3098.91'}
res = requests.get("https://augustasymphony.com/event/top-of-the-world/", headers=headers)
soup = bs(res.text, "lxml")

event_header = soup.find("h2", {"class": "rhino-event-header"}).text.strip()
time = soup.find("p", {"class": "rhino-event-time"}).text.strip()

您可以非常简单地使用请求来查找数据,如上面的代码所示,专门选择您想要的数据并将其保存在字典中。这是正常的处理方式。它可能在页面中包含很多脚本,但是页面不需要 JavaScript 来动态加载所述数据。

选项2:

您继续使用 selenium,可以使用多项选择之一收集页面的整个正文信息。

driver.find_element_by_id('wrapper').get_attribute('innerHTML') # Entire body
driver.find_element_by_id('tribe-events').get_attribute('innerHTML') # the events list
driver.find_element_by_id('rhino-event-single-content').get_attribute('innerHTML') # the single event

第二个选项更多的是获取整个 html 并转储它。

我个人会选择第一个选项,创建清理数据的字典。

编辑:

为了进一步说明我的例子


import requests
from bs4 import BeautifulSoup as bs
headers = {'Accept': '*/*',
 'Connection': 'keep-alive',
 'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683 Safari/537.36 OPR/57.0.3098.91'}
res = requests.get("https://augustasymphony.com/event/", headers=headers)
soup = bs(res.text, "lxml")
seedlist = {a["href"] for a in soup.find("div", {"id": "tribe-events-content-wrapper"}).find_all("a") if '?ical=1' not in a["href"]}
for seed in seedlist:
    res = requests.get(seed, headers=headers)
    soup = bs(res.text, "lxml")
    data = dict()
    data['event_header'] = soup.find("h2", {"class": "rhino-event-header"}).text.strip()
    data['time'] = soup.find("p", {"class": "rhino-event-time"}).text.strip()
    print(data)

在这里,我正在生成一个事件 url 的种子列表,然后进入每个事件 url 以查找信息。

【讨论】:

  • 如果只有一个 url,第一个选项会很好。但是如果有大约 400 个不同的基本 url,具有不同的格式和结构,那么哪个选项会更好。
  • 通常如果来自同一个网站,结构将是相同的
  • 我已经编辑了答案以进一步说明上述观点。如果尝试从具有不同结构和信息的许多不同网站上获取数据,那么您会注意到,由于数据的位置取决于不同的网站,因此需要为每个网站设计不同的流程,但通常 sae 域遵循相同的结构它们是自动生成的
  • 好的。感谢您的宝贵建议。让我检查整个事情
  • 我能问一个关于抓取的问题吗?我面临的另一个问题发布在stackoverflow.com/questions/69707833/…
【解决方案2】:

这是因为有些网站会检测它是否是网络浏览器。

所以他们不会发回 HTML 文件。

这就是为什么没有 HTML 发回的原因

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2017-03-18
    相关资源
    最近更新 更多