python+selenium实现淘宝商品数据半自动查询
背景
selenium库是一种模拟用户打开浏览器行为从而获取到所需的数据,相比于传统的通过接口爬取数据,这种爬虫方式更能突破反爬。因为很多商城类网站查数据的接口都会有签名,只有通过商城网站的前端才能生成签名,而selenium模拟用户打开浏览器就完美地解决了该问题。
业务流程
- 首先是调库方法打开浏览器并访问某个网站。
- F12查看标签,找到搜索框,搜索按钮以及所要获取的数据所在的标签。
- (设置等待,等待页面加载)
- 通过代码选中搜索框标签
- 给搜索框标签填充值
- 获取搜索按钮标签并调用鼠标库调用鼠标左键点击搜索
- (设置等待,等待页面加载)
- 调用分析HTML的方法解析前端代码
- 获取所需数据的标签并调用方法获取其中的值
- 将值存储到excel中
详细实现分析
主要使用的类库
selenium,ActionChains(鼠标操作),webdriver(浏览器),keys(键盘按键)
from time import sleep
import openpyxl
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
from openpyxl import load_workbook# 查询淘宝
def queryTaoBao(productName):# 声明浏览器驱动browser = webdriver.Chrome()taobao = browser.get("http://www.taobao.com")# 等待搜索框加载完成并获取该元素input_element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))# 等待搜索按钮可点击并获取该元素(定位id为J_TSearchForm的元素的class为search-button的div子元素的button子标签)search_button = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button")))# 输入要搜索的关键字input_element.send_keys(productName)# 点击搜索按钮search_button.click()#因为要登陆,所以睡15秒,期间可以手动操作登录sleep(15)# 获取加载完成的网页代码html = browser.page_source# 利用pyquery解析网页代码doc = pq(html)# 获取所有的商品信息的列表items = doc(".Card--doubleCard--wznk5U4").items()arr = []for item in items:product = [item.find(".Price--priceInt--ZlsSi_M").text() + item.find(".Price--priceFloat--h2RR0RK").text(),item.find(".ShopInfo--shopName--rg6mGmy").text()]print(product)arr.append(product)return arr# 往excel续写数据
def add_data(file_name, list):wb = load_workbook(file_name)ws = wb.activefor row in list:ws.append(row)wb.save(file_name)if __name__ == '__main__':arr=queryTaoBao("奥利奥")#因为是续写,所以需要提前创建好文件add_data("E:\\excel\\testexcel.xlsx",arr)