使用Puppeteer爬取微信文章的实现

一朋友在群里问有没有什么办法能够一次性把这个链接 里的文章保存下来。点开可以看到,其实就是一个文章合集。所以需求就是,把这个文档中的链接里的文章挨个保存下来。保存形式可以有很多种,可以是图片,也可以是网页。这里因为使用 puppeteer库的原因,故选择保存格式格式为PDF。

需求解构

完成整个动作,主要分为这两个部分。获取文档内所有文章的链接;把每个链接里的内容保存为PDF文件。

对于获取链接,有两条路,一是使用request模块请求该网址获取文档;二是把网页保存到本地使用fs模块获取文档内容。拿到文档也就是整个HTML文档后,一开始没想到什么好法子来拿到全部文章链接。如果直接在网页那就好办,直接DOM的 quertSelectorAll API配合CSS选择器就可以非常方便地拿到所有 a 链接中的 href 属性。但这里是Node,是DOM外之地。又想到的是直接使用正则匹配,后来还是放弃了这个做法。在google搜了下才发现竟然忘了 cheerio 这个好东西。 cheerio 是一个专门为服务端设计的快速灵活而简洁得jQuery实现。

对于保存网页内容,我所知道的常规操作是保存为PDF文件,恰巧之前刚知道的 puppeteer 满足这样的需求。 puppeteer 是一个由 chrome devtools 团队维护的提供了控制chrome浏览器高级API的一个Node库。除去爬取网页内容保存为PDF文件外,它还可以作为服务端渲染的一个方案以及实现自动化测试的一个方案。

需求实现

获取链接

先上这部分代码

const getHref = function () {
 let file = fs.readFileSync('./index.html').toString()
 const $ = cheerio.load(file)
 let hrefs = $('#sam').find('a')
 for (e in hrefs) {
  if (hrefs[e].attribs && hrefs[e].attribs['href']) {
   hrefArr.push({
    index: e,
    href: hrefs[e].attribs['href']
   })
  }
 }
 fs.writeFileSync('hrefJson.json', JSON.stringify(hrefArr))
}

因为后面的代码都依赖到读取的文件,所以这里用的是readFileSync方法。如果没有声明返回内容的格式,那默认是Buffer格式。可以选择填写 utf8 格式,或者直接在该方法后面使用 toString 方法。

两行代码用cheerio拿到所有所有链接的DOM元素后,挨个将其处理为方便后面要用到的格式。考虑到可能存在a标签没有href属性的情况,这里还对其进行了判断,不过这也是后面调试程序时才发现的bug。

如果需要将所有的链接另外保存起来,使用 writeFile 方法。

存为PDF

同样,先上这部分代码。

const saveToPdf = function () {
 async () => {
  const browser = await puppeteer.launch({
   executablePath: './chrome-win/chrome.exe',
  });

  // 链接计数
  let i = 0

  async function getPage() {
   const page = await browser.newPage();
   await page.goto(hrefArr[i]['href'], { waitUntil: 'domcontentloaded' });

   // 网页标题
   let pageTitle

   if (hrefArr[i]['href'].includes('weixin')) {
    pageTitle = await page.$eval('meta[property="og:title"]', el => el.content)
   } else {
    pageTitle = await page.$eval('title', el => el.innerHTML)
   }

   let title = pageTitle.trim()
   // 去掉斜杆
   let titlea = title.replace(/\s*/g, "")
   // 去掉竖线
   let titleb = titlea.replace(/\|/g, "");

   await page.pdf({ path: `${i}${titleb}.pdf` });

   i++

   if (i < hrefArr.length) {
    getPage()
   } else {
    await browser.close();
   }
  }
  getPage()
 }
}

因为需要等待chrome浏览器的打开,以及其他可能的异步请求。最外层使用了async 配合箭头函数将真正的执行代码包住。

在用 npm 安装 puppetter 时,因为默认会下载chrome浏览器,而服务器在国外,一般都无法下载成功。当然也有相应的解决方案,这里我就不展开了。如果安装 puppeteer ,可以参开 这篇文章 或者直接谷歌搜下。

在前一部分说到,我们需要把不止一个链接里的内容保存为PDF,所以使用了变量 i 来标识每一次需要访问的链接。

对于获取网页标题,当时确实费了点时间才处理好拿到已有链接的网页标题。所以链接中主要有两种网站的链接,一类是微信公众号文章,另一类是新浪财新这种网站。微信文章里头没有像新浪这样直接给出 title 内容。

这个时候就要用到 page 类中的 $eval 方法, $eval 方法主要有两个参数,一是选择器,二是在浏览器上下文中执行的函数。$eval方法会页面中运行document.querySelector方法,并将其返回值传递给第二个参数,也就是我们写好的方法中。以获取新浪网页文章title为例, title 为传入选择器,我们需要的是其标签内容。

pageTitle = await page.$eval('title', el => el.innerHTML)

在产生文件名的过程中,由于文件夹还是文件路径的一部分。此时还需要考虑到windows文件路径规范。但网页中的标题并不受此规范限制,由此产生矛盾。这个问题也是后面调试的时候才发现,一开始写代码并没有想到这个问题。即需要去除标题中的斜杠竖杆还有空格等字符。

每获取完一个链接的内容后,就将链接位置标识 i + 1,知道所有链接内容保存完毕,关闭打开的网页。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 使用puppeteer爬取网站并抓出404无效链接

    检查网页无效链接 前言 自动化技术可以帮助我们做自动化测试,同样也可以帮助我们完成别的事情,比如今天我们要做的检查网站404无效链接. 原理 实现这样的功能,大致分为以下步骤: 1.打开官网首页,获取页面上所有的链接. 2.添加规则对这些链接过滤,把外链去掉. 3.遍历访问这些链接,打开打开其中的每一个链接,检查是否为404,如果是距离下来. 4.重复执行1,2,3.直到把整个网站所有的链接都遍历完. 准备 CukeTest 一款可以专业的编辑自动化脚本的工具.cuketest.com/ pup

  • Puppeteer 爬取动态生成的网页实战

    Puppeteer 相关介绍与安装不过多介绍,可通过以下链接进行学习 一.Puppeteer 开源地址 英文文档 中文社区 二.爬取动态网页 1. 需求 首先,了解下我们的需求: 爬取zoomcharts文档中 Net Chart 目录下所有访问连接对应的页面,并保存到本地 2. 研究 ZoomCharts 文档页面结构 首先,我们得研究透 ZoomCharts 页面如何加载,以及左侧导航的 DOM 树结构,才好进行下一步操作 页面首次加载 页面首次加载,左侧导航第一个目录 Introducti

  • 使用Puppeteer爬取微信文章的实现

    一朋友在群里问有没有什么办法能够一次性把这个链接 里的文章保存下来.点开可以看到,其实就是一个文章合集.所以需求就是,把这个文档中的链接里的文章挨个保存下来.保存形式可以有很多种,可以是图片,也可以是网页.这里因为使用 puppeteer库的原因,故选择保存格式格式为PDF. 需求解构 完成整个动作,主要分为这两个部分.获取文档内所有文章的链接:把每个链接里的内容保存为PDF文件. 对于获取链接,有两条路,一是使用request模块请求该网址获取文档:二是把网页保存到本地使用fs模块获取文档内容

  • python 爬取微信文章

    本人想搞个采集微信文章的网站,无奈实在从微信本生无法找到入口链接,网上翻看了大量的资料,发现大家的做法总体来说大同小异,都是以搜狗为入口.下文是笔者整理的一份python爬取微信文章的代码,有兴趣的欢迎阅读 #coding:utf-8 author = 'haoning' **#!/usr/bin/env python import time import datetime import requests** import json import sys reload(sys) sys.setd

  • python爬取微信公众号文章

    本文实例为大家分享了python爬取微信公众号文章的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup from requests.exceptions import RequestException import time import random import MySQLdb import threading import socket import math soc

  • c# 基于Titanium爬取微信公众号历史文章列表

    github:https://github.com/justcoding121/Titanium-Web-Proxy 什么是Titanium 基于C#的跨平台异步HTTP(S)代理服务器 类似的还有: https://github.com/http-party/node-http-proxy 原理简述 对于HTTP 顾名思义,其实代理就是一个「中间人」角色,对于连接到它的客户端来说,它是服务端:对于要连接的服务端来说,它是客户端.它就负责在两端之间来回传送 HTTP 报文. 对于HTTPS 由于

  • python爬取微信公众号文章图片并转为PDF

    遇到那种有很多图的微信公众号文章咋办?一个一个存很麻烦,应朋友的要求自己写了个爬虫.2.0版本完成了!完善了生成pdf的功能,可根据图片比例自动调节大小,防止超出页面范围,增加了序号方面查看 #-----------------settings--------------- #url='https://mp.weixin.qq.com/s/8JwB_SXQ-80uwQ9L97BMgw' print('jd3096 for king 2.0 VIP8钻石永久会员版') print('愿你远离流氓软

  • itchat和matplotlib的结合使用爬取微信信息的实例

    前几天无意中看到了一片文章,<用 Python 爬了爬自己的微信朋友(实例讲解)>,这篇文章写的是使用python中的itchat爬取微信中朋友的信息,其中信息包括,昵称.性别.地理位置等,然后对这些信息进行统计并且以图像形式显示.文章对itchat的使用写的很详细,但是代码是贴图,画图使用R中的包画,我对着做了一遍,并且把他没有贴画图的代码做了一遍,画图是使用matplotlib.由于他没有贴代码,所以我把我写的贴出来供以后复制. 首先是安装itchat的包,可以使用清华大学的镜像:pip

  • python使用webdriver爬取微信公众号

    本文实例为大家分享了python使用webdriver爬取微信公众号的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- from selenium import webdriver import time import json import requests import re import random #微信公众号账号 user="" #公众号密码 password="" #设置要爬取的公众号列表 gzlist=['香河微服务

  • Python爬虫爬取微信朋友圈

    接下来,我们将实现微信朋友圈的爬取. 如果直接用 Charles 或 mitmproxy 来监听微信朋友圈的接口数据,这是无法实现爬取的,因为数据都是被加密的.而 Appium 不同,Appium 作为一个自动化测试工具可以直接模拟 App 的操作并可以获取当前所见的内容.所以只要 App 显示了内容,我们就可以用 Appium 抓取下来. 1. 本节目标 本节我们以 Android 平台为例,实现抓取微信朋友圈的动态信息.动态信息包括好友昵称.正文.发布日期.其中发布日期还需要进行转换,如日期

  • Python爬取微信读书实现读书免费自由

    目录 前情提要 爬取小说 白嫖小说 大家好,我是小五 前情提要 不知道用微信读书的朋友多不多,这里顺便安利一下哈. 我目前看电子书的话基本都是在用微信读书,毕竟白嫖的无限卡真香. 在微信读书上,不仅很多正版的Python书籍电子书可以直接看,还可以在阅读的同时看别人写的标注. 但是无限卡对于小说不太友好,只能阅读开头的章节,后面的章节就需要变相付费了. 虽然知道番茄小说,七猫小说这种都能免费看,但是实在不愿意为了一部小说再多下一个软件. 幸亏微信读书出了一个功能--可以自己上传书籍,支持支持tx

  • 使用python itchat包爬取微信好友头像形成矩形头像集的方法

    初学python,我们必须干点有意思的事!从微信下手吧! 头像集样例如下: 大家可以发朋友圈开启辨认大赛哈哈~ 话不多说,直接上代码,注释我写了比较多,大家应该能看懂 import itchat import os import PIL.Image as Image from os import listdir import math import sys print("请输入查询模式:0-显示所有好友头像,但最终矩形头像集最后一行可能残缺:1-头像集为完整矩形,但好友可能不全,即在0模式下舍弃

随机推荐