摘要:也是就做了一个爬取煎蛋网妹子图的爬虫,并保持至本地。思路介绍通过请求报文模拟一次访问煎蛋网的操作获取到了网页的代码后,进行正则表达式匹配,得到图片地址通过图片地址,再次发送请求报文,将图片数据保存至本地思路简单了解后,便开始工作了。
“流氓不可怕,就怕流氓有文化”
前天刚考完编译,今天考完网络,就开始捣鼓代码了,花了一天时间摸索了一下nodejs的爬虫,也就是tcp,http连接。
也是就做了一个爬取煎蛋网妹子图的爬虫,并保持至本地。
思路介绍通过http请求报文模拟一次访问煎蛋网的操作
获取到了网页的HTML代码后,进行正则表达式匹配,得到图片地址
通过图片地址,再次发送http请求报文,将图片数据保存至本地
思路简单了解后,便开始工作了。
然而并不是一帆风顺 得不到HTML?参考资料http://chenxi.name/60.html,利用request包进行傻瓜式调用,然而并不能生效,将会跳转至一个屏蔽提示网页
煎蛋网为了防止恶意爬取数据,进行了一定程度的防爬措施。但这可难不倒我,为什么在浏览器上就能正常浏览图片页面呢?
于是我打开浏览器控制台,复制页面请求报文的cmd格式,粘贴至命令行中运行,能够正确得到HTML。
所以,我觉得问题就是出现在请求报文头部数据,于是复制下浏览器中报头,利用nodejs的http包,建立http连接。
require("http").get({ hostname:"jandan.net", path:"/", header:{ ... } },function(res){ })
但是奇怪的是!还是响应302,跳转至屏蔽提示页面。
最后没办法的我只好利用底层一点的api——net包,建立tcp连接,发送符合http请求报文格式的数据。
var net = require("net"); var header = require("fs").readFileSync("./header.txt").toString(); module.exports = function (path,callback) { const socket = net.createConnection(80,"jandan.net"); socket.write( "GET "+path+" HTTP/1.1 "+ header ); socket.setEncoding("utf-8"); socket.setTimeout(4000,function () { callback(html); console.error(new Error("Time OUT")); socket.end(); }); var html = ""; socket.on("data",function (chunk) { html+=chunk; }); socket.on("end",function () { console.log("disconnected from server"); }); }
header.txt
Host: jandan.net Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 Referer: http://jandan.net/v Accept-Language: zh-CN,zh;q=0.8 Cookie: gif-click-load=on; bad-click-load=on; PHPSESSID=u1gnmqnpb75injakbgvkb6r413; 4036050675=c119Yp%2BLrMWuv%2BWMyYtq3x6vTdbFzaTbUyoiLt%2Fv; jdna=596e6fb28c1bb47f949e65e1ae03f7f5#1467288596467; Hm_lvt_fd93b7fb546adcfbcf80c4fc2b54da2c=1467287791; Hm_lpvt_fd93b7fb546adcfbcf80c4fc2b54da2c=1467288598; _ga=GA1.2.330681373.1467287790
注意,header.txt最后需要两个 表示请求报头结束。最后果然是成功了,但具体两种方法的不同我也说不上来,希望有热心读者能告诉我。
数据传输同步异步?利用下面的递归方法加上Promise.all同步方法,防止过度的tcp连接(改用下面方法后,tcp读写错误明显减少,但还是会出现,不知道有没有大神帮我解决该问题呢?)
function run(i,low) { if(i{ return new Promise((resolve,reject)=>{ var req = http.get(x,function (res) { res.on("error",function (err) { console.error(err); resolve("fail"); }); var filename = x.substr(x.lastIndexOf("/")+1); download(dir+"/"+filename,res); console.log("PAGE:"+page+"..."+filename+"..."+(i+1)+"/"+a.length); resolve("done"); }).end(); }); }); Promise.all(proms) .then((values)=>{ //上一页的图片加入下载队列后,再开始递归下一页。 run(i-1,low); }); }); }
最后文件夹就像下面一样!
甩下代码地址,飙个车jandan-spider
关注我的博客moyuyc.github.io ,有技术的老司机带你飙车!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/79816.html
摘要:大家知道,一块网卡的价格其实要远远低于一颗,如此设计也使得快杰云主机的性价比得到进一步提升再看存储网公路,即用户主机和存储集群之间的通信。老刘博客之前文章有介绍过《新一代快杰云主机:计算、网络、存储,唯快不破》,描述了UCloud对标阿里云第六代云服务器的超高性价比的快杰云主机应用场景和非凡的机器性能以及客户案例。有朋友看过后,跑过来问老刘快杰云主机原理,快杰那么突出的性能是全靠CPU吗?是...
摘要:我们的目标是用爬虫来干一件略污事情最近听说煎蛋上有好多可爱的妹子,而且爬虫从妹子图抓起练手最好,毕竟动力大嘛。服务器超载尤其是对给定服务器的访问过高时。个人爬虫,如果过多的人使用,可能导致网络或者服务器阻塞。 我们的目标是用爬虫来干一件略污事情 最近听说煎蛋上有好多可爱的妹子,而且爬虫从妹子图抓起练手最好,毕竟动力大嘛。而且现在网络上的妹子很黄很暴力,一下接受太多容易营养不量,但是本着...
大家好,我是锋哥。今天就不爆照了,主要是内心比较澎湃; 刚刚 群里,段大佬发布技术搞钱交流会,如下图: 某大佬开发一套系统,卖了800万,成都买了6套房,把普通人两辈子的钱都一次性赚好了。 作为10年IT行业经验,已经看穿这个行业; 所以我也一直有个规划,技术沉淀到一定阶段,搞些有搞头的产品,招几个女大专生运维,成本控制好,产品一旦成熟,以及用户量上去,然后价格差不多的话,直接出售卖掉,起步...
摘要:大家好,我是然然。今天内心比较澎湃刚刚群里,段大佬发布技术搞钱交流会,如下图某大佬开发一套系统,卖了万,成都买了套房,把普通人两辈子的钱都一次性赚好了。 大家好,我是然然。今天内心比较澎湃; 刚刚 群里,段大佬发布技术搞钱交流会,如下图: 某大佬开发一套系统,卖了800万,成都买了6套房,...
摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...
阅读 1748·2021-10-13 09:39
阅读 1317·2019-08-30 13:58
阅读 1412·2019-08-29 16:42
阅读 3561·2019-08-29 15:41
阅读 2991·2019-08-29 15:11
阅读 2470·2019-08-29 14:10
阅读 3405·2019-08-29 13:29
阅读 2087·2019-08-26 13:27