【问题标题】:How to correctly scrape a JavaScript-based site?如何正确抓取基于 JavaScript 的网站?
【发布时间】:2019-04-23 10:22:30
【问题描述】:

我正在测试下面的代码。

from bs4 import BeautifulSoup
import requests
from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.accept_untrusted_certs = True
import time

browser = webdriver.Firefox(executable_path="C:/Utility/geckodriver.exe")
wd = webdriver.Firefox(executable_path="C:/Utility/geckodriver.exe", firefox_profile=profile)
url = "https://corp_intranet"
wd.get(url)

# set username
time.sleep(2)
username = wd.find_element_by_id("id_email")
username.send_keys("my_email@corp.com")

# set password
password = wd.find_element_by_id("id_password")
password.send_keys("my_password")


url=("https://corp_intranet")
r = requests.get(url)
content = r.content.decode('utf-8')
print(BeautifulSoup(content, 'html.parser'))

这可以很好地登录我的公司内部网,但它只是打印非常非常基本的信息。点击 F12 显示页面上的很多数据都是使用 JavaScript 呈现的。我对此做了一些研究,并试图找到一种方法来真正抓住我在屏幕上看到的东西,而不是我能看到的非常非常稀释的版本。有没有办法对页面上显示的所有数据进行大数据转储?谢谢。

【问题讨论】:

  • 这听起来像是X-Y problem。与其寻求解决问题的帮助,不如编辑您的问题并询问实际问题。你想做什么?

标签: python python-3.x selenium geckodriver


【解决方案1】:

你打开2个浏览器删除这一行

browser = webdriver.Firefox(executable_path="C:/Utility/geckodriver.exe")

问题在于您已登录的 selenium,但不在 requests 中,因为它使用不同的会话

.....
.....
# missing click button? add "\n" to submit or click the button
password.send_keys("my_password\n")

# wait max 10 seconds until "theID" visible in Logged In page
WebDriverWait(wd, 10).until(EC.presence_of_element_located((By.ID, "theID")))

content = wd.page_source
print(BeautifulSoup(content, 'html.parser'))

【讨论】:

    【解决方案2】:

    您需要通过隐式或显式等待让 Selenium 等待网页加载其他内容。

    隐式等待可让您选择在抓取之前等待的特定时间。

    显式等待可让您选择要等待的事件,例如特定元素可见或可点击。

    This answer 详细介绍了这个概念。

    【讨论】:

    • 是的,是的,页面必须完全加载,当然,或者没有什么可以解析的。问题是,我的代码没有从 URL 中获取太多信息。此外,似乎代码正在打开 2 个浏览器,而不仅仅是 1 个浏览器。这很奇怪!
    • 我建议这样做是因为您发布的代码只是获取带有requests.get 的网址,它只会获得响应的初始 HTML。它不会运行任何 javascript 来加载页面的其余部分。听起来您需要等待 javascript 运行,然后使用 Selenium 的 webdriver.page_source 之类的东西从 Selenium 打开的 Web 浏览器中获取 HTML。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2014-04-07
    • 2020-10-02
    • 2016-11-07
    相关资源
    最近更新 更多