提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
随着时代的不断的进步,淘宝网站的反爬措施越来越强大,本文就介绍了如何使用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功能函数代码如下:
defsearch_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
deflogin():
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.爬取商品信息
具体细节我就不过多赘述了
代码采集的信息为图中红框范围
defparse_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文件
withopen('红酒杯1.csv','w', encoding='utf-8')as f:
f.write(f'店铺,商品名,价格,购买人数\n')
search_product(word)
7.编写翻页的功能函数next_page
由于爬取的商品数据不止一页所以要实现翻页功能。
defnext_page(page):for i inrange(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'#这里填写自己的淘宝密码defnext_page(page):for i inrange(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)# 解析数据defparse_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)deflogin():
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)# 搜索商品defsearch_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=10withopen('红酒杯1.csv','w', encoding='utf-8')as f:
f.write(f'店铺,商品名,价格,购买人数\n')
search_product(word)
运行结果展示
总结
整个编写过程中:
1.登录账号环节:
需要我们知道淘宝针对Selenium库自动化操作的一系列反爬措施并对此需要我们采取一系列针对措施来应对。
2.采集商品数据环节:
没什么突出的难点只要掌握基本的Selenium库使用方法即可解决。
版权归原作者 昙花无现 所有, 如有侵权,请联系我们删除。