selenium登录 爬取淘宝商品信息

淘宝网: 淘宝网是亚太地区较大的网络零售、商圈,由阿里巴巴集团在2003年5月创立。淘宝网 是中国深受欢迎的网购零售平台,拥有近5亿的注册用户数,每天有超过6000万的固定访客,同时每天的在线商品数已经超过了8亿件,平均每分钟售出4.8万件商品。随着淘宝网规模的扩大和用户数量的增加,淘宝也从单一的C2C网络集市变成了包括C2C、团购、分销、拍卖等多种电子商务模式在内的综合性零售商圈。目前已经成为世界范围的电子商务交易平台之一。

淘宝官网: https://taobao.com/

注册/登录淘宝: https://login.taobao.com/member/login.jhtml

操作环境: python3.6+jupyter notebook,win10,goole

技术难点:

  1. 模拟登录
  2. 跳过滑块验证

实现步骤讲解

1、模拟登录

1.1、为什么要模拟登录?

淘宝商城的商品信息可以说要比京东商城多一些保护,京东商城可以直接搜索商品进行下拉加载数据进行爬取信息,但是淘宝不让直接搜索商品,必须要登录后才能查看商品。

1.2、模拟登录方式
  1. 可以直接使用淘宝的账号登录
    直接使用淘宝账号登录,平时普通的登录可以直接登录,但是使用selenium模拟登录时需要进行进行滑块验证
  2. 支付宝登录
  3. 第三方登录(微博)
    需要进行验证码验证才能登录
  4. APP扫码登录
    也需要使用滑块验证,但是可以使用IP模拟用户访问跳过滑块
1.3、模拟扫码登录
    #跳过滑动验证
    chrome_option = webdriver.ChromeOptions()
    chrome_option.add_argument('--proxy--server=127.0.0.1:8080')#使用IP地址

2、选取爬取页数

2.1、为什么要选取爬取的页数,而不是全部爬取?
  • 淘宝使用模糊可重复搜索,随便提供一个词都可以查找的几十页的商品信息,后面的很多商品都会和前面的商品重复,全部爬取的数据价值不大。
  • 全部爬取技术更容易实现,学习的技术价值也不大。
  • 使用选取片段获取数据更方便
2.1、定点具体页数

搜索商品后,下拉网页到底部,我们可以看到进行切换页面的按钮
selenium登录 爬取淘宝商品信息_第1张图片
我们在这个框内输入要跳转到的页数,点击“确定”就可以跳转了。
实现逻辑: 找到搜索框—>清空—>输入数字—>确定

search = driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/input')#找到搜索框
time.sleep(2)
search.clear()#清空搜索框
time.sleep(1)
search.send_keys(num)#输入数字
driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/span[3]').click()#点击确定按钮
2.2、定点片段页数
global starPage
global endPage
starPage = int(input("请输入起始页数字:"))
endPage = int(input("请输入终止页数字:"))
def start():
    global starPage
    global endPage
    for num in range(starPage,endPage+1):
        print ("正在准备爬取第%s页"%num)
        spider()
        if num < endPage:
            nextPage()
def nextPage():
    print("点击下一页")
def spider():
    print("开始获取信息")
if __name__ == '__main__':    
    start()

逻辑结果:
selenium登录 爬取淘宝商品信息_第2张图片

3、源码汇总

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from lxml import etree
import time

things = input("请输入您要查询的商品:")
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('https://login.taobao.com/member/login.jhtml')
# 等待扫码登录
time.sleep(10)
def scan_login():
    #跳过滑动验证
    chrome_option = webdriver.ChromeOptions()
    chrome_option.add_argument('--proxy--server=127.0.0.1:8080')#使用代理IP,告诉服务器这是人为操作

    search = driver.find_element_by_xpath('//*[@id="q"]') #在kw内输入
    search.send_keys(things)#获取输入的商品
    time.sleep(2)
    search.send_keys(Keys.ENTER)#按回车 
    time.sleep(4)#大约加载4秒
    maxPage = driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[1]').text #查找到商品的最大页数
    print ("您所查询的商品",maxPage)
def start(starPage,endPage):#选择商品页数片段
    for num in range(starPage,endPage+1):        
        print ("正在准备爬取第%s页"%num)
        js="document.documentElement.scrollTop=4950"#下拉加载
        driver.execute_script(js)
        driver.implicitly_wait(5)
        search = driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/input')#获取输入页数框
        time.sleep(4)
        search.clear()#清空内容
        time.sleep(1)
        search.send_keys(num)
        time.sleep(3)
        spider()
        if num < endPage:#当输入页数小于终止页时可以跳转到下一页
            nextPage()
def nextPage():
        driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/span[3]').click()#点击确定,跳转页数
def spider():
    time.sleep(5)
    source = driver.page_source#获取网页源码
    html = etree.HTML(source)#解析源网页
    for et in html.xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div'):
        names = et.xpath('./div[2]/div[2]/a/text()')
        name = (str(names)).replace(" ","").replace("'","").replace(",","").replace("[\\n\\n\\n\\n","").replace("\\n]","").replace("[\\n\\n","")
        #//   双斜杠可以表明转译符
        price = et.xpath('./div[2]/div/div/strong/text()')
        buy = et.xpath('./div[2]/div[1]/div[2]/text()')
        store = et.xpath('./div[2]/div[3]/div[1]/a/span[2]/text()')
        location = et.xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[5]/div[2]/div[3]/div[2]/text()')
        print (name,price,buy,store,location,'\n')
        
if __name__ == '__main__':
    scan_login()
    starPage = int(input("请输入起始页数字:"))
    endPage = int(input("请输入终止页数字:"))
    start(starPage,endPage)

爬取部分结果:

你可能感兴趣的:(Python实战)