javascript - 该网站如何检测我的硒蜘蛛以及如何通过它?
问题描述
环境:Selenium + ChromeDriver
我正在使用 selenium 在网站上获取一些只能通过 Ajex 请求获取的数据。却得到“验证失败,请刷新页面重新查询”等信息。当我在 chrome 上做同样的事情时,我得到了一个 Slider 验证。所以我的问题是,为什么我在使用 selenium 时甚至没有看到 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
解决方案
我发现了问题。该网站正在观看 selenium chromedriver 中嵌入的一些 JS 参数。可行的解决方案如下:
- 挂另一个模块,如 pyppeteer。
- 挂另一个模块,如 pyppeteer。
- 使用像 mitmproxy 这样的代理。
- 改用 firefoxdriver。
推荐阅读
- ubuntu - gunicorn 当前命令从单元文件中消失
- angular - angular bootstrap 4 手风琴动态加载第一个选项卡显示页面加载
- excel - OPC DA 客户端 - 无法将 item.Value 分配给 VBA 变量
- r - 在 R 中执行 GAM(mgcv 包)时,“model.matrix.formula(form, data) 中的错误:数据必须是 data.frame”
- swift - macOS 上沙盒化 swift 应用的应用间通信
- python - Beautiful Soup \u003b 出现并弄乱了 find_all?
- excel - 查找特定文本、选择和突出显示
- python - python中的np.arange()函数
- java - 电话号码未格式化为 android 的自动填充默认国家/地区
- php - How to select perticular class in jquery from a dynamic table