这段代码使用 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()

代码优化建议:

  1. 使用更稳定的定位方式: 尽量使用 XPath 或 CSS 选择器来定位元素,避免使用类名等容易发生变化的属性。
  2. 添加错误处理机制: 代码中应该添加错误处理机制,例如使用 try-except 块来捕获异常,防止程序因为错误而崩溃。
  3. 添加日志记录: 将爬取过程中的信息记录到日志文件,方便调试和分析。
  4. 使用代理服务器: 使用代理服务器可以隐藏真实 IP 地址,避免被网站封禁。
  5. 设置爬取频率: 设置爬取频率,避免对目标网站造成过大的压力。

注意: 爬取网站数据需要遵守网站的 robots.txt 协议,避免违反网站的使用条款。

希望这篇文章对您有所帮助。如果您还有其他问题,请随时提出。

Python Selenium 爬取 1688 网站商品信息:代码解析与优化

原文地址: https://www.cveoy.top/t/topic/nTHp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录