from selenium import webdriver
import time
import urllib
import os
from urllib.request import urlretrieve
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
from selenium.webdriver import ChromeOptions
import datetime
日期 = []
产品 = []
平台 = []
店铺 = []
链接 = []
品牌 = []
系列 = []
颜色 = []
页面价 = []
活动1 = []
活动2 = []
到手价 = []
图片 = []
today = datetime.datetime.now().strftime('%Y-%m-%d')
def find_elements_by_xpath(driver, xpath, findtime=5):
"""
显示等待
:param driver: 驱动
:param xpath: 路径
:param findtime: 最长等待时间
:return:
"""
WebDriverWait(driver, int(findtime), 0.5).until(
EC.presence_of_all_elements_located((By.XPATH, xpath)))
return driver.find_elements_by_xpath(xpath)
def find_element_by_xpath(driver, xpath, findtime=5):
"""
显示等待
:param driver: 驱动
:param xpath: 路径
:param findtime: 最长等待时间
:return:
"""
WebDriverWait(driver, int(findtime), 0.5).until(
EC.presence_of_element_located((By.XPATH, xpath)))
return driver.find_element_by_xpath(xpath)
def excel_file_read(file_name, data='链接'):
"""
:param file_name: 要读取的文件名
:param data: 要读取的列
:return:返回对应列值
"""
df = pd.read_excel(r'{}.xlsx'.format(file_name))
len_df = df[data].values
return len_df
def excel_file_write():
"""
:return:
"""
# 将以下数据写入字典
df = pd.DataFrame({
'日期': 日期,
'产品': 产品,
'平台': 平台,
'店铺': 店铺,
'链接': 链接,
'品牌': 品牌,
'系列': 系列,
'颜色': 颜色,
'页面价': 页面价,
'活动1': 活动1,
'活动2': 活动2,
'到手价': 到手价
})
# 将数据传入Excel并保存
df.to_excel(today + '商品信息.xlsx')
def down_photo():
try:
len_photo = excel_file_read(f'{today}图片链接') # 读取Excel
len_photo1 = excel_file_read(f'{today}图片链接', "系列") # 读取Excel
# 遍历图片链接
for count in range(0, len(len_photo)):
try:
os.makedirs(today)
except:
pass
# 请求网址,将图片保存至本地
"""
参数1:第几个链接
参数2:保存路径
"""
urllib.request.urlretrieve(len_photo[count],
r'{}\{}.jpg'.format(today, str(count) + "_" + str(len_photo1[count])))
except:
pass
def login(driver, su=1):
try:
time.sleep(3)
driver.switch_to.frame(
find_element_by_xpath(driver, '//*[@id="sufei-dialog-content"]')
)
if su == 1:
while True:
try:
assert '密码登录' in driver.page_source
find_element_by_xpath(driver, '//*[@id="sufei-dialog-close"]')
time.sleep(3)
except:
print("关闭登录...")
break
else:
button = 'document.querySelector("#login > div.corner-icon-view.view-type-qrcode > i").click()'
driver.execute_script(button)
while True:
try:
assert '密码登录' in driver.page_source
print("请扫码登录...")
time.sleep(3)
except:
print("成功登录...")
break
while True:
try:
assert 'Hi,' in driver.page_source
break
except:
print("请在手机再次确认")
time.sleep(3)
driver.switch_to.default_content()
except:
pass
def test_main():
try:
len_df = excel_file_read('天猫') # 读取Excel
# print(len_df)
driver = startup() # 启动Chrome driver 防止天猫检测
time.sleep(3)
for q in range(0, len(len_df)):
url = len_df[q]
time.sleep(3)
driver.get(url) # 请求地址
# login(driver) # 免登陆处理
# 获取所有商品种类
all_types = find_elements_by_xpath(driver, '//*[@data-property="颜色分类"]/li')
# print(len(all_types))
for k in range(1, len(all_types) + 1):
日期.append(today)
平台.append("天猫")
链接.append(driver.current_url)
店铺名称 = find_element_by_xpath(driver, '//*[@class="slogo-shopname"]/strong')
店铺名称 = str(店铺名称.text)
店铺.append(店铺名称)
print('店铺:' + 店铺名称)
颜色分类 = find_element_by_xpath(driver, f'//*[@data-property="颜色分类"]/li[{k}]/a/span')
颜色分类1 = str(颜色分类.text)
颜色.append(颜色分类1)
print(颜色分类1)
try:
颜色分类.click()
except:
df = pd.DataFrame({
'日期': 日期,
'产品': 产品,
'平台': 平台,
'店铺': 店铺,
'链接': 链接,
'颜色': 颜色
})
df.to_excel(today + '_Error_未获取到的商品信息.xlsx')
continue
系列名称 = find_element_by_xpath(driver, '//*[@class="tb-detail-hd"]/h1')
系列名称 = str(系列名称.text)
系列.append(系列名称)
print(系列名称)
图片链接 = find_element_by_xpath(driver, '//*[@id="J_ImgBooth"]')
图片链接 = 图片链接.get_attribute('src')
图片.append(图片链接)
df = pd.DataFrame({
'链接': 图片,
'系列': 系列
})
df.to_excel(today + '图片链接.xlsx')
print(图片)
价格 = find_element_by_xpath(driver, '//*[.="价格"]/following-sibling::dd/descendant::*[@class="tm-price"]')
价格 = str(价格.text)
页面价.append(价格)
print('价格:' + 价格)
try:
促销价 = find_element_by_xpath(driver,
'//*[.="促销价"]/following-sibling::dd/descendant::*[@class="tm-price"]')
促销价 = str(促销价.text)
到手价.append(促销价)
print('促销价:' + 促销价)
except:
到手价.append(价格)
print('促销价:' + 价格)
try:
本店活动1 = find_element_by_xpath(driver, '//*[.="本店活动"]/following-sibling::dd')
本店活动1 = str(本店活动1.text)
活动1.append(本店活动1)
print('本店活动1:' + 本店活动1)
except:
活动1.append("无")
try:
本店活动2 = find_element_by_xpath(driver, '//*[@class="restrict"]')
本店活动2 = str(本店活动2.text)
活动2.append(本店活动2)
print('本店活动2:' + 本店活动2)
except:
活动2.append("无")
品牌名称 = find_element_by_xpath(driver, '//*[contains(text(),"品牌:")]')
品牌名称 = str(品牌名称.text)
品牌.append(品牌名称.replace("品牌:", ""))
print(品牌名称)
产品名称 = find_element_by_xpath(driver, '//*[contains(text(),"产品名称:")]')
产品名称 = str(产品名称.text)
产品.append(产品名称.replace("产品名称:", ""))
print(产品名称)
excel_file_write() # 将商品信息写入Excel
except Exception as msg:
print(msg)
raise
finally:
down_photo() # 将图片从网上下载下来
print("程序执行完成")
def startup():
"""
sta.bat文件内容: chrome.exe -remote-debugging-port=9222
"""
os.system('start sta.bat') # 调用bat文件
option = ChromeOptions()
# 绕过天猫检测
option.debugger_address = "127.0.0.1:9222" # 接管谷歌浏览器
driver = webdriver.Chrome(options=option) # 在调用浏览器驱动时传入
driver.maximize_window()
# 隐式等待3秒
driver.implicitly_wait(3)
return driver
if __name__ == '__main__':
test_main()
【本博客仅供学习参考】python+selenium接管浏览器获取数据
于 2021-08-14 23:33:54 首次发布