Как этот веб-сайт определяет моего селенового паука и как с ним справиться? - PullRequest
0 голосов
/ 29 мая 2020

Среда: Selenium + ChromeDriver

Я использую селен для получения некоторых данных на веб-сайте, которые могут быть получены только с помощью запросов Ajex. Но появилась информация типа «Ошибка проверки, обновите sh страницу и повторите запрос». И когда я проделал то же самое на chrome, вместо этого я получил проверку Slider. Итак, у меня вопрос, почему я даже не увидел проверку слайдера при использовании селена, но получил информацию «Проверка не удалась»? И я не могу найти подсказки в кодах JS веб-сайта, потому что я не нашел ни одного фрагмента кода, относящегося к информации.

Связанные коды JS следующие:

function getData(t, e) {
    $.ajax({
        url: "/api/pricehistory/getUrlPriceHistory",
        type: "POST",
        data: {
            url: t,
            nvcVal: window.getNVCVal()
        },
        success: function(t) {
            e && e(t)
        }
    })
}
function loadGoodsData() {
    function t(t) {
        var e = (new Date).getTime()
          , a = t.pv
          , i = "";
        i = a < 10 && e - new Date(t.update_time.replace(/-/g, "/")) < 864e5 ? "优惠新上" : a + "人看过",
        t.pvText = i;
        var o = formatTime(t.update_time, e);
        t.upTime = o;
        var c, n, s = t.description, r = s, d = /<a[^<>]+>[^<>]+<\/a>/gi, l = r.match(d);
        c = n = 0;
        var p;
        r = r.replace(d, "%#" + c++ + "%"),
        r = r.replace(/<[^>]+>/gi, ""),
        p = ZTools.subWideCharStr(r, 180, '... <span class="desc-txt-switch on">查看全部</span>'),
        p = p.replace(/%#(\d+)%/gi, function() {
            return l[n++]
        }),
        p = p.replace(/%(#)?(\d+)?.../g, "..."),
        s = s.replace(/<br>/gi, "</p><p>"),
        t.multi_image && t.multi_image.length > 0 && p.indexOf('<span class="desc-txt-switch on">查看全部</span>') == -1 && (p += '<span class="desc-txt-switch on">查看全部</span>'),
        t.descSummary = p,
        t.descText = s
    }
    var e = /^https?:\/\/[^\s<>]*$/i
      , a = $("#ipt").val() || "https://item.jd.com/44125207975.html";
    $(".price-search .notice").hide(),
    $(".J-product-info").hide(),
    $(".J-news").hide(),
    $(".J-history").hide(),
    e.test(a) ? getData(a, function(e) {
        if (e && 1 === e.RC)
            if (e.data && 200 == e.data.code || 100 == e.data.code)
                if (e.data.info && e.data.pcinfo) {
                    var a = {};
                    a.title = e.data.info.title || "暂未获取到商品标题",
                    a.pic = e.data.info.pic || ZTools.defaults.defaultPic,
                    a.pic = ZTools.imageUrlAdapter(a.pic, 240, 150, 1),
                    a.buylink = e.data.info.buylink,
                    a.price = e.data.info.price,
                    a.shop = e.data.info.shop,
                    a.trend = e.data.pcinfo.trend,
                    e.data.info.title && (a.couponlink = "http://" + (g_domain || "www.miaomiaozhe.com") + "/search?filter=coupon&q=" + e.data.info.title);
                    var i = window.template("tpl_goods_prl_info", a);
                    if ($(".product").html(i),
                    $(".J-product-info").show(),
                    loadPricetrend({
                        pcinfo: e.data.pcinfo,
                        wrap: ".prod-info .pricetrend"
                    }),
                    e.data.live.length > 0) {
                        var o = e.data.live[0];
                        t(o);
                        var c = window.template("tpl_live_list", o);
                        $("#news-list").html(c),
                        $(".J-news").show()
                    }
                    if (e.data.live.length > 1) {
                        for (var o = e.data.live, n = "", s = 1; s < o.length; s++)
                            t(o[s]),
                            n += window.template("tpl_live_list", o[s]);
                        $("#history-list").html(n),
                        $(".J-history").show()
                    }
                } else
                    $(".price-search .notice.no-result").show();
            else
                e.data && 800 == e.data.code || 900 == e.data.code ? $(".price-search .notice.failed").show() : getNC().then(function() {
                    _nvc_nc.upLang("cn", {
                        _startTEXT: "请按住滑块,拖动到最右边校验后查看",
                        _yesTEXT: "验证通过",
                        _error300: '哎呀,出错了,点击<a href="javascript:__nc.reset()">刷新</a>再来一次',
                        _errorNetwork: '网络不给力,请<a href="javascript:__nc.reset()">点击刷新</a>'
                    }),
                    _nvc_nc.reset()
                });
        else
            $(".price-search .notice.no-result").show()
    }) : $(".price-search .notice.no-result").show()
}
$(function() {
    window.NVC_Opt = {
        appkey: "FFFF0N0N000000006AFF",
        scene: "nvc_activity",
        isH5: !1,
        popUp: !0,
        renderTo: "#captcha",
        trans: {
            key1: "code0",
            nvcCode: 400
        },
        language: "cn",
        customWidth: 300,
        nvcCallback: function(t) {
            loadGoodsData()
        }
    };
    var t = new Date
      , e = t.getTime() - 60 * t.getMinutes() * 1e3 - 1e3 * t.getSeconds() - t.getMilliseconds()
      , a = document.createElement("script");
    a.src = "//g.alicdn.com/sd/nvc/1.1.112/guide.js?t=" + e,
    document.body.appendChild(a);
    var i = document.createElement("div");
    i.id = "captcha",
    $(".price-search").append(i);
    var o = $("#ipt").attr("placeholder");
    $("#ipt").on({
        focus: function() {
            $(this).attr("placeholder") && $(this).attr("placeholder", ""),
            $(this).addClass("focus"),
            $(this).select()
        },
        blur: function() {
            $(this).attr("placeholder") || $(this).attr("placeholder", o),
            $(this).removeClass("focus")
        },
        keydown: function(t) {
            13 == t.which && (loadGoodsData(),
            t && t.stopPropagation())
        }
    }),
    $("#search-btn").on({
        click: function() {
            loadGoodsData()
        }
    })
});
<div class="panel price-search">
    <input type="text" placeholder="请输入商品链接,如https://item.jd.com/44125207975.html" class="ipt" id="ipt" value="">
    <span class="btn" id="search-btn">历史价格查询</span>
    <p class="notice no-result hide" style="display: none;">抱歉,没有查到此商品的历史价格</p>
	  <p class="notice failed hide" style="display: block;">验证失败,请<a href="/pricehistory">刷新</a>页面重新查询</p>
<div id="captcha"></div></div>

мои исходные коды паука следующие:

from selenium import webdriver
from time import sleep

chrome_opt = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 1}
chrome_opt.add_experimental_option("prefs", prefs)
chrome_opt.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_opt.add_argument('user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"')
driver = webdriver.Chrome(chrome_options=chrome_opt)
driver.get("https://www.miaomiaozhe.com")
driver.find_element_by_class_name('pl').click()
good2 = "https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.7.e748471bIRN6jQ&id=554640570620&skuId=4341085905022&areaId=420100&user_id=2928380385&cat_id=2&is_b=1&rn=6ba9712cf53485a574d73191e05d0cbf"
goodURL = "https://detail.tmall.com/item.htm?id=569343149791&spm=875.7931836/B.2017081.2.66144265gU7Lgd&scm=1007.12144.81309.73299_0_0&pvid=10ae9600-6e84-4ad0-8e1e-a8379cea71c3&utparam=%7B%22x_hestia_source%22:%2273299%22,%22x_object_type%22:%22item%22,%22x_mt%22:9,%22x_src%22:%2273299%22,%22x_pos%22:1,%22x_pvid%22:%2210ae9600-6e84-4ad0-8e1e-a8379cea71c3%22,%22x_object_id%22:569343149791%7D"
driver.find_element_by_id('ipt').send_keys(good2)
driver.find_element_by_id('search-btn').click()
print(driver.current_url)
driver.close

1 Ответ

0 голосов
/ 02 июня 2020

Я нашел проблему. Веб-сайт наблюдает за некоторыми JS параметрами, встроенными в селен хромированный драйвер. Возможное решение:

  1. подвешивание другого модуля, такого как pyppeteer.
  2. подвешивание другого модуля, такого как pyppeteer.
  3. Использование агента, такого как mitmproxy.
  4. Вместо этого используйте firefoxdriver.
...