首页 > 编程语言 >【进大厂大数据爬虫技术核心难点】纯前端开发的爬虫程序,很多BAT技术大咖都为之惊叹

【进大厂大数据爬虫技术核心难点】纯前端开发的爬虫程序,很多BAT技术大咖都为之惊叹

时间:2022-12-22 13:04:35浏览次数:35  
标签:node BAT parent ctx 爬虫 var absAngle 前端开发 Math


 创建index.html代码如下

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover">
<title>爬虫</title>
</head>
<body>
<script src="js/pacong.js"></script>
</body>
</html>

js/pacong.js代码为

var Input = {
keys: [],
mouse: {
left: false,
right: false,
middle: false,
x: 0,
y: 0
}
};
for (var i = 0; i < 230; i++) {
Input.keys.push(false);
}
document.addEventListener("keydown", function (event) {
Input.keys[event.keyCode] = true;
});
document.addEventListener("keyup", function (event) {
Input.keys[event.keyCode] = false;
});
document.addEventListener("mousedown", function (event) {
if ((event.button = 0)) {
Input.mouse.left = true;
}
if ((event.button = 1)) {
Input.mouse.middle = true;
}
if ((event.button = 2)) {
Input.mouse.right = true;
}
});
document.addEventListener("mouseup", function (event) {
if ((event.button = 0)) {
Input.mouse.left = false;
}
if ((event.button = 1)) {
Input.mouse.middle = false;
}
if ((event.button = 2)) {
Input.mouse.right = false;
}
});
document.addEventListener("mousemove", function (event) {
Input.mouse.x = event.clientX;
Input.mouse.y = event.clientY;
});
//Sets up canvas
var canvas = document.createElement("canvas");
document.body.appendChild(canvas);
canvas.width = Math.max(window.innerWidth, window.innerWidth);
canvas.height = Math.max(window.innerHeight, window.innerHeight);
canvas.style.position = "absolute";
canvas.style.left = "0px";
canvas.style.top = "0px";
document.body.style.overflow = "hidden";
var ctx = canvas.getContext("2d");
//Necessary classes
var segmentCount = 0;

class Segment {
constructor(parent, size, angle, range, stiffness) {
segmentCount++;
this.isSegment = true;
this.parent = parent; //Segment which this one is connected to
if (typeof parent.children == "object") {
parent.children.push(this);
}
this.children = []; //Segments connected to this segment
this.size = size; //Distance from parent
this.relAngle = angle; //Angle relative to parent
this.defAngle = angle; //Default angle relative to parent
this.absAngle = parent.absAngle + angle; //Angle relative to x-axis
this.range = range; //Difference between maximum and minimum angles
this.stiffness = stiffness; //How closely it conforms to default angle
this.updateRelative(false, true);
}

updateRelative(iter, flex) {
this.relAngle =
this.relAngle -
2 *
Math.PI *
Math.floor((this.relAngle - this.defAngle) / 2 / Math.PI + 1 / 2);
if (flex) {
// this.relAngle=this.range/
// (1+Math.exp(-4*(this.relAngle-this.defAngle)/
// (this.stiffness*this.range)))
// -this.range/2+this.defAngle;
this.relAngle = Math.min(
this.defAngle + this.range / 2,
Math.max(
this.defAngle - this.range / 2,
(this.relAngle - this.defAngle) / this.stiffness + this.defAngle
)
);
}
this.absAngle = this.parent.absAngle + this.relAngle;
this.x = this.parent.x + Math.cos(this.absAngle) * this.size; //Position
this.y = this.parent.y + Math.sin(this.absAngle) * this.size; //Position
if (iter) {
for (var i = 0; i < this.children.length; i++) {
this.children[i].updateRelative(iter, flex);
}
}
}

draw(iter) {
ctx.lineWidth = 4;
ctx.beginPath();
ctx.moveTo(this.parent.x, this.parent.y);
ctx.lineTo(this.x, this.y);
ctx.stroke();
if (iter) {
for (var i = 0; i < this.children.length; i++) {
this.children[i].draw(true);
}
}
}

follow(iter) {
var x = this.parent.x;
var y = this.parent.y;
var dist = ((this.x - x) ** 2 + (this.y - y) ** 2) ** 0.5;
this.x = x + this.size * (this.x - x) / dist;
this.y = y + this.size * (this.y - y) / dist;
this.absAngle = Math.atan2(this.y - y, this.x - x);
this.relAngle = this.absAngle - this.parent.absAngle;
this.updateRelative(false, true);
//this.draw();
if (iter) {
for (var i = 0; i < this.children.length; i++) {
this.children[i].follow(true);
}
}
}
}

class LimbSystem {
constructor(end, length, speed, creature) {
this.end = end;
this.length = Math.max(1, length);
this.creature = creature;
this.speed = speed;
creature.systems.push(this);
this.nodes = [];
var node = end;
for (var i = 0; i < length; i++) {
this.nodes.unshift(node);
//node.stiffness=1;
node = node.parent;
if (!node.isSegment) {
this.length = i + 1;
break;
}
}
this.hip = this.nodes[0].parent;
}

moveTo(x, y) {
this.nodes[0].updateRelative(true, true);
var dist = ((x - this.end.x) ** 2 + (y - this.end.y) ** 2) ** 0.5;
var len = Math.max(0, dist - this.speed);
for (var i = this.nodes.length - 1; i >= 0; i--) {
var node = this.nodes[i];
var ang = Math.atan2(node.y - y, node.x - x);
node.x = x + len * Math.cos(ang);
node.y = y + len * Math.sin(ang);
x = node.x;
y = node.y;
len = node.size;
}
for (var i = 0; i < this.nodes.length; i++) {
var node = this.nodes[i];
node.absAngle = Math.atan2(
node.y - node.parent.y,
node.x - node.parent.x
);
node.relAngle = node.absAngle - node.parent.absAngle;
for (var ii = 0; ii < node.children.length; ii++) {
var childNode = node.children[ii];
if (!this.nodes.includes(childNode)) {
childNode.updateRelative(true, false);
}
}
}
//this.nodes[0].updateRelative(true,false)
}

update() {
this.moveTo(Input.mouse.x, Input.mouse.y);
}
}

class LegSystem extends LimbSystem {
constructor(end, length, speed, creature) {
super(end, length, speed, creature);
this.goalX = end.x;
this.goalY = end.y;
this.step = 0; //0 stand still, 1 move forward,2 move towards foothold
this.forwardness = 0;

//For foot goal placement
this.reach =
0.9 *
((this.end.x - this.hip.x) ** 2 + (this.end.y - this.hip.y) ** 2) ** 0.5;
var relAngle =
this.creature.absAngle -
Math.atan2(this.end.y - this.hip.y, this.end.x - this.hip.x);
relAngle -= 2 * Math.PI * Math.floor(relAngle / 2 / Math.PI + 1 / 2);
this.swing = -relAngle + (2 * (relAngle < 0) - 1) * Math.PI / 2;
this.swingOffset = this.creature.absAngle - this.hip.absAngle;
//this.swing*=(2*(relAngle>0)-1);
}

update(x, y) {
this.moveTo(this.goalX, this.goalY);
//this.nodes[0].follow(true,true)
if (this.step == 0) {
var dist =
((this.end.x - this.goalX) ** 2 + (this.end.y - this.goalY) ** 2) **
0.5;
if (dist > 1) {
this.step = 1;
//this.goalX=x;
//this.goalY=y;
this.goalX =
this.hip.x +
this.reach *
Math.cos(this.swing + this.hip.absAngle + this.swingOffset) +
(2 * Math.random() - 1) * this.reach / 2;
this.goalY =
this.hip.y +
this.reach *
Math.sin(this.swing + this.hip.absAngle + this.swingOffset) +
(2 * Math.random() - 1) * this.reach / 2;
}
} else if (this.step == 1) {
var theta =
Math.atan2(this.end.y - this.hip.y, this.end.x - this.hip.x) -
this.hip.absAngle;
var dist =
((this.end.x - this.hip.x) ** 2 + (this.end.y - this.hip.y) ** 2) **
0.5;
var forwardness2 = dist * Math.cos(theta);
var dF = this.forwardness - forwardness2;
this.forwardness = forwardness2;
if (dF * dF < 1) {
this.step = 0;
this.goalX = this.hip.x + (this.end.x - this.hip.x);
this.goalY = this.hip.y + (this.end.y - this.hip.y);
}
}
// ctx.strokeStyle='blue';
// ctx.beginPath();
// ctx.moveTo(this.end.x,this.end.y);
// ctx.lineTo(this.hip.x+this.reach*Math.cos(this.swing+this.hip.absAngle+this.swingOffset),
// this.hip.y+this.reach*Math.sin(this.swing+this.hip.absAngle+this.swingOffset));
// ctx.stroke();
// ctx.strokeStyle='black';
}
}

class Creature {
constructor(
x,
y,
angle,
fAccel,
fFric,
fRes,
fThresh,
rAccel,
rFric,
rRes,
rThresh
) {
this.x = x; //Starting position
this.y = y;
this.absAngle = angle; //Staring angle
this.fSpeed = 0; //Forward speed
this.fAccel = fAccel; //Force when moving forward
this.fFric = fFric; //Friction against forward motion
this.fRes = fRes; //Resistance to motion
this.fThresh = fThresh; //minimum distance to target to keep moving forward
this.rSpeed = 0; //Rotational speed
this.rAccel = rAccel; //Force when rotating
this.rFric = rFric; //Friction against rotation
this.rRes = rRes; //Resistance to rotation
this.rThresh = rThresh; //Maximum angle difference before rotation
this.children = [];
this.systems = [];
}

follow(x, y) {
var dist = ((this.x - x) ** 2 + (this.y - y) ** 2) ** 0.5;
var angle = Math.atan2(y - this.y, x - this.x);
//Update forward
var accel = this.fAccel;
if (this.systems.length > 0) {
var sum = 0;
for (var i = 0; i < this.systems.length; i++) {
sum += this.systems[i].step == 0;
}
accel *= sum / this.systems.length;
}
this.fSpeed += accel * (dist > this.fThresh);
this.fSpeed *= 1 - this.fRes;
this.speed = Math.max(0, this.fSpeed - this.fFric);
//Update rotation
var dif = this.absAngle - angle;
dif -= 2 * Math.PI * Math.floor(dif / (2 * Math.PI) + 1 / 2);
if (Math.abs(dif) > this.rThresh && dist > this.fThresh) {
this.rSpeed -= this.rAccel * (2 * (dif > 0) - 1);
}
this.rSpeed *= 1 - this.rRes;
if (Math.abs(this.rSpeed) > this.rFric) {
this.rSpeed -= this.rFric * (2 * (this.rSpeed > 0) - 1);
} else {
this.rSpeed = 0;
}

//Update position
this.absAngle += this.rSpeed;
this.absAngle -=
2 * Math.PI * Math.floor(this.absAngle / (2 * Math.PI) + 1 / 2);
this.x += this.speed * Math.cos(this.absAngle);
this.y += this.speed * Math.sin(this.absAngle);
this.absAngle += Math.PI;
for (var i = 0; i < this.children.length; i++) {
this.children[i].follow(true, true);
}
for (var i = 0; i < this.systems.length; i++) {
this.systems[i].update(x, y);
}
this.absAngle -= Math.PI;
this.draw(true);
}

draw(iter) {
var r = 4;
ctx.beginPath();
ctx.arc(
this.x,
this.y,
r,
Math.PI / 4 + this.absAngle,
7 * Math.PI / 4 + this.absAngle
);
ctx.moveTo(
this.x + r * Math.cos(7 * Math.PI / 4 + this.absAngle),
this.y + r * Math.sin(7 * Math.PI / 4 + this.absAngle)
);
ctx.lineTo(
this.x + r * Math.cos(this.absAngle) * 2 ** 0.5,
this.y + r * Math.sin(this.absAngle) * 2 ** 0.5
);
ctx.lineTo(
this.x + r * Math.cos(Math.PI / 4 + this.absAngle),
this.y + r * Math.sin(Math.PI / 4 + this.absAngle)
);
ctx.stroke();
if (iter) {
for (var i = 0; i < this.children.length; i++) {
this.children[i].draw(true);
}
}
}
}

//Initializes and animates
var critter;

function setupSimple() {
//(x,y,angle,fAccel,fFric,fRes,fThresh,rAccel,rFric,rRes,rThresh)
var critter = new Creature(
window.innerWidth / 2,
window.innerHeight / 2,
0,
12,
1,
0.5,
16,
0.5,
0.085,
0.5,
0.3
);
var node = critter;
//(parent,size,angle,range,stiffness)
for (var i = 0; i < 128; i++) {
var node = new Segment(node, 8, 0, 3.14159 / 2, 1);
}
setInterval(function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
critter.follow(Input.mouse.x, Input.mouse.y);
}, 33);
}

function setupTentacle() {
//(x,y,angle,fAccel,fFric,fRes,fThresh,rAccel,rFric,rRes,rThresh)
critter = new Creature(
window.innerWidth / 2,
window.innerHeight / 2,
0,
12,
1,
0.5,
16,
0.5,
0.085,
0.5,
0.3
);
var node = critter;
//(parent,size,angle,range,stiffness)
for (var i = 0; i < 32; i++) {
var node = new Segment(node, 8, 0, 2, 1);
}
//(end,length,speed,creature)
var tentacle = new LimbSystem(node, 32, 8, critter);
setInterval(function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
critter.follow(canvas.width / 2, canvas.height / 2);
ctx.beginPath();
ctx.arc(Input.mouse.x, Input.mouse.y, 2, 0, 6.283);
ctx.fill();
}, 33);
}

function setupArm() {
//(x,y,angle,fAccel,fFric,fRes,fThresh,rAccel,rFric,rRes,rThresh)
var critter = new Creature(
window.innerWidth / 2,
window.innerHeight / 2,
0,
12,
1,
0.5,
16,
0.5,
0.085,
0.5,
0.3
);
var node = critter;
//(parent,size,angle,range,stiffness)
for (var i = 0; i < 3; i++) {
var node = new Segment(node, 80, 0, 3.1416, 1);
}
var tentacle = new LimbSystem(node, 3, critter);
setInterval(function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
critter.follow(canvas.width / 2, canvas.height / 2);
}, 33);
ctx.beginPath();
ctx.arc(Input.mouse.x, Input.mouse.y, 2, 0, 6.283);
ctx.fill();
}

function setupTestSquid(size, legs) {
//(x,y,angle,fAccel,fFric,fRes,fThresh,rAccel,rFric,rRes,rThresh)
critter = new Creature(
window.innerWidth / 2,
window.innerHeight / 2,
0,
size * 10,
size * 3,
0.5,
16,
0.5,
0.085,
0.5,
0.3
);
var legNum = legs;
var jointNum = 32;
for (var i = 0; i < legNum; i++) {
var node = critter;
var ang = Math.PI / 2 * (i / (legNum - 1) - 0.5);
for (var ii = 0; ii < jointNum; ii++) {
var node = new Segment(
node,
size * 64 / jointNum,
ang * (ii == 0),
3.1416,
1.2
);
}
//(end,length,speed,creature,dist)
var leg = new LegSystem(node, jointNum, size * 30, critter);
}
setInterval(function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
critter.follow(Input.mouse.x, Input.mouse.y);
}, 33);
}

function setupLizard(size, legs, tail) {
var s = size;
//(x,y,angle,fAccel,fFric,fRes,fThresh,rAccel,rFric,rRes,rThresh)
critter = new Creature(
window.innerWidth / 2,
window.innerHeight / 2,
0,
s * 10,
s * 2,
0.5,
16,
0.5,
0.085,
0.5,
0.3
);
var spinal = critter;
//(parent,size,angle,range,stiffness)
//Neck
for (var i = 0; i < 6; i++) {
spinal = new Segment(spinal, s * 4, 0, 3.1415 * 2 / 3, 1.1);
for (var ii = -1; ii <= 1; ii += 2) {
var node = new Segment(spinal, s * 3, ii, 0.1, 2);
for (var iii = 0; iii < 3; iii++) {
node = new Segment(node, s * 0.1, -ii * 0.1, 0.1, 2);
}
}
}
//Torso and legs
for (var i = 0; i < legs; i++) {
if (i > 0) {
//Vertebrae and ribs
for (var ii = 0; ii < 6; ii++) {
spinal = new Segment(spinal, s * 4, 0, 1.571, 1.5);
for (var iii = -1; iii <= 1; iii += 2) {
var node = new Segment(spinal, s * 3, iii * 1.571, 0.1, 1.5);
for (var iv = 0; iv < 3; iv++) {
node = new Segment(node, s * 3, -iii * 0.3, 0.1, 2);
}
}
}
}
//Legs and shoulders
for (var ii = -1; ii <= 1; ii += 2) {
var node = new Segment(spinal, s * 12, ii * 0.785, 0, 8); //Hip
node = new Segment(node, s * 16, -ii * 0.785, 6.28, 1); //Humerus
node = new Segment(node, s * 16, ii * 1.571, 3.1415, 2); //Forearm
for (
var iii = 0;
iii < 4;
iii++ //fingers
) {
new Segment(node, s * 4, (iii / 3 - 0.5) * 1.571, 0.1, 4);
}
new LegSystem(node, 3, s * 12, critter, 4);
}
}
//Tail
for (var i = 0; i < tail; i++) {
spinal = new Segment(spinal, s * 4, 0, 3.1415 * 2 / 3, 1.1);
for (var ii = -1; ii <= 1; ii += 2) {
var node = new Segment(spinal, s * 3, ii, 0.1, 2);
for (var iii = 0; iii < 3; iii++) {
node = new Segment(node, s * 3 * (tail - i) / tail, -ii * 0.1, 0.1, 2);
}
}
}
setInterval(function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
critter.follow(Input.mouse.x, Input.mouse.y);
}, 33);
}

canvas.style.backgroundColor = "transparent";
ctx.strokeStyle = "black";
//setupSimple();//Just the very basic string
//setupTentacle();//Tentacle that reaches for mouse
//setupLizard(.5,100,128);//Literal centipede
//setupSquid(2,8);//Spidery thing
//随机爬虫----------------------------------------
var legNum = Math.floor(1 + Math.random() * 12);
setupLizard(
8 / Math.sqrt(legNum),
legNum,
Math.floor(4 + Math.random() * legNum * 8)
);
//固定爬虫脚的数量----------------------------------------
/* var legNum=location.hash.substr(1);
setupLizard(1,legNum,10);//Literal centipede*/

实现效果如下,请耐心看完,不能喷!

 

 

标签:node,BAT,parent,ctx,爬虫,var,absAngle,前端开发,Math
From: https://blog.51cto.com/u_15920212/5962656

相关文章

  • 【从零开始学爬虫】采集全国历史天气数据
    l 采集网站【场景描述】采集全国历史天气数据。【源网站介绍】天气后报网提供全国历史天气查询、历史天气预报温度记录查询,历史天气数据包含全国各城市区县的最高温度、......
  • MyBatis是如何初始化的?
    摘要:我们知道MyBatis和数据库的交互有两种方式有JavaAPI和Mapper接口两种,所以MyBatis的初始化必然也有两种;那么MyBatis是如何初始化的呢?本文分享自华为云社区《MyBatis详......
  • MyBatis是如何初始化的?
    摘要:我们知道MyBatis和数据库的交互有两种方式有JavaAPI和Mapper接口两种,所以MyBatis的初始化必然也有两种;那么MyBatis是如何初始化的呢?本文分享自华为云社区《​​MyBatis......
  • 关于python网络爬虫——摘取新闻标题及链接
    Python是最近流行的编程语言,最近学习了python编程,并在网络爬虫方面进行了研究,下面给出简单实例来实现网络信息的获取步骤一:要有python开发环境,可下载python3.5版本,或anacond......
  • MyBatis的相应API与传统和代理开发的Dao层实现
    MyBatis的相应API1、SqlSession工厂构建器SqlSessionFactoryBuilder常用API:SqlSessionFactorybuild(InputStreaminputStream)通过加载mybatis的核心文件的输入流的形式构......
  • python爬虫如何模拟正常用户的访问行为?
    在Python爬虫抓取数据时,我们很容易被目标网站限制访问,这是目标网站阻止别人批量获取自己网站信息的一种方式,通常会采用封IP作为终极手段,效果非常好。针对此类情况,作为Py......
  • SSM(Spring 、SpringMVC 、Mybatis)框架整合
    1.引入依赖<!--引入spring相关--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.2.RELEAS......
  • 【编程实践】认识爬虫并手把手带手实现新闻网站的爬取
    前言什么是爬虫网络爬虫(WebSpider)又叫网络蜘蛛,或者网络机器人(在FOAF社区中间,更经常的称为网页追逐者),正如他的英文名一样,很形象的一个名字。把互联网比喻成一个蜘蛛网,......
  • 【Python】爬虫笔记-TypeError: Object of type 'method' is not JSON serializable
    最近尝试对b站做数据分析,自己边学边造轮子。b站的api返回的格式都是json,在对数据进行格式转换的过程中遇到一个令人哭笑不得的问题,特此记录下来。0x01首先获得b站的api......
  • python网络爬虫-百合网数据信息爬取+大数据可视化
    (一)、选题的背景为什么要选择此选题?要达到的数据分析目标是什么?从社会、经济、技术、数据来源等方面进行描述(200字以内)(10分)百合网是一家通过网上实名进行交友和婚恋的服......