|来源:博客园

|链接:https://www.cnblogs.com/ZweiZhao/p/9798008.html


阿里试用排序

前景提要

说来简直丢尽了钢铁直男的脸,没错,昨晚我在愉快的做着外包的活(中国移动的小程序,自由职业,喂),11点多了,女友突然脑子一抽:“你能不能帮我把这个玩意排序一下给我用啊,我好薅点羊毛,技术能实现嘛?”
       我比较无奈的看了看,阿里试用咩?什么鬼,哦哦哦,就这玩意啊,爬虫爬一下就是了。我是前端……
回道:“没问题啊,爬虫呗。”
她:“哇,多久能做出来啊?”
我:“我现在在忙诶,1-2小时吧。”
她:“行了,你别忙了,赶紧帮我弄一下出来!”
我看了看她的脸,羞耻的最小化《微信开发者工具》。。。

页面展示

你要是觉得这也是广告,那真是太抬举我了。

爬虫搞起来

NodeJS 爬虫,百度一下,到处都是现成的代码,我也就不一一分析了,拿出简书的一段代码,来自 埃米莉Emily:

const express = require('express');// 调用 express 实例,它是一个函数,不带参数调用时,会返回一个 express 实例,将这个变量赋予 app 变量。const superagent = require('superagent');const cheerio = require('cheerio');const app = express();app.get('/', (req, res, next) => {  console.log(req)superagent.get('https://www.v2ex.com/').end((err, sres) => {      // 常规的错误处理if (err) {        return next(err);}      // sres.text 里面存储着网页的 html 内容,将它传给 cheerio.load 之后// 就可以得到一个实现了 jquery 接口的变量,我们习惯性地将它命名为 `$`// 剩下就都是 jquery 的内容了let $ = cheerio.load(sres.text);      let items = [];$('.item_title a').each((idx, element) => {        let $element = $(element);items.push({          title: $element.text(),          href: $element.attr('href')});});res.send(items);});
});app.listen(3000, function () {  console.log('app is listening at port 3000');
});

嘛,express 用 NodeJS 的不可能不知道,superagent 理解成可以在 Node 里面做对外请求即可,cheerio 嗯,Node 专用 JQ。

首爬

把上面的请求地址换成:https://try.taobao.com/,查看页面标签结构,找到想要的选择器结构:

.tb-try-wd-item-info > .detail,把这个替换上面选择器 .item_title a,走起:

……我不想展示结果,因为只有六个,页面实际展示是 10 个,找了半天,发现两个问题:

如上,第一个是爬到的 6 个是推荐,喵的,不是下面列表;
第二个,下面列表是后面通过 POST 单独请求来的数据,怎么看都是某框架的 SSR 干的好事。

于是爬虫不成,得换战略。

模拟 POST

OK,既然是 POST,就好弄了,直接把连接跟参数刨出来,然后 superagent 模拟:

superagent.post(    `https://try.taobao.com/api3/call?what=show&page=${paylaod.page}&pageSize&api=x%2Fsearch`).set('content-type', 'application/x-www-form-urlencoded; charset=UTF-8').end((err, sres) => {    // 常规的错误处理if (err) {      return next(err)}    const result = JSON.parse(sres.text).result // 返回结构树resolve(result)})   

content-type 源自:

哼哼哼,你没猜错,失败了,如下:

想想是必然的,怎么可能给你随便请求呢,然后该怎么做?研究?nonono,老夫上来就是一梭子,不就是 Content-Type 么!

superagent.post(    `https://try.taobao.com/api3/call?what=show&page=${paylaod.page}&pageSize&api=x%2Fsearch`).set(    'user-agent',    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36').set('accept', 'pplication/json, text/javascript, */*; q=0.01').set('accept-encoding', 'gzip, deflate, br').set(    'accept-language',    'zh-CN,zh;q=0.9,en;q=0.8,la;q=0.7,zh-TW;q=0.6,da;q=0.5')  // .set('content-length', '8').set('content-type', 'application/x-www-form-urlencoded; charset=UTF-8').set(    'cookie',    'your cookie').set('origin', 'https://try.taobao.com').set('referer', 'https://try.taobao.com').set('x-csrf-token', 'f0b8e7443eb7e').set('x-requested-with', 'XMLHttpRequest').end((err, sres) => {    // 常规的错误处理if (err) {      return next(err)}    const result = JSON.parse(sres.text).resultresolve(result)})

依据就是下面这个:

不就是头么,不就是源么,不就是用户代理么,用个 HTTPS 还没有你办法了?

注意上面 .set('content-length', '8'),不知道那边怎么玩,加上这个就超时……

于是,交代了吧:

{    "pages": {        "paging": {            "n": 2182,            "page": 1,            "pages": 219},        "items": [{                "shopUserId": "2450112357",                "title": "凯度高端款嵌入式蒸烤箱",                "status": 1,                "totalNum": 1,                "requestNum": 15530,                "acceptNum": 0,                "reportNum": 0,                "isApplied": false,                "shopName": "casdon凯度旗舰店",                "showId": "2561626",                "startTime": 1539619200000,                "endTime": 1540220400000,                "id": "34530215",                "type": 1,                "pic": "//img.alicdn.com/bao/uploaded/TB1ycS2eMDqK1RjSZSyXXaxEVXa.jpg",                "shopItemId": "559771706359",                "price": 13850},{                "shopUserId": "3189770892",                "title": "皇家美素佳儿老包装2段400g",                "status": 1,                "totalNum": 50,                "requestNum": 2079,                "acceptNum": 0,                "reportNum": 0,                "isApplied": false,                "shopName": "皇家美素佳儿旗舰店",                "showId": "2551240",                "startTime": 1539619200000,                "endTime": 1540220400000,                "id": "34396042",                "type": 1,                "pic": "//img.alicdn.com/bao/uploaded/TB1YrSZaVYqK1RjSZLeXXbXppXa.jpg",                "shopItemId": "547114874458",                "price": 189},{                "shopUserId": "1077716829",                "title": "关注店铺优先审水密码幻彩隔离",                "status": 1,                "totalNum": 10,                "requestNum": 6907,                "acceptNum": 0,                "reportNum": 0,                "isApplied": false,                "shopName": "水密码旗舰店",                "showId": "2568391",                "startTime": 1539619200000,                "endTime": 1540220400000,                "id": "34784086",                "type": 1,                "pic": "//img.alicdn.com/bao/uploaded/TB16_4ChmzqK1RjSZPxXXc4tVXa.jpg",                "shopItemId": "559005882880",                "price": 599},{                "shopUserId": "725786863",                "title": "精品皮草派克大衣",                "status": 1,                "totalNum": 1,                "requestNum": 11793,                "acceptNum": 0,                "reportNum": 0,                "isApplied": false,                "shopName": "美瑞蓓特",                "showId": "2557886",                "startTime": 1539619200000,                "endTime": 1540220400000,                "id": "34574078",                "type": 1,                "pic": "//img.alicdn.com/bao/uploaded/TB1zVLMdCrqK1RjSZK9XXXyypXa.jpg",                "shopItemId": "577418950477",                "price": 5980},{                "shopUserId": "3000840351",                "title": "保友智能新品Pofit电脑椅",                "status": 1,                "totalNum": 1,                "requestNum": 12895,                "acceptNum": 0,                "reportNum": 0,                "isApplied": false,                "shopName": "保友办公家具旗舰店",                "showId": "2557100",                "startTime": 1539619200000,                "endTime": 1540220400000,                "id": "34528042",                "type": 1,                "pic": "//img.alicdn.com/bao/uploaded/TB1bYZEg6TpK1RjSZKPXXa3UpXa.png",                "shopItemId": "577598687971",                "price": 5408},{                "shopUserId": "791732485",                "title": "TEK手持吸尘器A8",                "status": 1,                "totalNum": 1,                "requestNum": 17195,                "acceptNum": 0,                "reportNum": 0,                "isApplied": false,                "shopName": "泰怡凯旗舰店",                "showId": "2552265",                "startTime": 1539619200000,                "endTime": 1540220400000,                "id": "34444014",                "type": 1,                "pic": "//img.alicdn.com/bao/uploaded/TB1D6bWbhTpK1RjSZFGXXcHqFXa.jpg",                "shopItemId": "547653053965",                "price": 5199},{                "shopUserId": "3229583972",                "title": "椰富海南冷炸椰子油食用油1L",                "status": 1,                "totalNum": 20,                "requestNum": 4451,                "acceptNum": 0,                "reportNum": 0,                "isApplied": false,                "shopName": "椰富食品专营店",                "showId": "2561698",                "startTime": 1539619200000,                "endTime": 1540220400000,                "id": "34532250",                "type": 1,                "pic": "//img.alicdn.com/bao/uploaded/TB1VjLSePDpK1RjSZFrXXa78VXa.jpg",                "shopItemId": "578653506446",                "price": 256},{                "shopUserId": "855223948",                "title": "卡西欧立式家用电钢琴PX770",                "status": 1,                "totalNum": 1,                "requestNum": 16762,                "acceptNum": 0,                "reportNum": 0,                "isApplied": false,                "shopName": "世纪音缘乐器专营店",                "showId": "2551326",                "startTime": 1539619200000,                "endTime": 1540220400000,                "id": "34420041",                "type": 1,                "pic": "//img.alicdn.com/bao/uploaded/TB1CC6aa9zqK1RjSZFpXXakSXXa.jpg",                "shopItemId": "562405126383",                "price": 4838},{                "shopUserId": "4065939832",                "title": "关注宝贝送轻奢沙发床",                "status": 1,                "totalNum": 1,                "requestNum": 17436,                "acceptNum": 0,                "reportNum": 0,                "isApplied": false,                "shopName": "贝兮旗舰店",                "showId": "2559904",                "startTime": 1539619200000,                "endTime": 1540220400000,                "id": "34532170",                "type": 1,                "pic": "//img.alicdn.com/bao/uploaded/TB1AzxYegHqK1RjSZFPXXcwapXa.jpg",                "shopItemId": "577798067313",                "price": 4399},{                "shopUserId": "807974445",                "title": "森海塞尔CX6蓝牙耳机",                "status": 1,                "totalNum": 4,                "requestNum": 22557,                "acceptNum": 0,                "reportNum": 0,                "isApplied": false,                "shopName": "sennheiser旗舰店",                "showId": "2559701",                "startTime": 1539619200000,                "endTime": 1540220400000,                "id": "34532161",                "type": 1,                "pic": "//img.alicdn.com/bao/uploaded/TB1HET6d7voK1RjSZFwXXciCFXa.jpg",                "shopItemId": "564408956766",                "price": 999}]}
}

细心的小伙伴应该看到,我没有发送 form 给他,一样可以请求到需要的数据,page 挂在了 query 上……这里,允许我严重怀疑一下他们的技术能力。

展示部分

数据拿到,就简单了,其实就是这一个接口实现剩下的功能了,没错,记住我是前端。

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>tb try</title><style>.warning {      color: red;}    button {      width: 100px;      height: 44px;      margin-right: 44px;}    table {      border: 1px solid #d8d8d8;      border-collapse: collapse;}    tr {      border-bottom: 1px solid #d8d8d8;      cursor: pointer;}    tr:last-child {      border: 0;}  </style></head><body><button onclick="postPage()">下一页</button><span id="currentPage"></span><table><tbody><tr><th>序号(倒序)</th><th>概率</th><th>名字</th></tr></tbody><tbody id="results"></tbody></table><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><script>let currentPage = 0 // 当前页面let allItems = [] // 全部数据let currentTime = 0 // 锁频率使用,标记上次时间const loopInterval = 2 // 锁频率步长,单位秒const results = document.querySelector('#results')    const currentPageText = document.querySelector('#currentPage')    const reFullTBody = arr => {      let innerHtml = ''arr.forEach((item, i) => {item.rate = item.totalNum / item.requestNum * 100let tr = `<tr onclick="window.open('https://try.taobao.com/item.htm?id=${item.id}')"><td>${i + 1}</td><td>${item.rate.toFixed(3) + '%'}</td><td>${item.title}</td></tr>`if (item.rate > 5) tr = tr.replace('<tr', '<tr class="warning"')innerHtml += tr})currentPageText.innerText = `当前页:${currentPage}`results.innerHTML = innerHtml // 原谅我 mvvm 的臭毛病}    const postPage = () => {      // 锁频率步长内取消请求const newTime = new Date().getTime()      const shoudBack = newTime - currentTime < loopInterval * 1000if(shoudBack) {alert(loopInterval + '秒内不要多次点击哦。')        return}currentTime = newTime$.post('/table', { page: currentPage }, res => {        if(res.length < 1) {alert('今天结束的已经筛选完了')          return}allItems = [...allItems, ...res]allItems.sort((a, b) => b.rate - a.rate)reFullTBody(allItems)currentPage--})}$.get('/total', res => {currentPage = res.pagespostPage()})  </script></body></html>

长这个样子:

我多人性化,可以点击跳转、概率超过 5% 红色展示、还告诉你当前所在页码、点太快还给你提示………………………………

就是这么好用,喜欢的赶紧体验吧!


线上:点我体验(http://only-u.site:8000/)

Github: Spider(https://github.com/ZweiZhao/Spider)


觉得有用,不要吝惜 star 哦。

“程序猿技术大咖”,您值得拥有!

公众号ID:cxyjsdk长按左侧二维码关注

阿里试用,女朋友逼着我给她排序相关推荐

  1. 比世界纪录快3倍 阿里云377秒完成100TB数据排序

    本文讲的是 比世界纪录快3倍 阿里云377秒完成100TB数据排序,10月28日,Sort Benchmark在官方网站公布了2015年排序竞赛的最终成绩.阿里云用不到7分钟(377秒)就完成了100 ...

  2. 【推荐实践】阿里飞猪“猜你喜欢”推荐排序实践

    导读:飞猪猜你喜欢排序模型由线性模型升级到端到端的深度模型,并进行了多个版本的迭代.本文分享模型迭代中的一些技术沉淀. 引言 俗话说有多少米,就下多大锅.在特征体系构建上,我们已经准备了很多米了,并且 ...

  3. C++排序算法实现(更新中)

    比较排序法:如冒泡排序.简单选择排序.合并排序.快速排序.其最优的时间复杂度为O(nlogn). 其他排序法:如桶排序.基数排序等.时间复杂度可以达到O(n).但试用范围有要求. 桶排序:排序的数组元 ...

  4. 阿里广告技术最新突破:全链路联动-面向最终目标的全链路一致性建模

    ©作者 | 王哲 单位 | 阿里妈妈展示广告算法专家 研究方向 | 广告/推荐/深度学习/NLP 引言 深度学习时代的到来给搜推广业务带来了一波巨大的红利,一方面是深度学习模型带来的技术红利,另一方面 ...

  5. 阿里广告技术最新突破!全链路联动——面向最终目标的全链路一致性建模

    作者 | 王哲,阿里妈妈展示广告算法专家 整理 | NewBeeNLP 1. 引言 深度学习时代的到来给搜推广业务带来了一波巨大的红利,一方面是深度学习模型带来的技术红利,另一方面是GPU/NPU等硬 ...

  6. 关于阿里云与mangoDB的关系,以及uni-app基于阿里云打包H5以及app的讲解及注意事项

    目录 被称为全球领先的阿里云 阿里云数据库与mongoDB的关系 什么是mongoDB 阿里云与mongoDB达成战略合作伙伴关系的意义 什么是uni-app 优点 本地云函数的上传 关于H5打包并打 ...

  7. Docker学习之路02:阿里云镜像加速器

    阿里云镜像加速器 Docker学习路线传送门: Docker学习之路01:Docker的安装 Docker学习之路02:阿里云镜像加速器 Docker学习之路03:Docker的常用命令 Docker ...

  8. 阿里云是一个什么样的企业,为什么能成为行业第一

    根据公开的数据显示,有超过一半A股上市公司.40%的中国500强企业.近一半中国上市公司.80%中国科技类公司在使用阿里云.那么阿里云是一个什么样的企业,为什么能成为行业第一,以下相关介绍获取可以说明 ...

  9. 云-阿里云-百科:阿里云

    ylbtech-云-阿里云-百科:阿里云 阿里云,阿里巴巴集团旗下云计算品牌,全球卓越的云计算技术和服务提供商.创立于2009年,在杭州.北京.硅谷等地设有研发中心和运营机构. 阿里云创立于2009年 ...

最新文章

  1. 求助马斯克实现载人飞行,NASA省了近300亿美元
  2. Ubuntu下VIM使用指南
  3. Android的intent之间复杂参数的传递
  4. 【半小时大话.net依赖注入】(一)理论基础+实战控制台程序实现AutoFac注入
  5. java socat_socat安装使用方法
  6. 强化学习《基于策略价值 - Pathwise Derivative Policy Grident》
  7. multipartfile 获取音频时长_QQ音乐移动端加入倍速播放,蓄力长音频发展 | 产品观察...
  8. 引入LeakCanary到项目
  9. 鼠标右键添加新建类型
  10. 一刷leetcode——树
  11. Romantic 扩展欧几里得
  12. bzoj 1034: [ZJOI2008]泡泡堂BNB(贪心)
  13. 自己写的配筋的Android应用——RCHelper,依据SL191-2008
  14. pyltp安装失败python 3.7_pyltp模块安装问题
  15. win10支持8t 硬盘_详解win10硬盘如何直接安装
  16. 【主题词——玫瑰花】
  17. 基于ACCESS的教师工作量计算系统的设计与实现(含源文件)
  18. 华东康桥计算机音乐,感受人文至美 华东康桥2019年第二届音乐飨宴盛大开幕
  19. 回望,勉强及格的大学四年答卷
  20. 在Ubuntu 20.04系统里安装Flatpak软件应用无图标显示问题的解决

热门文章

  1. n个评委给m个选手打分python_n个评委为m个选手打分(n个评委打分总次数mn)。请问如何评判m个选手的成绩?...
  2. 52.一文带你理解ARM程序的编译及执行过程
  3. springboot项目:前后端搭建
  4. Echarts结合百度地图API
  5. access身份证号掩码_Access输入掩码说明
  6. 奔跑吧兄弟一起学平面UI设计培训
  7. Rust模板引擎Tera中文英文对照官方文档
  8. 洛谷刷题C语言:距离函数、闰年展示、计算阶乘、猴子吃桃、培训
  9. 微信WeUI扩展组件
  10. 将office2016许可版切换为Office 365授权