【问题标题】:Scrape html only after data loads with delay using Python Requests?仅在使用 Python 请求延迟加载数据后才抓取 html?
【发布时间】:2018-03-16 08:55:53
【问题描述】:

我正在尝试学习使用 python 进行数据抓取,并且一直在使用 Requests 和 BeautifulSoup4 库。它适用于普通的 html 网站。但是,当我尝试从延迟后加载数据的网站中获取一些数据时,我发现我得到了一个空值。一个例子是

from bs4 import BeautifulSoup
from operator import itemgetter
from selenium import webdriver
url = "https://www.example.com/;1"
browser = webdriver.PhantomJS()
browser.get(url)
html = browser.page_source
soup = BeautifulSoup(html, 'lxml')
a = soup.find('span', 'buy')
print(a)

我正在尝试从这里获取: (价值)

我已经提到了一个类似的主题,并尝试在与此处提供的解决方案类似的行上执行我的代码。但不知何故,它似​​乎不起作用。我是这里的新手,所以需要帮助才能完成这项工作。 How to scrape html table only after data loads using Python Requests?

表格(内容)可能是由 JavaScript 生成的,因此无法“看到”。我正在使用 python3.6 / PhantomJS / Selenium,正如这里很多答案所建议的那样。

【问题讨论】:

  • 您可以使用其中的一些selenium-python.readthedocs.io/waits.html 或添加time.sleep(n)
  • 你能检查一下网址吗?似乎 ;有一个错字,可能会导致您的刮板出现错误
  • @AndMar time.sleep 在这种情况下似乎不起作用。请建议您建议我在哪里添加?
  • @jabargas 如果我只是将soup.find('span', 'buy') 更改为soup.find('span', 'btc') 这只是静态内容而不是动态内容,则相同的代码可以工作页面加载后几秒钟内加载的内容。所以我怀疑url有什么问题。

标签: python python-3.x web-scraping beautifulsoup python-requests


【解决方案1】:

您必须运行无头浏览器才能运行延迟抓取。请使用硒。 这是示例代码。代码使用chrome浏览器作为驱动

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome(<chromedriver path here>)
browser.set_window_size(1120, 550)
browser.get(link)
element = WebDriverWait(browser, 3).until(
   EC.presence_of_element_located((By.ID, "blabla"))
)
data = element.get_attribute('data-blabla')
print(data)
browser.quit()

【讨论】:

  • 它使用 chrome webdriver 就像一个魅力。但它实际上打开了浏览器窗口。相反,无头浏览器有类似的东西吗?也许如果你有类似的 phantomjs 代码或者这样不会打开物理浏览器但在控制台窗口的引擎盖下工作?再次感谢。收到您的回复后,我会将此帖子标记为已回答。
  • 请将 webdriver.chorme() 替换为 webdriver.PhantomJS()。所有其他过程都相同。
【解决方案2】:

您可以通过 API 中的requesting it directly 访问所需的值并分析 JSON 响应。

import requests
import json

res = request.get('https://api.example.com/api/')
d = json.loads(res.text)

print(d['market'])

【讨论】:

  • 感谢您的回复。虽然 api 会为这个网站做。最初的想法是仍然了解如何在数据加载略有延迟的此类站点上获取价值。这是这篇文章的关键问题。
猜你喜欢
  • 2016-07-03
  • 1970-01-01
  • 2018-12-03
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2016-09-23
  • 1970-01-01
相关资源
最近更新 更多