Selenium爬取淘宝数据

使用Selenium抓取淘宝数据

淘宝的反扒措施太严格了。搞了半天没破解,最后使用使用所见即可爬的Selenium。
在正常浏览器打开淘宝在console面板输入window.navigator.webdriver,返回的时undefined,使用selenium驱动的浏览器同样的操作,返回的是True。可能是淘宝的反扒措施之一。

尝试了淘宝的登录页面,但是没有获取到“密码登录”的接口。
image.png
所以直接在程序运行过程中扫码登录。

定义一个登录方法login():
def login():
    logon_url = "https://login.taobao.com/"
    browser.get(logon_url)

    try:
        print("请扫码登录")
        time.sleep(10)
        # until()方法传入等待条件,presence_of_element_located()代表节点出现,其参数为节点的定位元祖。
        input = wait.until(EC.presence_of_element_located((By.XPATH, '//input[@id="q"]')))
        submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@class="btn-search tb-bg"]')))
        input.clear()
        input.send_keys(KEYWORD)
        submit.click()
        time.sleep(2)
        print("登录成功")
    except Exception as e :
        print("登录失败",e)

login方法的input ,submit 为搜索框和确定搜索按钮,获取到搜索框后往搜索框里输入文字(KEYWORD)即我们想要搜索的关键字,然后点击搜索按钮。

定义抓取商品信息的方法
def get_products(html):
    """
    抓取商品信息
    :return:
    """
    doc = pq(html)
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        product = {
            'image': item.find('.pic .img').attr('data-src'),
            'price': item.find('.price').text(),
            'deal': item.find('.deal-cnt').text(),
            'title': item.find('.title').text(),
            'shop': item.find('.shop').text(),
            'location': item.find('.location').text()
        }

这个方法里定义商品字段。接受的参数为html,即浏览器当前所在的页面。

定义一个循环逻辑的方法
def index_page():
    # 循环页数
    for i in range(2,11):
        html = browser.page_source
        get_products(html)

        print("正在翻页-------------")
        # 获取数字框,往里面写入数字,然后点击确定
        input = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="mainsrp-pager"]/div/div/div/div[2]/input')))
        input.clear()
        input.send_keys(i)
        # 确定按钮
        next = wait.until(EC.element_to_be_clickable((By.XPATH, '//span[@class="btn J_Submit"]')))
        next.click()
        print("翻页完成")
        time.sleep(3)

    print("请求完成!")

这个方法的input ,next 为翻页数字框与确定按钮。
image.png
获取到这个数字框,然后点击确定实现翻页操作。翻页之后将html代码作为参数传递给get_products()。
最后定义一个写入数据库的方法。
即可完成整个抓取过程。
完整代码如下:


# coding : utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import time
import pymysql

browser = webdriver.Chrome()
# 显示等待,指定最长等待时间
wait = WebDriverWait(browser, 10)
# 搜索关键字
KEYWORD = 'IPAD'
conn = pymysql.connect(
    host="localhost",
    database="test",
    user="root",
    password="root",
    port=3306,
    charset='utf8'
)
cursor = conn.cursor()

def login():
    logon_url = "https://login.taobao.com/"
    browser.get(logon_url)

    try:
        print("请扫码登录")
        time.sleep(10)
        # until()方法传入等待条件,presence_of_element_located()代表节点出现,其参数为节点的定位元祖。
        input = wait.until(EC.presence_of_element_located((By.XPATH, '//input[@id="q"]')))
        submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@class="btn-search tb-bg"]')))
        input.clear()
        input.send_keys(KEYWORD)
        submit.click()
        time.sleep(2)
        print("登录成功")
    except Exception as e :
        print("登录失败",e)

def index_page():
    # 循环页数
    for i in range(2,11):
        html = browser.page_source
        get_products(html)

        print("正在翻页-------------")
        # 获取数字框,往里面写入数字,然后点击确定
        input = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="mainsrp-pager"]/div/div/div/div[2]/input')))
        input.clear()
        input.send_keys(i)
        # 确定按钮
        next = wait.until(EC.element_to_be_clickable((By.XPATH, '//span[@class="btn J_Submit"]')))
        next.click()
        print("翻页完成")
        time.sleep(3)

    print("请求完成!")

def get_products(html):
    """
    抓取商品信息
    :return:
    """
    doc = pq(html)
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        product = {
            'image': item.find('.pic .img').attr('data-src'),
            'price': item.find('.price').text(),
            'deal': item.find('.deal-cnt').text(),
            'title': item.find('.title').text(),
            'shop': item.find('.shop').text(),
            'location': item.find('.location').text()
        }
        write(product)
        print("写入一条数据")

def write(info):
    sql = "insert into taobao_ipad (image,price,deal,title,shop,location)values (%s,%s,%s,%s,%s,%s);"
    cursor.execute(sql,(info["image"],info["price"],info["deal"],info["title"],info["shop"],info["location"]))

def main():

    login()
    index_page()

if __name__ == "__main__":
    main()
    conn.commit()

数据库显示如下:
image.png
抓取成功。变换关键字即可抓取不同的商品。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值