【问题标题】:Can I automate browsing a dynamic website without opening a browser?我可以在不打开浏览器的情况下自动浏览动态网站吗?
【发布时间】:2019-04-27 09:46:24
【问题描述】:

我开始使用 python 在网络上自动执行任务。 我已经尝试过 requests/urllib3/requests-html 但他们没有给我正确的元素,因为他们只得到html(不是javascript 的更新版本)。 一些推荐使用 Selenium,但它会打开带有 webdriver 的浏览器。 我需要一种方法来获取更新后的元素,也许是在它们第二次更新之后。 我不希望它打开浏览器的原因是我在托管脚本服务上运行我的脚本。

【问题讨论】:

  • 请您分享minimal reproducible example。一些代码和测试 URL/HTML 在哪里?
  • 有点晚了,但我发现 woob.tech 很有趣,完整的浏览器没有 webdriver / 本地浏览器安装。

标签: python selenium web-scraping


【解决方案1】:

这是我对您的问题的解决方案。

Beautiful Soup 不会模仿客户。 Javascript 是在客户端上运行的代码。使用 Python,我们只需向服务器发出请求,并获得服务器的响应,当然还有 javascript,但读取和运行该 javascript 的是浏览器。因此,我们需要这样做。有很多方法可以做到这一点。如果你在 Mac 或 Linux 上,你可以设置 dryscrape ......或者我们基本上可以做 Dryscrape 在 PyQt4 中所做的事情。

    import sys
    from PyQt4.QtGui import QApplication
    from PyQt4.QtCore import QUrl
    from PyQt4.QtWebKit import QWebPage
    import bs4 as bs
    import urllib.request

    class Client(QWebPage):

        def __init__(self, url):
            self.app = QApplication(sys.argv)
            QWebPage.__init__(self)
            self.loadFinished.connect(self.on_page_load)
            self.mainFrame().load(QUrl(url))
            self.app.exec_()

        def on_page_load(self):
            self.app.quit()

    url = 'https://pythonprogramming.net/parsememcparseface/'
    client_response = Client(url)
    source = client_response.mainFrame().toHtml()
    soup = bs.BeautifulSoup(source, 'lxml')
    js_test = soup.find('p', class_='jstest')
    print(js_test.text)

以防万一您想使用干刮:

    import dryscrape

   sess = dryscrape.Session()
   sess.visit('https://pythonprogramming.net/parsememcparseface/')
   source = sess.body()

   soup = bs.BeautifulSoup(source,'lxml')
   js_test = soup.find('p', class_='jstest')
   print(js_test.text)

【讨论】:

【解决方案2】:

我建议您查看 webdriver 中的 --headless 选项,但这可能对您不起作用,因为这仍然需要安装浏览器,以便 webdriver 可以使用浏览器渲染引擎(“无头”意味着它不启动 UI)。由于您的托管服务可能没有安装浏览器可执行文件,因此这将不起作用。

如果没有渲染引擎,您将无法获得渲染的(和 JS 增强的)网页,这在纯 python 中根本无法工作。

选项将是像saucelabs 这样的服务(我不隶属,但我是一个快乐的用户),它在他们的基础设施上运行浏览器并允许您通过他们的 API 控制它们。因此,您可以运行 selenium 脚本,通过 RemoteWebDriver 获取 HTML/JS 内容并在您自己的服务器上处理结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多