使用selenium爬取淘宝商品评论数

第一部分:登陆并进入淘宝首页

import time
import random
import undetected_chromedriver as uc  # 正确的导入方式
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

# 设置 Chrome 浏览器选项
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")  # 禁用自动化检测
options.add_argument("start-maximized")  # 窗口最大化
options.add_argument("disable-infobars")  # 禁用信息栏
options.add_argument("--disable-extensions")  # 禁用扩展
# 如果你不想显示浏览器窗口,使用无头模式
# options.add_argument("--headless")

# 使用 undetected-chromedriver 启动浏览器,绕过反爬虫机制
driver = uc.Chrome(options=options)

print("正在加载网站!")
print("加载中...........................")
# 打开淘宝登录页面
driver.get('https://login.taobao.com/')
# 设置显式等待,最多等待 30 秒
wait = WebDriverWait(driver, 30)

print("网站加载完成!")
print("正在加载二维码!")
print("加载中...........................")

# 使用随机等待时间避免被检测
def random_sleep(min_seconds, max_seconds):
    time.sleep(random.uniform(min_seconds, max_seconds))

try:
    # 等待二维码元素加载,假设二维码的 ID 是 'qrcode-img'(确认二维码 ID 正确)
    qr_code = wait.until(EC.presence_of_element_located((By.ID, 'qrcode-img')))
    print("二维码已加载,等待扫码登录...")

    # 模拟用户滚动行为:在等待过程中滚动页面,模拟用户活动,防止被检测为自动化脚本
    for _ in range(5):
        driver.execute_script("window.scrollBy(0, 100);")  # 向下滚动页面
        random_sleep(1, 2)  # 每次滚动后暂停1-2秒

    # 等待人工扫码登录,最多等待 300 秒
    print("请在 180 秒内扫码登录! 并在扫码登录成功后手动切换到首页!")
    print("正在人工登录中....")
    print("等待首页用户Id元素出现中....")
    print("等待中.........................................")
    random_sleep(5, 10)  # 稍微延时,防止反爬虫检测过快
    time.sleep(180)  # 等待扫码登录

    # 确认扫码后页面元素加载,确认登录成功
    wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'user')))   # 查看首页用户Id元素是否出现在DOM容器
    print("首页用户Id元素出现在DOM容器,登录成功,进入淘宝首页!")

    # 获取当前页面的URL
    current_url = driver.current_url  # 获取当前页面 URL
    print("当前页面[首页] URL:", current_url) # 出现的是首页的url

第二部分:手动跳转到商品链接,然后采集数据的源码保存到HTML文件中,以便提取数据

    # 手动跳转到新页面
    print("在180秒手动跳转需要的新页面!并手动点击全部评论 !")
    time.sleep(180) # 观察登录是否成功!

    # 模拟鼠标滚动,加载全部评论
    print("模拟鼠标滚动,加载全部评论!")
    print("模拟中.................")
    # 初始化 ActionChains
    actions = ActionChains(driver)
    # 将鼠标移动到指定位置 (x, y)
    actions.move_by_offset(10, 10).perform()
    # 暂停一下,模拟人的操作
    time.sleep(random.uniform(0.5, 1.5))

    # 定位 class 为 comments--vOMSBfi2 beautify-scroll-bar 的 div 元素
    div_element = driver.find_element_by_xpath("//div[@class='content--ew3Y4lVg']//div[@class='comments--vOMSBfi2 beautify-scroll-bar']")

    # 模拟鼠标滚动,加载全部评论
    for i in range(30):
        # 随机生成滚动的距离,模拟人操作的不规律性8
        scroll_distance = random.randint(100, 300)
        # 使用 JavaScript 滚动 div 元素
        driver.execute_script(f"arguments[0].scrollTop += {scroll_distance};", div_element)
        # 暂停一段时间,模拟人操作的延迟
        time.sleep(random.uniform(0.5, 1.5))

    time.sleep(10)
    print("模拟完成!")
    print("自动滚动完成!开始人工查看!【是否加载完全部评论】如果没有请在10秒内手动滚动,以加载全部数据!")

    # 获取当前页面的 HTML 内容和 URL
    page_source = driver.page_source  # 获取页面源码
    current_url = driver.current_url  # 获取当前页面 URL
    # print("页面源码:\n", page_source)
    print("当前页面 URL:", current_url)
    # 获取到页面源码之后保存起来,以便获取评论数据
    with open('淘宝商品链接评论数据.html','w',encoding="utf-8") as f:
        f.write(page_source)
    print("数据爬取成功!")
    print("数据[页面源码]已保存到"+"淘宝商品链接评论数据.html"+"文件中!")

except Exception as e:
    print(f"发生错误: {e}")
finally:
    # 关闭浏览器
    driver.quit()

第三部分:从源码从提取评论数据【日期,评论】,保存到csv文件

import csv
import logging
from lxml import etree
from datetime import datetime


def setup_logging():
    # 设置日志配置,只记录错误信息
    logging.basicConfig(level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')


def parse_date(date_str):
    # 将日期字符串转换为 datetime 对象
    try:
        # 这里假设日期字符串格式为 "2024年12月10日",请根据实际情况修改格式
        return datetime.strptime(date_str, "%Y年%m月%d日")
    except ValueError as e:
        logging.error(f"日期转换错误: {e}")
        return None


def write_to_csv(file_name, data_list):
    unique_data = set()  # 存储唯一的数据
    sorted_data = []  # 存储最终排序后的数据
    with open(file_name, "w", encoding="utf-8-sig", newline='') as file:
        writer = csv.writer(file)
        writer.writerow(["日期", "评论"])  # 写入表头
        for data in data_list:
            try:
                # 提取日期信息
                date_text = data.xpath(".//div[@class='meta--TDfRej2n']/text()")
                date = date_text[0].split("·")[0].strip() if date_text else ""
                # 提取评论信息
                comment_text = data.xpath(".//div[@class='content--FpIOzHeP']/text()")
                comment = comment_text[0] if comment_text else ""
                # 检查数据是否重复
                if (date, comment) not in unique_data:
                    unique_data.add((date, comment))
                    sorted_data.append((date, comment))
            except (IndexError, AttributeError) as e:
                logging.error(f"解析某条评论信息时出错:{e}")
        # 对数据按日期排序
        sorted_data.sort(key=lambda x: parse_date(x[0]) if parse_date(x[0]) else datetime.min)
        for date, comment in sorted_data:
            # 写入 CSV 文件
            writer.writerow([date, comment])
        print(f"最终结果的数据条数: {len(sorted_data)}")

def main():
    setup_logging()
    # 读取爬取的文件数据
    with open('淘宝商品链接评论数据.html', 'r', encoding='utf-8') as f:
        html = f.read()
    # 使用 lxml.etree.HTML 解析 HTML 内容
    html_tree = etree.HTML(html)
    # 批量提取评论数据
    data_list = html_tree.xpath("//div[@class='Comment--KkPcz74T']")
    print(f"成功提取 {len(data_list)} 条评论信息!")
    # 保存到文件
    file_name = "淘宝商品评论数据.csv"
    write_to_csv(file_name, data_list)
    print("数据提取成功!已保存到{}!".format(file_name))

if __name__ == "__main__":
    main()



第四部分:数据结果展示

使用 Selenium 自动化爬取淘宝商品详情据可以分为以下步骤: 1. 安装 Selenium 和浏览器驱动:SeleniumPython 中用于自动化 Web 浏览器的库,需要安装;同时需要下载对应浏览器的驱动程序,如 ChromeDriver。 2. 打开浏览器并访问淘宝网站:使用 Selenium 打开指定的浏览器并访问淘宝网站。 3. 搜索关键字并获取搜索结果:在搜索框中输入关键字并点击搜索按钮,等待搜索结果加载出来,使用 Selenium 获取搜索结果页面的 HTML 代码。 4. 解析搜索结果页面:使用 BeautifulSoup 解析搜索结果页面,获取每个商品的链接。 5. 进入商品详情页面并获取据:遍历每个商品的链接,使用 Selenium 进入商品详情页面并获取需要的据,如商品标题、价格、评论、销量等。 6. 存储据:将获取到的据存储到据库或文件中。 下面是一个示例代码: ```python from selenium import webdriver from bs4 import BeautifulSoup import time # 设置浏览器驱动路径 driver_path = './chromedriver.exe' # 创建浏览器对象 browser = webdriver.Chrome(driver_path) # 设置搜索关键字 keyword = '手机' # 访问淘宝网站 browser.get('https://www.taobao.com/') # 等待页面加载完成 time.sleep(3) # 找到搜索框并输入关键字 browser.find_element_by_name('q').send_keys(keyword) # 点击搜索按钮 browser.find_element_by_class_name('btn-search').click() # 等待搜索结果加载完成 time.sleep(5) # 获取搜索结果页面的 HTML 代码 html = browser.page_source # 使用 BeautifulSoup 解析搜索结果页面 soup = BeautifulSoup(html, 'html.parser') # 获取所有商品的链接 links = [] for item in soup.find_all('a', class_='J_ClickStat'): link = item.get('href') if link.startswith('https://'): links.append(link) # 遍历每个商品的链接并获取据 for link in links: # 进入商品详情页面 browser.get(link) # 等待页面加载完成 time.sleep(3) # 获取商品标题 title = browser.find_element_by_xpath('//h3[@class="tb-main-title"]/text()') # 获取商品价格 price = browser.find_element_by_xpath('//div[@class="tb-property-cont"]/div[@class="tb-detail-price"]/span[@class="tb-price"]/text()') # 获取商品评论 comment_count = browser.find_element_by_xpath('//div[@class="tb-rate-counter"]/span[@class="tm-count"]/text()') # 获取商品销量 sales_volume = browser.find_element_by_xpath('//div[@class="tb-sales-counter"]/span[@class="tm-count"]/text()') # 打印商品信息 print('标题:', title) print('价格:', price) print('评论:', comment_count) print('销量:', sales_volume) # 关闭浏览器 browser.quit() ``` 需要注意的是,使用自动化爬取据容易被网站识别为机器行为,可以添加一些随机等待时间、请求头伪装等方式来降低被识别的概率。同时,爬取据时也需要遵守网站的爬虫规则,如不过度频繁访问、不采集敏感信息等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值