Python Selenium 爬取 1688 网站商品信息:代码解析与优化
这段代码使用 Python 的 Selenium 库爬取 1688 网站的商品信息,包括商品名称、价格、销量、店铺链接和类别,并将数据存储到 CSV 文件中。
代码中定义了一个 driver_init() 函数,用于初始化 Chrome 浏览器驱动,并加载配置数据。然后使用 driver.get() 方法打开目标网页,使用 driver.implicitly_wait() 方法等待页面加载完毕。接着定义了一个 open_link() 函数,用于打开商品链接并获取商品信息。最后,在一个循环中遍历商品列表,依次打开商品链接并获取商品信息,将数据写入 CSV 文件中,并在控制台输出相关信息。最后关闭浏览器。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions
import csv
import datetime
# 行星减速器
url = 'https://s.1688.com/selloffer/offer_search.htm?keywords=%CD%BC%CA%E9&n=y&netType=1%2C11%2C16&spm=a260k.dacugeneral.search.0'
# 硬齿面减速机、行星减速机
url1 = 'https://s.1688.com/selloffer/offer_search.htm?keywords=%CD%BC%CA%E9&n=y&netType=1%2C11%2C16&spm=a260k.dacugeneral.search.0&beginPage=1&featurePair=1835%3A44231132%3B3310%3A23539333%3B9112%3A94585628'
def driver_init():
# 加载配置数据
c_option = webdriver.ChromeOptions()
c_option.add_argument('--profile-directory=Default')
c_option.add_argument('--disable-blink-features=AutomationControlled')
c_option.add_argument('--user-data-dir=C:/Temp/ChromeProfile')
c_option.add_argument('--ignore-certificate-errors-spki-list')
c_option.add_argument('--ignore-ssl-errors')
driver = webdriver.Chrome(chrome_options=c_option)
return driver
driver = driver_init()
driver.get(url1)
# 等待浏览器加载完毕
driver.implicitly_wait(7)
# 存放原始窗口句柄
original_window = driver.current_window_handle
# 打开链接获取商品信息
def open_link(link_a, driver):
# 点击链接
link_a.click()
# 等待浏览器加载完毕
driver.implicitly_wait(7)
# 获取所有窗口句柄
all_handles = driver.window_handles
# 切换到新窗口
for handle in all_handles:
if handle != original_window:
driver.switch_to.window(handle)
break
# 获取商品信息
goods_div = driver.find_elements(By.XPATH, '//div[@class='offer-attr-list']/div[@class='offer-attr-item']')
for span in goods_div:
name = span.find_element(By.CLASS_NAME, 'offer-attr-item-name').text
value = span.find_element(By.CLASS_NAME, 'offer-attr-item-value').text
print(f'{name}:{value}')
# 关闭当前窗口
driver.close()
# 切换回原来的窗口
driver.switch_to.window(original_window)
with open(f'./csv/1688_{datetime.date.today()}.csv', 'w', encoding='utf-8', newline='') as files:
# 设置表头并写入csv文件
csv_obj = csv.DictWriter(files, fieldnames=['平台','商品名称', '商品价格', '销量', '店铺链接','类别'])
csv_obj.writeheader()
# 获取商品信息的列表
goods_list = driver.find_element(By.ID, 'sm-offer-list').find_elements(By.CLASS_NAME, 'space-offer-card-box')
print('-----------------')
print('开始爬取数据,数据长度为:', len(goods_list))
for li in goods_list:
link_div = li.find_element(By.CLASS_NAME, 'mojar-element-title').find_element(By.TAG_NAME, 'a')
# 打开店铺获取商品信息
open_link(link_div, driver)
link = link_div.get_attribute('href')
title = li.find_element(By.CLASS_NAME, 'mojar-element-title').find_element(By.CLASS_NAME, 'title').text
price_div = li.find_element(By.CLASS_NAME, 'mojar-element-price')
price = price_div.find_element(By.CLASS_NAME, 'showPricec').text
sale_sum = price_div.find_element(By.CLASS_NAME, 'sale').text
print(f'商品名称:{title}, 商品价格:{price}, 销量:{sale_sum}')
# 写入csv文件
csv_obj.writerow({'平台':'1688','商品名称': title, '商品价格': price, '销量': sale_sum, '店铺链接': link,'类别':1})
print('-----------------')
print('爬取完毕!')
# 关闭浏览器
driver.quit()
代码优化建议:
- 使用更稳定的定位方式: 尽量使用 XPath 或 CSS 选择器来定位元素,避免使用类名等容易发生变化的属性。
- 添加错误处理机制: 代码中应该添加错误处理机制,例如使用
try-except块来捕获异常,防止程序因为错误而崩溃。 - 添加日志记录: 将爬取过程中的信息记录到日志文件,方便调试和分析。
- 使用代理服务器: 使用代理服务器可以隐藏真实 IP 地址,避免被网站封禁。
- 设置爬取频率: 设置爬取频率,避免对目标网站造成过大的压力。
注意: 爬取网站数据需要遵守网站的 robots.txt 协议,避免违反网站的使用条款。
希望这篇文章对您有所帮助。如果您还有其他问题,请随时提出。
原文地址: https://www.cveoy.top/t/topic/nTHp 著作权归作者所有。请勿转载和采集!