我正在使用 BeautifulSoup 和 Selenium 來提取 Web 資料(beautifulsoup 來決議 HTML 頁面和 Selenium 來單擊 Next 以獲取頁面上的下一個專案串列)。
我需要代碼做的是:
- 獲取當前 URL 并檢索我要抓取的資訊
- 單擊下一步轉到同一 URL 中的下一頁
- 從第 2 頁檢索資訊
- 點擊下一步進入第3頁...
我當前的代碼正在做的是:
- 獲取當前 URL 并檢索我希望正確抓取的資訊
- 單擊下一步以正確轉到下一頁(我可以在無頭模式下看到這種情況)
- 仍在從第 1 頁檢索資訊
- 點擊next正確跳轉到第3頁
我認為這是因為我在代碼中以錯誤的順序使用了一些步驟。下面是一個精簡版。我做錯了什么可見嗎?
import requests
from bs4 import BeautifulSoup
from csv import writer
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time
from selenium.webdriver.common.by import By
URL = "https://www.theitdepot.com/products-Motherboards_C13.html"
wd = webdriver.Chrome(ChromeDriverManager().install())
wd.get(URL)
running = True
while running:
page = requests.get(URL, verify = False)
soup = BeautifulSoup(page.content, "html.parser")
results = soup.find(id="filter_display")
item_elements = results.find_all("div", class_="product-details text-md-left flex-grow-1")
with open('data.csv', 'a', encoding='utf8', newline='') as f:
thewriter = writer(f)
for item_element in item_elements:
#code to retrieve information and write to CSV here
name_element = item_element.find("div", class_="card-text px-2 py-1 font-size85 product_title")
name = str(name_element.text)
print (name)
next = wd.find_element(by=By.XPATH, value="//*[contains(text(), 'Next →')]")
wd.execute_script("arguments[0].click();", next)
time.sleep(10) #prevent ban
(注意:我知道這目前是一個無限回圈,我打算添加邏輯以知道所有頁面何時完成)
uj5u.com熱心網友回復:
對于這個簡單的任務,您可以使用 Selenium 本身而不是 BeautifulSoup。此外,您可以將產品名稱保存在串列中并使用numpy. 我更喜歡 numpy,因為它可以讓您用with open(...) as f: etc.簡單的行替換代碼塊。
number_of_pages_to_scrape = 5
names = []
for i in range(number_of_pages_to_scrape):
items = driver.find_elements(By.CSS_SELECTOR, "div[class='card-text px-2 py-1 font-size85 product_title']")
for item in items:
print(item.text)
names.append(item.text)
driver.find_element(By.XPATH, "//*[contains(text(), 'Next')]").click()
time.sleep(10)
import numpy
numpy.savetxt("data.csv", names, fmt ='%s')
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/474366.html
