用Selenium库自动化操作实现某宝的数据采集

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
随着时代的不断的进步,淘宝网站的反爬措施越来越强大,本文就介绍了如何使用Selenium库自动化操作淘宝搜索商品并抓取数据。


提示:以下是本篇文章正文内容,下面案例可供参考

一、了解利用Selenium库自动化操作时会遇到的反爬措施

1.登录账号

当我们点击搜索按钮后会跳转至登录界面,这是以为某宝为了反爬采取了必须登录账号才可以使用搜索功能,
使用登录账号是自动化操作不可避免的。

1.1.解决方案

使用Selenium库自动化操作实现输入你的账号(TAO_USERNAME)和密码(TAO_PASSWORD)以及点击登录按钮。
在这里插入图片描述

2.滑块验证

在这里插入图片描述
例如:
在这里插入图片描述

2.1.解决方案

这是一种某宝针对Selenium库自动化操作的反爬措施,这是你可以在执行自动化的网站按下F12键打开Console窗口再点击下面的眼睛按钮并输入window.navigator.webdriver
在这里插入图片描述
在这里插入图片描述
这时显示的结果是True,正常我们在浏览器中的结果是False,所以我们只需将True修改为False就可以跳过滑块验证了。

3.验证码验证

验证码验证是最后一个反爬措施了,但也是最麻烦的,当然这里还有其他的验证方式但相对而言验证码验证应该是最简单的了在这里插入图片描述
在这里插入图片描述

3.1.解决方案

我这里的建议是直接亲自完成这一步。(代码最好在点击登录按钮后面加上 time.sleep(60)保证自己有充足的时间完成这一步)

二、使用步骤

1.启用Chrome浏览器并避免浏览器的检测

代码如下(示例):

    driver = webdriver.Chrome(r'C:\Program Files\Google\Chrome\Application\chromedriver-win64\chromedriver.exe')
    #注意:这里的webdriver.Chrome()中的路径应当填写你的chromedriver.exe所在路径
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            Object.defineProperty(navigator, 'webdriver', {
              get: () => false
            })
          """
    })

这一行代码使用Chrome DevTools Protocol (CDP) 向浏览器发送一个命令,以在创建新文档时执行一段JavaScript代码。 CDP是一种允许开发者与浏览器进行通信的协议,可以用来执行各种浏览器相关的操作。
“source”: “”" Object.defineProperty(navigator, ‘webdriver’, { get: () => false }) “”":这是要执行的JavaScript代码。这段代码的作用是修改navigator.webdriver属性的行为,使其在访问时始终返回false。这是为了防止某些网站检测到浏览器正在使用Selenium WebDriver库,从而阻止用户访问该网站。

2.打开某宝的搜索页面

 driver.get('https://www.taobao.com/')
    driver.maximize_window()  # 最大化浏览器
    driver.implicitly_wait(10)  # 设置浏览器的隐式等待, 智能化的等待
    word=input("请输入搜索内容:")#本文章以红酒杯为例
    search_product(word)

3.编写搜索商品的功能函数search_product

首先我们要获取搜索框和搜索按钮的xpath路径:
在这里插入图片描述

第三步的图例:
在这里插入图片描述
搜索按钮的xpath路径也可以以此方式获取。

获取后的编写的search_product功能函数代码如下:

def search_product(keyword):
    # 输入框的标签对象
    driver.find_element(By.XPATH,'//*[@id="q"]').send_keys(keyword)
    # 为了避免被检测
    time.sleep(random.randint(1, 3))  # 随机休眠1到3秒
    driver.find_element(By.XPATH,'//*[@id="J_TSearchForm"]/div[1]/button').click()

4.编写登录的功能函数login

在这里插入图片描述

def login():
    driver.find_element(By.XPATH, '//*[@id="fm-login-id"]').send_keys(TAO_USERNAME)
    time.sleep(random.randint(1, 2))
    driver.find_element(By.XPATH, '//*[@id="fm-login-password"]').send_keys(TAO_PASSWORD)
    time.sleep(random.randint(1, 2))
    driver.find_element(By.XPATH, '//*[@id="login-form"]/div[6]/button').click()
    time.sleep(60)

5.爬取商品信息

具体细节我就不过多赘述了
在这里插入图片描述
代码采集的信息为图中红框范围

def parse_data():
    # 所有div标签
    divs = driver.find_elements(By.XPATH,'//*[@id="pageContent"]/div[1]/div[3]/div[3]/div/div')
    for div in divs:
        # 获取商品名称
        try:
            name = div.find_element(By.XPATH,'.//div[@class="Title--title--jCOPvpf "]//span').text
        except:
            name='无'
        # 获取商品价格
        try:
            price = div.find_element(By.XPATH,'.//div[@style="margin-right: 8px;"]//span').text
        except:
            price='无'
        # 获取商品购买人数
        try:
            number = div.find_element(By.XPATH,'.//span[@class="Price--realSales--FhTZc7U"]').text
        except:
            number='无'
        # 获取商品所属店铺
        try:
            shopname = div.find_element(By.XPATH,'.//div[@class="ShopInfo--TextAndPic--yH0AZfx"]//a').text
        except:
            shopname='无'
        f.write(f'{shopname},{name},{price},{number}\n')
        print(shopname,name,price,number)

6.存储爬取的信息

由于爬取的信息不算复杂就直接保存为CSV文件

    with open('红酒杯1.csv', 'w', encoding='utf-8') as f:
        f.write(f'店铺,商品名,价格,购买人数\n')
        search_product(word)

7.编写翻页的功能函数next_page

由于爬取的商品数据不止一页所以要实现翻页功能。

def next_page(page):
    for i in range(page):
        parse_data()
        driver.find_element(By.XPATH, '//*[@id="sortBarWrap"]/div[1]/div[2]/div[2]/div[8]/div/button[2]').click()
        time.sleep(5)

三. 成果展示

完整代码


import random
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 某宝账号
TAO_USERNAME='1111111111'#这里填写自己的淘宝账号
# 淘宝密码
TAO_PASSWORD='1111111111'#这里填写自己的淘宝密码

def next_page(page):
    for i in range(page):
        parse_data()
        driver.find_element(By.XPATH, '//*[@id="sortBarWrap"]/div[1]/div[2]/div[2]/div[8]/div/button[2]').click()
        time.sleep(5)


# 解析数据
def parse_data():
    # 所有div标签
    divs = driver.find_elements(By.XPATH,'//*[@id="pageContent"]/div[1]/div[3]/div[3]/div/div')
    for div in divs:
        # 获取商品名称
        try:
            name = div.find_element(By.XPATH,'.//div[@class="Title--title--jCOPvpf "]//span').text
        except:
            name='无'
        # 获取商品价格
        try:
            price = div.find_element(By.XPATH,'.//div[@style="margin-right: 8px;"]//span').text
        except:
            price='无'
        try:
            number = div.find_element(By.XPATH,'.//span[@class="Price--realSales--FhTZc7U"]').text
        except:
            number='无'
        try:
            shopname = div.find_element(By.XPATH,'.//div[@class="ShopInfo--TextAndPic--yH0AZfx"]//a').text
        except:
            shopname='无'
        f.write(f'{shopname},{name},{price},{number}\n')
        print(shopname,name,price,number)


def login():
    driver.find_element(By.XPATH, '//*[@id="fm-login-id"]').send_keys(TAO_USERNAME)
    time.sleep(random.randint(1, 2))
    driver.find_element(By.XPATH, '//*[@id="fm-login-password"]').send_keys(TAO_PASSWORD)
    time.sleep(random.randint(1, 2))
    driver.find_element(By.XPATH, '//*[@id="login-form"]/div[6]/button').click()
    time.sleep(60)

# 搜索商品
def search_product(keyword):
    # 输入框的标签对象
    driver.find_element(By.XPATH,'//*[@id="q"]').send_keys(keyword)
    # 为了避免被检测
    time.sleep(random.randint(1, 3))  # 随机休眠1到3秒
    driver.find_element(By.XPATH,'//*[@id="J_TSearchForm"]/div[1]/button').click()
    login()
    driver.find_element(By.XPATH,'//*[@id="sortBarWrap"]/div[1]/div[2]/div[1]/div[1]/span[1]//*[@id="J_InputSmall1"]').send_keys(100)
    driver.find_element(By.XPATH,'//*[@id="sortBarWrap"]/div[1]/div[2]/div[1]/div[1]/span[2]//*[@id="J_InputSmall1"]').send_keys(300)
    time.sleep(random.randint(1, 2))
    driver.find_element(By.XPATH, '//*[@id="sortBarWrap"]/div[1]/div[1]/div/div[1]/div/div/div/ul/li[4]/div').click()
    time.sleep(3)  # 随机休眠3秒
    next_page(page)

if __name__ == "__main__":
    driver = webdriver.Chrome(r'C:\Program Files\Google\Chrome\Application\chromedriver-win64\chromedriver.exe')
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            Object.defineProperty(navigator, 'webdriver', {
              get: () => false
            })
          """
    })
    '''
    这一行代码使用Chrome DevTools Protocol (CDP) 向浏览器发送一个命令,
    以在创建新文档时执行一段JavaScript代码。
    CDP是一种允许开发者与浏览器进行通信的协议,可以用来执行各种浏览器相关的操作。
    "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => false }) """:
    这是要执行的JavaScript代码。这段代码的作用是修改navigator.webdriver属性的行为,使其在访问时始终返回false。
    这是为了防止某些网站检测到浏览器正在使用Selenium WebDriver库,从而阻止用户访问该网站。
    '''
    driver.get('https://www.taobao.com/')
    driver.maximize_window()  # 最大化浏览器
    driver.implicitly_wait(10)  # 设置浏览器的隐式等待, 智能化的等待
    word="红酒杯"
    page=10
    with open('红酒杯1.csv', 'w', encoding='utf-8') as f:
        f.write(f'店铺,商品名,价格,购买人数\n')
        search_product(word)

运行结果展示

在这里插入图片描述
在这里插入图片描述

总结

整个编写过程中:
1.登录账号环节:
需要我们知道淘宝针对Selenium库自动化操作的一系列反爬措施并对此需要我们采取一系列针对措施来应对。
2.采集商品数据环节:
没什么突出的难点只要掌握基本的Selenium库使用方法即可解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值