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