Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python请求和BeautifulSoup刮取基于JavaScript的动态网站?_Python_Selenium_Web Scraping_Beautifulsoup_Python Requests - Fatal编程技术网

如何使用Python请求和BeautifulSoup刮取基于JavaScript的动态网站?

如何使用Python请求和BeautifulSoup刮取基于JavaScript的动态网站?,python,selenium,web-scraping,beautifulsoup,python-requests,Python,Selenium,Web Scraping,Beautifulsoup,Python Requests,我在搜集大学信息 在每个学院下方的网页上,只给出了一个课程名称,其余课程用JavaScript编写。 例如,增加13门课程+ 因此,当我使用请求时,无法获取他们的信息。获取(url) 我如何使用请求和BeautifulSoup获取这些细节? 我使用Anaconda Jupyter笔记本作为IDE 我听说过硒,但不知道。 由于Selenium有点重,因此是否有任何可能的lite替代方案可以一次加载所有JavaScript内容 我也听说过Splash框架。如果有人知道它以及如何将它与Python请求

我在搜集大学信息

在每个学院下方的网页上,只给出了一个课程名称,其余课程用JavaScript编写。 例如,增加13门课程+

因此,当我使用
请求时,无法获取他们的信息。获取(url)

我如何使用请求和BeautifulSoup获取这些细节? 我使用Anaconda Jupyter笔记本作为IDE

我听说过硒,但不知道。 由于Selenium有点重,因此是否有任何可能的lite替代方案可以一次加载所有JavaScript内容

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

我尝试过的事情

1.PyQt

参考:

根据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.loads()来自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)


DrySrape不适用于Windows

您不需要知道它的Javascript的功能。只需单击链接并使用浏览器检查器观察网络请求

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

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


我希望它能有所帮助。

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

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

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


我希望有帮助。

可能重复使用您的代码试用更新问题。@DebanjanB已使用我的代码试用更新问题。可能重复使用您的代码试用更新问题。@DebanjanB已使用我的代码试用更新问题。