如何使用Python REQUESTS和BeautifulSoup抓取基于动态JavaScript的网站?

问题描述 投票:0回答:1

我正在抓取 https://www.shiksha.com/b-tech/colleges/b-tech-colleges-mumbai-all 收集大学信息。

在每所学院下方的网页上,仅给出一个课程名称,其余课程均使用 JavaScript 编写脚本。 例如。 +13 更多课程+

所以当我使用

requests.get(url)
时我没有得到他们的信息。

我如何使用 REQUESTS 和 BeautifulSoup 抓取这些细节? 我使用 Anaconda Jupyter Notebook 作为 IDE。

我听说过 Selenium,但不了解。 由于 Selenium 有点重,是否有任何可能的精简替代方案可以一次加载所有 JavaScript 内容。

我也听说过Splash框架。如果有人知道它以及如何将它与 Python Requests 和 BeautifulSoup 集成,请回答。

我尝试过的事情

1.PyQt

参考:https://www.youtube.com/watch?v=FSH77vnOGqU

我导入了与视频中不同的库,具体取决于 anaconda 中的 PyQt 版本。

import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
from PyQt5.QtWebKitWidgets import QWebPage
import requests
from bs4 import BeautifulSoup

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://www.shiksha.com/b-tech/colleges/b-tech-colleges-mumbai-all"
client_response=Client(url)
src=client_response.mainFrame().toHtml()
soup = BeautifulSoup(src,"lxml")
tpm = soup.find_all("section",{"class":"tpl-curse-dtls more_46905_0"})
print(tpm)

输出:[]

2。请求模块中的 json()

import requests
from bs4 import BeautifulSoup

url="https://www.shiksha.com/b-tech/colleges/b-tech-colleges-mumbai-all"

r=requests.get(url)

a=r.json()

输出: JSONDecodeError:期望值:第 3 行第 1 列(字符 3)

3.来自 json 模块的 json.loads()

检查详情点击

import json

j_url='https://www.shiksha.com//nationalCategoryList/NationalCategoryList/loadMoreCourses/'

def j_data(url=j_url):

    dt = tp[0].find_all("input",{"id":"remainingCourseIds_46905"})

    output = dt[0]['value']

    data = {
        'courseIds': '231298,231294,231304,231306',
        'loadedCourseCount': 0
        #'page':page
        }
    response = requests.post(url, data=data)
    return json.loads(r.content)
print(j_data())

输出: JSONDecodeError:期望值:第 3 行第 1 列(字符 3)

DRYSCRAPE 不适用于 Windows

python selenium web-scraping beautifulsoup python-requests
1个回答
3
投票

你不需要知道它的 Javascript 是做什么的。只需单击链接并使用浏览器检查器观察网络请求即可。

在您的具体情况下,Javascript 会向“/nationalCategoryList/NationalCategoryList/loadMoreCourses/”发送 POST 请求。因此,您可以发送相同的请求,并且会返回一个新的 HTML 字符串。您可以使用 BeautifulSoup 解析该字符串并获取您需要的数据。

上面有一个额外的步骤,因为 POST 请求需要一个指定参数的负载。您应该能够在原始页面中找到这些参数。找到它们后,您可以查看它们周围的 HTML 元素,然后使用 BeautifulSoup 来提取它们,或者使用正则表达式来查找它们。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.