nodejs 爬取动态网页,web前端开发面试


昨天实现了草榴的爬取 nodejs 做一个简单的爬虫爬草榴,今天对代码做了一部分修改,增加了可以指定开始页和结束页,并且给所有文件都单独创建了文件夹。那么问题来了,说好的爬 街拍图片 呢?毕竟爬完草榴的东西并不适合展示,所以,今天又尝试了一下爬今日头条的街拍图片。Talk is cheap,show me the code,废话不多说,直接进入正题。

图1


准备工作


看过昨天的文章的话可以跳过准备工作和创建工程,直接进入今日头条街拍图片代码。

依旧是下载nodejs,真的觉得自己什么都说了,就差配置环境变量了。不过现在应该下载完直接添加环境变量了吧,或者自己到网上搜一下,一大堆。


创建工程
  1. 首先,在你想要放资源的地方创建文件夹,比如我在 E 盘里面创建了一个 myStudyNodejs 的文件夹。

  2. 在 DOS 里面进入你创建的文件夹 如图

  • 进入 e 盘:E:

  • 进入文件夹:cd myStudyNodejs(你创建的文件夹的名字)

注意全是英文符号

  1. 初始化项目,在你创建的文件夹下面运行 npm init 初始化项目。一路回车,最后输个 yes 就行。

  2. 运行完以后,会在文件夹里面生成一个 package.json 的文件,里面包含了项目的一些基本信息。

  3. 安装所需要的包

npm install request -save 注意因为头条是动态网页,所以无法用 cheerio 来分析网页,所以只需要这一个包就足够了

  1. 创建文件
  • 创建一个 image 文件夹用于保存图片数据。

  • 创建一个 js 文件用来写程序。比如 study.js。(创建一个记事本文件将 .txt 改为 .js)

说明 –save 的目的是将项目对该包的依赖写入到 package.json 文件中。

图1


今日头条爬虫代码


爬取今日头条过程中遇到的最大问题就是今日头条界面是动态生成的,图片链接存储在 script 标签中,所以不能用 cheerio 模块来解析,只能通过正则表达式进行匹配。

首先在今日头条界面搜索街拍,因为文章和图集里面的链接区别比较大,所以我们点击图集,只爬图片。

按 F12 打开开发者工具,在 network 里面找到 XHR(需要重新刷新才会出现资源)。

图2

因为界面是动态生成的,所以我们要找的 URL 全都存在这里面。

点开 data,找到我们需要的 URL。

这里写图片描述

这里注意一点,这个 url 里面用的是 http 的请求,并且路径上面多了一个 group,所以我们要重新拼接一下。

x.url=‘https://www.’+x.url.substring(7,19)+‘a’+x.url.substring(25);

接下来就是发起请求,获取界面数据。我们所需要的图片路径如下。

图4

分析几个页面图片的路径得出我们需要使用的正则表达式

let reg=/http:\/\/p\d.pstatp.com\/origin(\/pgc-image)?\/[A-Za-z0-9]+/g;

这个正则表达式不难,但是应该是我写过的最长的了,其中 \/pgc-image 这一段有的图片路径没有,所以用 ? 来匹配 0 次或 1 次。注意不要匹配最后的 \,不然无法正确获取路径。 接下来就是把获取的文件保存下来。匹配下来的 URL 是 http://\ 这种模式,需要自己重新设置。

var img_src = ‘http://’+item.substring(9);

接下来,就是把图片下载到本地。

下面是完整源码

/*

  • @Author: user

  • @Date: 2018-04-30 12:25:50

  • @Last Modified by: user

  • @Last Modified time: 2018-04-30 22:02:59

*/

var https =require(‘https’);

var http = require(‘http’);

var fs = require(‘fs’);

var request = require(‘request’);

let startPage=0;//从哪一页开始爬

let page=startPage;

let endPage=1;//爬到哪一页

//初始请求地址

var url=‘https://www.toutiao.com/search_content/?offset=’+startPage*20+‘&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=3&from=gallery’

var i = 0;

//用来判断存储还是访问

var temp=0;

//存储首页url

urlList=[];

//封装了一层函数

function fetchPage(x) {

setTimeout(function(){

startRequest(x); },2000)

}

//首先存储要访问界面的url

function getUrl(x){

temp++;

https.get(x,function(res){

var html = ‘’;

res.setEncoding(‘binary’);

res.on(‘data’, function (chunk) {

html += chunk;

});

res.on(‘end’, function () {

html = JSON.parse(html);//由于获取到的数据是JSON格式的,所以需要JSON.parse方法浅解析

for(let i of html.data){

var obj1={title:i.title,url:i.article_url};

urlList.push(obj1)

}

page++;

if(page<=endPage){

let tempUrl=‘https://www.toutiao.com/search_content/?offset=’+page*20+‘&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=3&from=gallery’;

getUrl(tempUrl);

}

else{

fetchPage(urlList.shift());

}

})

}).on(‘error’, function (err) {

console.log(err);

});

}

function startRequest(x) {

if(temp===0){

getUrl(x);

}

else{

//采用http模块向服务器发起一次get请求,截取的字符串为文章链接地址

x.url=‘https://www.’+x.url.substring(7,19)+‘a’+x.url.substring(25);

setTimeout(function(){

https.get(x.url, function (res) {

var html = ‘’; //用来存储请求网页的整个html内容

res.setEncoding(‘binary’);

//监听data事件,每次取一块数据

res.on(‘data’, function (chunk) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里免费领取

前端面试题宝典

前端校招面试题详解

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里免费领取

[外链图片转存中…(img-IG7IjPIV-1712196346571)]

[外链图片转存中…(img-b9U1FfDD-1712196346572)]

[外链图片转存中…(img-z4tycbwu-1712196346572)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值