我正在刮取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请求和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列(char 3)
第3。来自json模块的json.loads()
Inspection Details on clicking
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列(char 3)
DRYSCRAPE不适用于Windows
答案 0 :(得分:2)
您无需知道其Javascript的功能。只需单击该链接并使用浏览器检查器观察网络请求。
在您的特定情况下,Javascript向“/ nationalCategoryList / NationalCategoryList / loadMoreCourses /”发送POST请求。因此,您可以发送相同的请求,然后您将获得一个新的HTML字符串。您可以使用BeautifulSoup解析该字符串并获取所需的数据。
上面还有一个额外的步骤,因为POST请求需要一个指定参数的有效负载。您应该能够在原始页面中找到这些参数。找到它们之后,您可以查看它们周围的HTML元素,并使用BeautifulSoup来提取它们,或者使用正则表达式来查找它们。
我希望它有所帮助。