阿里试用,女朋友逼着我给她排序

阿里试用排序

抱歉,之前莫名其妙把配置文件给 ignore 了,已经修复,抱歉

前景提要

说来简直丢尽了钢铁直男的脸,没错,昨晚我在愉快的做着外包的活(中国移动的小程序,自由职业,喂),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 个,找了半天,发现两个问题:

推荐

POST 请求来的数据

如上,第一个是爬到的 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 源自:

contetnType

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

失败页面

想想是必然的,怎么可能给你随便请求呢,然后该怎么做?研究?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)})

依据就是下面这个:

content-type2

不就是头么,不就是源么,不就是用户代理么,用个 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>let currentPage = 0 // 当前页面let allItems = [] // 全部数据let currentTime = 0 // 锁频率使用,标记上次时间const xhr = new XMLHttpRequest()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}const postPage = () => {// 锁频率步长内取消请求const newTime = new Date().getTime()const shoudBack = newTime - currentTime < loopInterval * 1000if(shoudBack) {alert(loopInterval + '秒内不要多次点击哦。')return}currentTime = newTimexhr.onreadystatechange = function() {if(this.readyState === 4 && this.status === 200) {const res = JSON.parse(this.response)if(res.length < 1) {alert('今天结束的已经筛选完了')return}allItems = [...allItems, ...res]allItems.sort((a, b) => b.rate - a.rate)reFullTBody(allItems)currentPage--}}xhr.open('post', '/table')xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");//发送请求xhr.send("page=" + currentPage)}xhr.onreadystatechange = function() {if(this.readyState === 4 && this.status === 200) {currentPage = JSON.parse(this.response).pagespostPage()}}xhr.open('get', '/total')xhr.send()</script>
</body></html>

长这个样子:

展示

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

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


线上:点我体验

Github: Spider


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

转载于:https://www.cnblogs.com/ZweiZhao/p/9798008.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用于Elasticsearch成绩单的Java客户端

在本演讲中&#xff0c;我将介绍用于Elasticsearch和Spring Data Elasticsearch的三个不同的客户端。 首先&#xff0c;让我们看一下Elasticsearch的一些基础知识。 弹性搜索 为了介绍elasticsearch&#xff0c;我使用的定义直接来自Elastic网站。 Elasticsearch是基于JSON的…

springmvc是什么_当一个http请求来临时,SpringMVC究竟偷偷帮你做了什么?

前文Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清晰的几部分&#xff0c;简化开发&#xff0c;减少出…

怎么用python画饼状图_Python入门进阶:Python绘制饼图到Microsoft Excel

原标题&#xff1a;Python入门进阶&#xff1a;Python绘制饼图到Microsoft Excel 来自&#xff1a;Linux迷https://www.linuxmi.com/python-pie-chart-microsoft-excel.html 在本文中&#xff0c;我想向您展示使用Python向Microsoft Excel绘制饼图&#xff0c;为此我们将使用Xl…

Linux系统Shutdown命令定时关机详解

Linux系统下的shutdown命令用于安全的关闭/重启计算机&#xff0c;它不仅可以方便的实现定时关机&#xff0c;还可以由用户决定关机时的相关参数。在执行shutdown命令时&#xff0c;系统会给每个终端&#xff08;用户&#xff09;发送一条屏显&#xff0c;提示关机操作。定时关…

_ASSERTE(_CrtIsValidHeapPointer(pUserData))错误详解

可能原因&#xff1a;DLL和EXE主程序使用的不是同一个堆造成。 解决办法&#xff1a; 1. 采用谁分配谁释放的原则&#xff1b; 2. 绕过 new 和 delete&#xff0c;使用 GlovalAlloc 和 GlobalFree&#xff1b; 3. 更改工程选项&#xff0c; release 版本肯定不会出现这个失败&a…

【机器学习】【线性回归】梯度下降

文章目录 [toc]数据集实际值估计值估计误差代价函数学习率参数更新Python实现导包数据预处理迭代过程数据可视化完整代码 线性拟合结果代价结果 个人主页&#xff1a;丷从心 系列专栏&#xff1a;机器学习 数据集 ( x ( i ) , y ( i ) ) , i 1 , 2 , ⋯ , m \left(x^{(i)} , …

python api是什么_Python/C API

Python/C API Python/C API可能是被最广泛使用的方法。它不仅简单&#xff0c;而且可以在C代码中操作你的Python对象。 这种方法需要以特定的方式来编写C代码以供Python去调用它。所有的Python对象都被表示为一种叫做PyObject的结构体&#xff0c;并且Python.h头文件中提供了各…

Sublime Text插件列表

本文由伯乐在线 - 艾凌风 翻译&#xff0c;黄利民 校稿。英文出处&#xff1a;ipestov.com。欢迎加入翻译组。本文收录了作者辛苦收集的Sublime Text最佳插件&#xff0c;很全。 最佳的Sublime Text 插件 朋友们你们好&#xff01;我尝试着收集了最佳的ST插件&#xff0c;这些插…

C语言sendto()函数:经socket传送数据

相关函数&#xff1a;send, sendmsg, recv, recvfrom, socket头文件&#xff1a;#include <sys/types.h> #include <sys/socket.h>定义函数&#xff1a;int sendto(int s, const void * msg, int len, unsigned int flags, const struct sockaddr * to, int tole…

javaone_JavaOne 2012:向上,向上和向外:使用Akka扩展软件

javaone在晚些时候的社区主题演讲之后&#xff0c;我前往希尔顿金门大桥3/4/5观看了维克多巴生 &#xff08; Viktor Klang &#xff09;的&#xff08; Typesafe &#xff09;“向上&#xff0c;向上和向外&#xff1a;Akka”演讲。 巴生&#xff08;Klang&#xff09;是Akka的…

Windows平台下动态链接库的总结

1、 动态链接库与静态连接库 静态连接库与动态链接库都是经过编译器编译之后的&#xff0c;在计算机上可以直接运行的二进制目标文件&#xff0c;就像exe文件一样&#xff0c;但不同于exe文件的是静态链接库和动态链接库不可以独立运行&#xff0c;一般而言&#xff0c;动态链接…

python建模分析实操_城市公交站点设置优化模型-基于Python

城市公交站点设置的优化分析 一、模型应用 进入21世纪以来&#xff0c;我国城市公共交通飞速发展&#xff0c;然而随着经济社会发展&#xff0c;城市不断升级以及人民生活品质越来越好&#xff0c;城市交通拥堵、出行不便等问题日益突出&#xff0c;严重损坏了市民日常的生活体…

【递归:把目录下所有文件的绝对路径给输出在控制台】

package com.bornsoft.test.capitalpool.tyc;import java.io.File;/*** author shusheng* description* Email shushengyiji.com* date 2018/10/16 10:26*/ public class DiGuiDemo2 {/***需求&#xff1a;请大家把目录下所有文件的绝对路径给输出在控制台*分析&#xff1a;*A:…

UDP sendto和recvfrom使用详解

在网络编程中&#xff0c;UDP运用非常广泛。很多网络协议是基于UDP来实现的&#xff0c;如SNMP等。大家常常用到的局域网文件传输软件飞鸽传书也是基于UDP实现的。 本篇文章跟大家分享linux下UDP的使用和实现&#xff0c;主要介绍下sendto()和recvfrom()两个函数的使用&#xf…

SpringOne Platform 2016回顾

我最近结束了在拉斯维加斯参加SpringOne Platform会议的总结。 这是我第一次参加SpringOne。 这是聆听演讲并与软件开发领域的一些顶级专家进行对话的一种体验。 如果您没有参加SpringOne&#xff0c;那么您肯定会想要阅读这篇文章。 我们将介绍这四个主题&#xff0c;以及如何…

欧姆龙cp1hum读保护解密步骤_欧姆龙PLC的NJ系列NJ产品功能介绍

欧姆龙PLC的NJ 系列NJ运动、逻辑和视觉集于一体欧姆龙PLC的NJ 系列NJ特点One Machine Control运动、逻辑和视觉集于一体将组成机械所需的各种控制设备汇集于一体&#xff0c;使用一个软件即可进行控制。 这就是Sysmac自动化平台的努力目标。 我们的新型机器自动化控制器NJ系列通…

关于CUDA和CuDNN配置的小问题

为了方便组员操作&#xff0c;简单写一下CUDA的配置啦。 首先你需要一台电脑&#xff0c;有NVDIA显卡的那种&#xff08;就那个煤气灶&#xff0c;你懂我意思吧&#xff09;&#xff0c;然后就继续往下走吧&#xff0c;如果没有的话可以找一下右上角的红叉了&#xff0c;这篇文…

PyMongo--非关系型数据库mongodb入门(一步一步 版)

PyMongo--非关系型数据库mongodb入门&#xff08;一步一步 版&#xff09; 本文主要内容&#xff1a; 1.简要介绍mongodb 2.Pymongo 3.mongo shell 4.我的mongodb入门之旅 1.简要介绍mongodb MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的…

python画图颜色种类_Python可视化|matplotlib07-python colormap(颜色映射)(三)

本篇详细介绍matplotlib内置的颜色条Colormap使用。 本文将学到什么&#xff1f; 1、colormap名称 2、colormap可视化 3、colormap使用方法 4、参考资料 更好的阅读体验请戳&#xff1a; 1、colormap名称 colormap颜色通过matplotlib的cm模块调用&#xff0c;print(dir(cm))即可…

element table 组件内容换行方案

element table 组件内容换行方案 white-space的值&#xff1a; normal 默认。空白会被浏览器忽略。pre 空白会被浏览器保留。其行为方式类似 HTML 中的<pre> 标签。nowrap 文本不会换行&#xff0c;文本会在在同一行上继续&#xff0c;直到遇到 <br>标签为止。pre-…