使用 BeautifulSoup 和 Selenium 抓取数据
Scraping data with BeautifulSoup and Selenium
我正在使用 BeautifulSoup 和 Selenium 提取网络数据(beautifulsoup 解析 HTML 页面,Selenium 单击“下一步”进入页面上的下一个项目列表).
我需要代码做的是:
- 获取当前 URL 并检索我要抓取的信息
- 单击“下一步”转到同一页中的下一页URL
- 从第 2 页检索信息
- 单击下一步转到第 3 页...
我当前的代码是:
- 获取当前 URL 并检索我要正确抓取的信息
- 点击下一步正确进入下一页(我可以在无头模式下看到这种情况)
- 仍在检索第 1 页的信息
- 点击下一步正确转到第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')
我正在使用 BeautifulSoup 和 Selenium 提取网络数据(beautifulsoup 解析 HTML 页面,Selenium 单击“下一步”进入页面上的下一个项目列表).
我需要代码做的是:
- 获取当前 URL 并检索我要抓取的信息
- 单击“下一步”转到同一页中的下一页URL
- 从第 2 页检索信息
- 单击下一步转到第 3 页...
我当前的代码是:
- 获取当前 URL 并检索我要正确抓取的信息
- 点击下一步正确进入下一页(我可以在无头模式下看到这种情况)
- 仍在检索第 1 页的信息
- 点击下一步正确转到第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')