【发布时间】:2021-01-23 17:20:47
【问题描述】:
有谁知道如何在 Python 或 R 中使用 Selenium 在动态网页上自动抓取网页?
情况:
这个页面有几个下拉类别列表,每个类别列表都有几个选项,例如品牌是下拉类别列表之一,它有很多选项可供选择,例如 ALFA ROMEO、AUDI 等。其他类别列表也是如此。此外,要选择下一个类别列表的选项,必须首先选择上一个或第一个类别的选项。一旦选择了所有类别列表的选项,则下一阶段是单击“获取估值”按钮。它将输出给定表的信息。
目标:
目标是从表中获取所有选项的所有类别的所有信息,并将其存储为 .csv 格式。
屏幕截图 1(类别中的选项列表):
屏幕截图 2(输出):
问题:
我尝试创建一个逻辑,它可以单击每个类别并一次选择一个选项,然后继续选择下一个类别的选项。在流程结束时,它将单击提交按钮以获取评估信息。但是,如果给出了输入,我的脚本只能单击一个选项。然后,如果我想为所有类别选择下一个选项,我必须一遍又一遍地使用相同的脚本和不同的索引号输入(这指的是 id 的元素)。这将是一项乏味的非自动工作,如果有新更新的列表也可能成为问题。
要复制的代码示例:
import time
import requests
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver .support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
url = "https://www.carbase.my/tool/car-market-value-guide"
chrome_path = r"C:\Users\Noobie\Documents\utils\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
time.sleep(2)
driver.get(url)
def multi_define(driver, element_id, indexs):
select = Select(driver.find_element_by_id(element_id))
for index in indexs:
select.select_by_index(index)
elem_cat = ('brand','family','year','cc','transmission','variant')
multi_define(driver, elem_cat[0], '2')
multi_define(driver, elem_cat[1], '2')
multi_define(driver, elem_cat[2], '2')
multi_define(driver, elem_cat[3], '2')
multi_define(driver, elem_cat[4], '1')
multi_define(driver, elem_cat[5], '1')
driver.find_element_by_id("loan-calculate").click()
输出:
参考截图2
你们能否建议如何创建一个可以循环并为每个下拉列表选择不同选项并为下一个选项再次重复的脚本?
【问题讨论】:
-
您可以使用 rvest 包的 html_nodes(...) 函数来执行此操作。下拉列表中的每个项目都有一个 html“id”属性,它指向与该下拉项目关联的数据。我会使用 html_nodes(...) 函数来创建一个 id 列表,然后使用这些 id 来获取其余数据。看起来你很近。
标签: r python-3.x algorithm selenium web-scraping