文章目录

  • 前言
  • 准备工作
    • 创建工程
  • 今日头条爬虫代码
  • 后记

前言

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


准备工作

看过昨天的文章的话可以跳过准备工作和创建工程,直接进入今日头条街拍图片代码。
依旧是下载nodejs,真的觉得自己什么都说了,就差配置环境变量了。不过现在应该下载完直接添加环境变量了吧,或者自己到网上搜一下,一大堆。


创建工程

  1. 首先,在你想要放资源的地方创建文件夹,比如我在 E 盘里面创建了一个 myStudyNodejs 的文件夹。
  2. 在 DOS 里面进入你创建的文件夹 如图
  • 进入 e 盘:E:
  • 进入文件夹:cd myStudyNodejs(你创建的文件夹的名字)
    注意全是英文符号
  1. 初始化项目,在你创建的文件夹下面运行 npm init 初始化项目。一路回车,最后输个 yes 就行。
  2. 运行完以后,会在文件夹里面生成一个 package.json 的文件,里面包含了项目的一些基本信息。
  3. 安装所需要的包
    npm install request -save 注意因为头条是动态网页,所以无法用 cheerio 来分析网页,所以只需要这一个包就足够了
  4. 创建文件
    • 创建一个 image 文件夹用于保存图片数据。
    • 创建一个 js 文件用来写程序。比如 study.js。(创建一个记事本文件将 .txt 改为 .js)

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


今日头条爬虫代码

爬取今日头条过程中遇到的最大问题就是今日头条界面是动态生成的,图片链接存储在 script 标签中,所以不能用 cheerio 模块来解析,只能通过正则表达式进行匹配。
首先在今日头条界面搜索街拍,因为文章和图集里面的链接区别比较大,所以我们点击图集,只爬图片。
按 F12 打开开发者工具,在 network 里面找到 XHR(需要重新刷新才会出现资源)。

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

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

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

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

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

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) {   html += chunk;});//监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数res.on('end', function () {var news_item = {//获取文章的标题title: x.title,//i是用来判断获取了多少篇文章i: i = i + 1,     };console.log(news_item);     //打印信息//用来匹配script中的图片链接let reg=/http\:\\\/\\\/p\d\.pstatp\.com\\\/origin(\\\/pgc\-image)?\\\/[A-Za-z0-9]+/g;let imageList=[];imageList=html.match(reg);savedImg(imageList,x.title);//如果没访问完继续访问if (urlList.length!=0 ) {fetchPage(urlList.shift());}});}).on('error', function (err) {console.log(err);});},2000)
}
}
function savedImg(imageList,title){fs.mkdir('./image/'+title, function (err) {if(err){console.log(err)}});imageList.forEach(function(item,index){var img_title = index;//给每张图片附加一个编号var img_filename = img_title + '.jpg';//图片的url需要转换一下var img_src = 'http://'+item.substring(9); //获取图片的url//采用request模块,向服务器发起一次请求,获取图片资源request({uri: img_src,encoding: 'binary'}, function (error, response, body) {if (!error && response.statusCode == 200) {fs.writeFile('./image/'+title+'/' + img_filename, body, 'binary', function (err) {if(err){console.log(err)}});}})})
}
fetchPage(url);      //主程序开始运行

接下来在创建的文件夹下面运行

node study.js

OK,大功告成

下面是成果展示,这次不用打码了


后记

今天在网上找了一天该怎么爬动态界面也没找到类似的,最后只能用正则表达式来匹配,哪位大佬知道更好的方法望不吝赐教。这两天对基本的爬虫已经了解了,现在爬动态和静态网页大概知道从哪下手,对开发者工具的理解也稍微深了一点,下面准备尝试一下异步和并发爬取,改善一下代码,因为自己也没做过异步并发的东西,顺便也加深一下自己对这方面的概念。

nodejs 爬取动态网页相关推荐

  1. chrome动态ip python_用Python爬虫爬取动态网页,附带完整代码,有错误欢迎指出!...

    系统环境: 操作系统:Windows8.1专业版 64bit Python:anaconda.Python2.7 Python modules:requests.random.json Backgro ...

  2. python动态页面元素爬取_爬取动态网页python+Web kit

    上一篇文章爬取动态网页python+selenium+webdriver介绍了爬取动态网站的一种模拟浏览器的方法,该方法的优劣也很明显 优: 可以模拟任何人的操作,输入账号密码,点击登录等等操作 劣: ...

  3. Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)

    文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...

  4. Python爬虫爬取动态网页

    系统环境: 操作系统:Windows8.1专业版 64bit Python:anaconda.Python2.7 Python modules:requests.random.json Backgro ...

  5. 【爬虫】Selenium爬取动态网页的base64图片

    文章简介 Selenium爬取动态网页的base64图片,并解决页面完整加载缓慢,base64字符串的获取和格式转码,一些页面不存在,部分照片无法加载等问题.后附源码. 目录 1,需求 2,环境和使用 ...

  6. java爬虫系列(二)——爬取动态网页

    准备工作 项目地址 网页解析工具地址 启动网页解析器 根据系统选择所需文件 指定端口号启动工具 项目配置 seimi.properties SeimiAgentDemo.java 分析原网页代码 Bo ...

  7. python爬取动态网页图片

    爬取某知名网站图片(爬取动态网页) python爬取动态网页图片 python爬取动态网页图片 环境: python3.pycharm 库: requests.urllib.json 思路: 1.分析 ...

  8. 爬取动态网页数据的软件-抓取动态网页数据的工具

    爬取动态网页数据,随着时代的进步,互联网的发展,不管是企业还是个人都知道了数据的重要性.今天给大家分享一款免费爬取动态网页数据的软件.只要点点鼠标就能轻松爬取到你想要的数据,不管是导出还是自动发布都支 ...

  9. 【爬取动态网页-以黄河水文站数据为例】

    爬取动态网页-以黄河水文站数据为例 一.项目背景 这个项目来源于我的本科毕业设计的一部分,导师让我去搜集这方面的数据. 二.项目过程 1.问题初探 由于我前期跟着MOOC学习了python编程语言,所 ...

最新文章

  1. 几十万的词如何用每页500词分页展示_如何写出一份优秀的应届生简历?
  2. 前端渐进式框架Vue讲解
  3. springboot使用定时器及发送邮件
  4. 2020-05-16 为什么PID中的P或者说状态反馈中的K不能无限增大
  5. 计算机基础知识预备知识,计算机预备知识详解.ppt
  6. 程序员,你还要迷茫多久?
  7. 利用IKVM在C#中调Java程序
  8. 阿里P6Java工程师的学习经历自述,希望新人少走弯路
  9. vue-cli watch简单用法
  10. Mysql--mysqldump命令 备份数据库
  11. 把图片url 伪静态 php,thinkphp5系列之URL伪静态(生成优雅的URL)
  12. CMPP错误码(zzzz)
  13. 如何用微信自动添加wifi连接服务器地址,微信WiFi一键连小程序怎么用 微信怎么连接WiFi热点...
  14. opencart seo优化_「opencart seo插件」wordpress SEO插件都有哪些好用的?...
  15. 迷失在JAVA的咖啡杯中
  16. 真 · 神经网络发明人福岛邦彦获奖,Schmidhuber、李飞飞点赞
  17. 宝塔linux面板访问不了
  18. 使用freemarker生成word文档(包含遍历多条数据、图片)
  19. HDOJ 1290 献给杭电五十周年校庆的礼物
  20. PHP项目上传到华为云服务器,php项目上传到云服务器

热门文章

  1. 互联网创业者失败的18个原因
  2. 元旦:CS的陋室2021年热门文章小结——NLP技术、学习与成长
  3. Word控件Spire.Doc 6.0.77版发布| 附下载
  4. php chown,PHP chown( )用法及代码示例
  5. 怎么看电脑显卡?3个步骤,1分钟学会
  6. 便携式存储计算机技术方案,用于便携式存储器件的动态文件系统限制技术方案...
  7. 如何系统的学习3dmx?才能比较高效,这些你一定要了解
  8. MySQL与mybatis查询精华(本人总结)持续更新中
  9. 计算机考研复试专业问题锦集
  10. python多显卡支持_使用Python玩转GPU