gpt4 book ai didi

javascript - 使用 python 抓取动态加载的网站

转载 作者:行者123 更新时间:2023-12-02 22:18:27 25 4
gpt4 key购买 nike

我是抓取动态加载网站的新手,并且一直在尝试抓取该网站的团队名称和赔率

https://www.cashpoint.com/de/fussball/deutschland/bundesliga

我像这篇文章中那样用 PyQt5 尝试过

PyQt4 to PyQt5 -> mainFrame() deprecated, need fix to load web pages

class Page(QWebEnginePage):

def __init__(self, url):
self.app = QApplication(sys.argv)
QWebEnginePage.__init__(self)
self.html = ''
self.loadFinished.connect(self._on_load_finished)
self.load(QUrl(url))
self.app.exec_()

def _on_load_finished(self):
self.html = self.toHtml(self.Callable)
print('Load finished')

def Callable(self, html_str):
self.html = html_str
self.app.quit()

def main():

page = Page('https://www.cashpoint.com/de/fussball/deutschland/bundesliga')
soup = bs.BeautifulSoup(page.html, 'html.parser')
js_test = soup.find('div', class_='game__team game__team__football')
print(js_test.text)

if __name__ == '__main__': main()

但它不适用于我想要抓取的网站。我得到一个,AttributeError:“NoneType”对象没有属性“text”错误。我没有用这种方法获取网站的内容,尽管在上面的帖子中有一个为动态加载网站编写的方法。正如我所读到的,处理动态加载的网站时的第一种方法是确定数据如何在页面上呈现。我该如何做到这一点以及为什么 PyQt5 不适用于该网站?使用 Selenium 的方式对我来说不是一个选择,因为获得实时赔率太慢了。当我检查网站并使用 Beautifulsoup 或 Scrapy 的正常方式使用它时,我可以获取网站显示的 html 内容吗?预先感谢您。

最佳答案

提供的代码会失败,因为即使页面加载完成,新元素也会异步创建,例如您想要获取“game__team”和“game__team__football”的div,因此在发出 loadFinished 信号时,即使这些元素是未创建。

一种可能的解决方案是直接使用 javascript 通过 runJavaScript() 方法获取文本列表,如果列表为空,则在时间 T 重试,直到列表不为空。

import sys

from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets


class Scrapper(QtCore.QObject):
def __init__(self, interval=500, parent=None):
super().__init__(parent)

self._result = []
self._interval = interval

self.page = QtWebEngineWidgets.QWebEnginePage(self)
self.page.loadFinished.connect(self.on_load_finished)
self.page.load(
QtCore.QUrl("https://www.cashpoint.com/de/fussball/deutschland/bundesliga")
)

@property
def result(self):
return self._result

@property
def interval(self):
return self._interval

@interval.setter
def interval(self, interval):
self._interval = interval

@QtCore.pyqtSlot(bool)
def on_load_finished(self, ok):
if ok:
self.execute_javascript()
else:
QtCore.QCoreApplication.exit(-1)

def execute_javascript(self):
self.page.runJavaScript(
"""
function text_by_classname(classname){
var texts = [];
var elements = document.getElementsByClassName(classname);
for (const e of elements) {
texts.push(e.textContent);
}
return texts;
}
[].concat(text_by_classname("game__team"), text_by_classname("game__team__football"));
""",
self.javascript_callback,
)

def javascript_callback(self, result):
if result:
self._result = result
QtCore.QCoreApplication.quit()
else:
QtCore.QTimer.singleShot(self.interval, self.execute_javascript)


def main():
app = QtWidgets.QApplication(sys.argv)
scrapper = Scrapper(interval=1000)
app.exec_()
result = scrapper.result
del scrapper, app

print(result)


if __name__ == "__main__":
main()

输出:

[' 1899 Hoffenheim ', ' FC Augsburg ', ' Bayern München ', ' Werder Bremen ', ' Hertha BSC ', ' SC Freiburg ', ' 1. Fsv Mainz 05 ', ' Borussia Dortmund ', ' 1. FC Köln ', ' Bayer 04 Leverkusen ', ' SC Paderborn ', ' FC Union Berlin ', ' Fortuna Düsseldorf ', ' RB Leipzig ', ' VFL Wolfsburg ', ' Borussia Mönchengladbach ', ' FC Schalke 04 ', ' Eintracht Frankfurt ', ' Werder Bremen ', ' 1. Fsv Mainz 05 ', ' Borussia Dortmund ', ' RB Leipzig ', ' FC Augsburg ', ' Fortuna Düsseldorf ', ' FC Union Berlin ', ' 1899 Hoffenheim ', ' Bayer 04 Leverkusen ', ' Hertha BSC ', ' Borussia Mönchengladbach ', ' SC Paderborn ', ' VFL Wolfsburg ', ' FC Schalke 04 ', ' Eintracht Frankfurt ', ' 1. FC Köln ', ' SC Freiburg ', ' Bayern München ', ' 1899 Hoffenheim ', ' Borussia Dortmund ', ' Bayern München ', ' VFL Wolfsburg ', ' 1899 Hoffenheim ', ' Bayern München ', ' Hertha BSC ', ' 1. Fsv Mainz 05 ', ' 1. FC Köln ', ' SC Paderborn ', ' Fortuna Düsseldorf ', ' VFL Wolfsburg ', ' FC Schalke 04 ', ' Werder Bremen ', ' Borussia Dortmund ', ' FC Augsburg ', ' FC Union Berlin ', ' Bayer 04 Leverkusen ', ' Borussia Mönchengladbach ', ' VFL Wolfsburg ', ' Eintracht Frankfurt ', ' SC Freiburg ', ' 1899 Hoffenheim ', ' Bayern München ']

关于javascript - 使用 python 抓取动态加载的网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59312752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com