我可以在不打开浏览器的情况下自动浏览动态网站吗?

时间:2018-11-25 16:15:44

标签: python selenium web-scraping

我开始使用python自动化网络上的任务。 我试过了requests / urllib3 / requests-html,但是它们没有为我提供正确的元素,因为它们仅得到html(而不是带有javascript的更新版本)。 一些建议使用Selenium,但它会使用webdriver打开浏览器。 我需要一种在元素更新后以及第二次更新后获取元素的方法。 我不希望它打开浏览器的原因是我正在托管脚本服务上运行脚本。

2 个答案:

答案 0 :(得分:2)

我建议您查看webdriver中的--headless选项,但这可能对您不起作用,因为这仍然需要安装浏览器,因此webdriver可以利用浏览器呈现引擎(“无头”表示它不会启动UI)。由于您的托管服务可能未安装浏览器可执行文件,因此无法使用。

没有渲染引擎,您将无法获得渲染的页面(以及JS增强的网页),该页面根本无法在纯python中工作。

打开选项将是saucelabs之类的服务(我不隶属于,但我是一个快乐的用户),该服务在其基础结构上运行浏览器,并允许您通过其API控制它们。因此,您可以运行Selenium脚本,该脚本通过RemoteWebDriver获取HTML / JS内容,并在您自己的服务器上处理结果。

答案 1 :(得分:1)

这是我为您解决的问题。

美丽汤并不模仿客户。 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)