首页 > 其他分享 >selenium获取淘宝内容

selenium获取淘宝内容

时间:2024-01-10 13:34:15浏览次数:25  
标签:xpath name random selenium 获取 names 淘宝 print div

淘宝的反爬非常厉害,即使模拟了浏览器,仍然会有一大堆验证流程,首先声明这里只是实现了可用的代码,并不实用。

下面是一段示例代码,用于模拟爬取淘宝特定关键词下,按销量排序,商品的价格、店名等数据:

在开始之前,要下载谷歌浏览器和对应的webdriver,Python、以及Python安装selenium,这句话仅用于提示新手。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from lxml import etree
import time
import random
import os


def get_all_name_prices_sells(html):
    # 一页50个
    xpath_name = '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[3]/div/div[%d]/a/div/div[1]/div[2]/div/span//text()'
    xpath_prices_int = '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[3]/div/div[%d]/a/div/div[1]/div[3]/span[2]/text()'
    xpath_prices_float = '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[3]/div/div[%d]/a/div/div[1]/div[3]/span[3]/text()'
    xpath_sells = '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[3]/div/div[%d]/a/div/div[1]/div[3]/span[4]/text()'
    xpath_shop_name = '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[3]/div/div[%d]/a/div/div[3]/div[1]/a/text()'

    data = []
    t = etree.HTML(html)
    for i in range(50):
        name = t.xpath(xpath_name % i)
        pi, pf = t.xpath(xpath_prices_int % i), t.xpath(xpath_prices_float % i)
        sell_num = t.xpath(xpath_sells % i)
        shop_name = t.xpath(xpath_shop_name % i)
        if all([name, pi, pf]):
            data.append([''.join(name), pi[0]+pf[0], sell_num[0][:-3] if sell_num else '', shop_name[0]])

    return data


def get_tb_by_word(d, name, pages=3, ):
    driver.get('https://s.taobao.com/search?q='+name)
    data = []
    # d.find_element('xpath', '//*[@id="q"]').send_keys(name)  # 搜索框
    # d.find_element('xpath', '//*[@id="J_TSearchForm"]/div[1]/button').click()  # 搜索按钮

    time.sleep(0.3+0.3*random.random())

    d.find_element('xpath', '//*[@id="sortBarWrap"]/div[1]/div[1]/div/div[1]/div/div/div/ul/li[2]/div').click()  # 按销量排序

    time.sleep(0.3+0.3*random.random())

    for i in range(pages):
        d.find_element('xpath', '//body').send_keys(Keys.END)
        time.sleep(0.3+0.3*random.random())
        data_in1 = get_all_name_prices_sells(d.page_source)
        data += data_in1
        if i < pages - 1:
            # 下一页
            try:
                next_page_bt = d.find_element('xpath', '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/button[2]')
                d.execute_script('window.scrollBy(0, -500)')
                next_page_bt.click()
                time.sleep(0.7+0.5*random.random())
            except:
                # 没有下一页
                break

    return data


names = ["笔记本", "风油精"]  # 要搜索的关键词if __name__ == '__main__':
    fn = 'tb_prices.tsv'driver = webdriver.Chrome()

    idx = 0
    _continue = False

    if os.path.exists(fn):
        ls = open(fn, encoding='utf-8').read().split('\n')[:-1]
        if len(ls) > 1:
            last = ls[-1].split('\t')[0]
            idx = names.index(last)
            print('last:', last, 'idx:', idx)
            _continue = True

    names = names[idx:]
    print('前三个:', names[:3])

    if _continue:
        fw = open(fn, 'a', encoding='utf-8')
        print('继续:', last)
    else:
        fw = open(fn, 'w', encoding='utf-8')
        fw.write('\t'.join(['品类', '商品名', '价格', '销量', '店名']) + '\n')
        print('全新开始')

    while True:
        try:
            for word in names:
                print(word)
                da = get_tb_by_word(driver, word)
                for items in da:
                    fw.write('\t'.join([word]+items)+'\n')
                if names:
                    names = names[1:]
        except Exception as e:
            print(str(e))
            if input('是否完成?\n') == '1':
                print('break')
                break
            else:
                print('continue')
            # driver.close()
            # print('等待3分钟重试')
            # time.sleep(60*3)
            # driver = webdriver.Edge()

多次(十几次)使用后,触发淘宝验证机制,每次验证结束后,就在cmd窗口输入换行,继续爬取,如果要结束就输入1加换行。

第一个会遇到的验证窗口是这样的:

 如果是上面的代码,淘宝能识别selenium打开的浏览器,这里就会一直报错:点击框体重试

 这时候就要用命令行手动打开浏览器,再用selenium的debug模式控制浏览器

命令行(先转到浏览器文件所在目录):

start chrome.exe --remote-debugging-port=9222

此时打开了一个浏览器窗口

再将上面代码中的

driver = webdriver.Chrome()

替换为以下几行:

chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(options=chrome_options)

这样,虽然淘宝还是偶尔报错,但至少能通过。

这里有个小诀窍,就是滑块要慢慢滑到右边试探,但不要到底,这样更容易通过。

 

这种验证多了以后,会出现另一种识别图像的验证,让你拉一条线,直到识别到它要求的物体为止。

这种验证对于真人来说是没有难度的。

后面主要的问题是,每搜索3个,甚至1个关键词,它就要跳出第一种验证窗口,而且通过的概率大大降低,非常折磨人,建议等待几分钟后再爬。

 

标签:xpath,name,random,selenium,获取,names,淘宝,print,div
From: https://www.cnblogs.com/roundfish/p/17956284

相关文章

  • 为什么selenium会被识别出来
    因为浏览器指纹暴露了身份可以通过下面这个网址检测,如果是selenium打开的,就会显示红色Antibot(sannysoft.com) 可以用selenium调试手动打开的浏览器来伪装:首先命令行加参数打开浏览器:startchrome.exe --remote-debugging-port=9222然后selenium加上以下选项fromsele......
  • 快乐学Python,数据分析之获取数据方法「公开数据或爬虫」
    学习Python数据分析,第一步是先获取数据,为什么说数据获取是数据分析的第一步呢,显而易见:数据分析,得先有数据,才能分析。作为个人来说,如何获取用于分析的数据集呢?1、获取现成的数据集获取数据集的第一种方式,就是获取行业上已经有人整理好的数据集。目前大数据行业持续火爆,数据本身已......
  • Shopee买家通系统:轻松获取虾皮买手号的智能利器
    近来,有一款强大的软件引起了广泛关注,它就是Shopee买家通系统,为用户提供了自动化注册虾皮买手号的便捷途径。目前,该软件已覆盖菲律宾、泰国、马来西亚、越南、巴西、印度尼西亚等多个国家,为用户提供更广泛的服务。软件注册流程极为简单,虾皮买家号目前基本上都是通过手机号注册的,因此......
  • Shopee买家通系统助力虾皮买手号轻松获取
    Shopee买家通系统可以进行虾皮买手号的全自动注册。这款先进的软件目前覆盖了菲律宾、泰国、马来西亚、越南、巴西、印度尼西亚等多个国家,为用户提供了便捷、高效的注册途径。想要注册虾皮买家号号,首先需要准备一个支持接收短信的手机号。因为虾皮买家号注册主要通过手机号完成,因此......
  • 如何在simulink中获取足端轨迹?
    哈喽大家好,我是咕噜美乐蒂。很高兴又和大家见面啦。在机器人控制的应用中,足端轨迹是一个非常重要的参数,可以用来评估机器人的运动性能和精度。在Simulink中获取足端轨迹需要考虑到模型的复杂性、仿真器的选择、输出信号的设置以及数据处理等多个方面。美乐蒂在本文中将详细介绍如......
  • Oracle-使用dbms_metadata.get_ddl()获取对象的定义
    dbms_metadata.get_ddl()用于获取对象的ddl,其具体用法如下。注意:在sqlplus里,为了更好的展示DDL,需要设置如下参数:setline200setpagesize0setlong99999setfeedbackoffsetechooff1)获得表、索引、视图、存储过程、函数的DDLselectdbms_metadata.get_ddl('TABLE','TABLE_......
  • 淘宝/天猫商品详情实时数据API技术实现
    随着电子商务的蓬勃发展,对于电商平台的商家而言,实时获取商品数据变得至关重要。通过API接口,可以轻松地从电商平台获取这些数据。本文将详细介绍如何使用淘宝/天猫提供的API接口实现商品详情数据的实时获取,并给出具体的代码示例。一、API接口介绍淘宝/天猫提供了丰富的API接口,用于获......
  • 应用获取客户端真实IP
    !!大家好,我是乔克,一个爱折腾的运维工程,一个睡觉都被自己丑醒的云原生爱好者。作者:乔克公众号:运维开发故事博客:www.jokerbai.com背景信息因为产品需要,要在应用端获取到真实的客户端IP,访问链路如下:由于应用前面经过了多次代理,所以默认情况下是获取不到真实IP的。基本概念在实现之前,......
  • Qt读取文件对比:每次获取自定义的长度和使用系统的API,耗时对比
    0.前言在编程过程中,经常遇到文件读写操作,太频繁了。每次也都写的不一样。突发奇想,想测试下几种不同的读取文件的效率。测试以下三种方式读取文件效率:自定义读取文件耗时使用QFile类API读取文件耗时使用QTextStream类API读取文件耗时在测试前,说一下使用到的知识点。1.Qt......
  • 获取构件所在的房间
    获取构件所在的房间方法一:得到房间Solid后,就可以通过ElementIntersectsSolidFilter过滤出相交构件后,即可筛选出想要的构件:  varlist=newFilteredElementCollector(doc).WhereElementIsNotElementType().WherePasses(newElementIntersectsSolidFilter(solid)).ToList(); 方......