使用 BeautifulSoup 和 Selenium 抓取数据

Scraping data with BeautifulSoup and Selenium

我正在使用 BeautifulSoup 和 Selenium 提取网络数据(beautifulsoup 解析 HTML 页面,Selenium 单击“下一步”进入页面上的下一个项目列表).

我需要代码做的是:

  1. 获取当前 URL 并检索我要抓取的信息
  2. 单击“下一步”转到同一页中的下一页URL
  3. 从第 2 页检索信息
  4. 单击下一步转到第 3 页...

我当前的代码是:

  1. 获取当前 URL 并检索我要正确抓取的信息
  2. 点击下一步正确进入下一页(我可以在无头模式下看到这种情况)
  3. 仍在检索第 1 页的信息
  4. 点击下一步正确转到第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
    

(注意:我知道这是一个无限循环,我打算添加逻辑以知道何时完成所有页面)

对于这个简单的任务,您可以使用 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')