python - 无法点击下一页进行网页抓取
问题描述
我正在尝试从该网站http://sekolah.data.kemdikbud.go.id/抓取学校数据
我似乎无法找到一种方法来单击下一页以从其他页面加载条目。单击下一页时,URL 不会更改。不同页面的 HTML 代码如下所示:
<a href="javascript:void(0)" onclick="paging(2)">2</a>
这是我的代码:
from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import time
option = webdriver.ChromeOptions()
option.add_argument('--incognito')
webdriver = "/Users/rainer/Desktop/learnpython/web/chromedriver"
driver = Chrome(executable_path=webdriver, chrome_options=option)
url="http://sekolah.data.kemdikbud.go.id/"
driver.get(url)
WebDriverWait(driver,15).until(EC.element_to_be_clickable((By.XPATH,"//button[text()='Cari Sekolah']"))).click()
for i in range(2,15):
try:
WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.XPATH, "//ul[@id='list']//a[text()='" + str(i) + "']"))).click()
print("page number #" + str(i))
time.sleep(1)
except:
print("No such element")
break
解决方案
我执行了你的代码,它似乎工作正常。页面的 URL 没有变化,但页面上显示的学校实际上发生了变化。
看一下,我添加了打印学校名称的代码:
url="http://sekolah.data.kemdikbud.go.id/"
driver.get(url)
wait = WebDriverWait(driver,15)
wait.until(EC.element_to_be_clickable((By.XPATH,"//button[text()='Cari Sekolah']"))).click()
for i in range(2, 15):
try:
wait.until(EC.element_to_be_clickable((By.XPATH, "//ul[@id='list']//a[text()='" + str(i) + "']"))).click()
print("page number #" + str(i))
# Print school names to make sure they change per page
names = driver.find_elements(By.CSS_SELECTOR, 'ul > li.list-group-item:first-child a')
print([name.text for name in names])
time.sleep(2)
except Exception as e:
print(e)
break
输出:
page number #2
['(69839180) KELOMPOK BERMAIN KUSUMA HATI', '(K5660869) LKP ALVY', '(20103743) SMKS PGRI 1 JAKARTA', '(20269763) TK MARDI WALUYA']
page number #3
['(69990549) KB GENERASI CERDAS', '(69953341) KB HARAPAN BUNDA', '(P2965122) PKBM TELAGO', '(69930497) SPS ANGGREK']
page number #4
['(69877674) KB WADAH KASIH', '(20567521) TK AISYIYAH BUSTANUL ATHFAL', '(30406867) TK AISYIYAH BUSTANUL ATHFAL 2', '(69734039) TK PGRI TINGGAR']
...
所以看起来你仍然可以抓取数据并且一切都按预期工作。
希望这会有所帮助。如果您的代码输出不同,请告诉我。祝你好运。
推荐阅读
- php - 如何使用 PHP 和 MySQL 收集站点浏览量统计数据,例如每日、每周、每月和每年的浏览量?
- sql - Scala Slick Play 框架:如何使用 slick 3.x 连接多个数据库表?
- c# - 在 WPF 中,如何更新用户控件中的主 UI?
- xamarin - 保存选取器值空异常无法将字符串转换为模型
- python - 12296:26672:0420/163936.459:ERROR:browser_switcher_service.cc(238) XXX Init() Error in "Selenium Python"
- spring - @Autowired 对象未在包中实例化,但在不同包中不起作用
- skype - 如何将 Skype Web SDK 与 Skype(不是 Skype for Business)一起使用
- android - 无法使用匕首注入实例变量
- django - 为什么我不能对 Django 对象使用“.update()”?
- rust - 从 "reqwest" crate rust 发出 post 请求时,请求正文为空