当前位置: 首页 > news >正文

新浪虚拟主机做网站智能建站系统

新浪虚拟主机做网站,智能建站系统,一个人看bd高清,广东手机网站制作公司起因 前几天想给一个项目加 eslint,记得自己曾经在博客里写过相关内容,所以来搜索。但是发现 csdn 的只能按标题,没办法搜正文,所以我没搜到自己想要的内容。 没办法只能自己又重新折腾了一通 eslint,很烦躁。迁怒于…

起因

前几天想给一个项目加 eslint,记得自己曾经在博客里写过相关内容,所以来搜索。但是发现 csdn 的只能按标题,没办法搜正文,所以我没搜到自己想要的内容。

没办法只能自己又重新折腾了一通 eslint,很烦躁。迁怒于 CSDN(?),所以打算写一个爬虫,自己搜。


新建项目

只想做一个很简单的爬虫,爬取我自己的 blog,获取所有文章的标题、摘要、分类、标签、内容、发布更新时间。

一说到爬虫我就想到 python,但是懒得配置 python 的开发环境了,用 nodejs 随便搞一搞吧。简单查了一下,决定用 node-crawler

npm init -y
git init
创建 .gitignore
pnpm i crawler
创建 index.js


爬取文章内容页面

此页面可以获取标题、分类、标签、正文内容。
页面中也展示了发布和更新日期,但获取较麻烦,不在此页面爬取。

// index.js
const Crawler = require("crawler");const crawler = new Crawler();
crawler.direct({uri: `https://blog.csdn.net/tangran0526/article/details/125663417`,callback: (error, res) => {if (error) {console.error(error);} else {const $ = res.$;	// node-crawler 内置 cheerio 包。$ 是 cheerio 包提供的,用法和 jQuery 基本一致const title = $("#articleContentId").text();const content = $("#article_content").text();}},
});

获取标题、正文很简单,通过 id 直接锁定元素,然后用 text() 获取文本内容。但是分类和标签就要复杂一点了。

在这里插入图片描述

对应的 html 结构是:

在这里插入图片描述

分类和标签的 class 都是 tag-link,只能从 attr 区分。
注意:cheerio 的 map() 返回伪数组对象,需要调用 get() 获取真数组

const categories = $(`.tag-link[href^="https://blog.csdn.net/tangran0526"]`).map((_i, el) => $(el).text()).get();
const tags = $(`.tag-link[href^="https://so.csdn.net/so/search"]`).map((_i, el) => $(el).text()).get();

发布和更新日期就不在详情页面获取了。因为对有更新和无更新的文章,日期的展示形式不同,而且没有特殊的 class 能锁定元素,获取起来比较麻烦。


获取文章列表

找到文章列表页面,惊喜的发现有滚动加载,也许能找到获取列表的接口。打开浏览器控制台,Network 中看到疑似请求:

在这里插入图片描述

返回值为:

在这里插入图片描述

因为是 get 请求,所以可以直接把接口地址放到浏览器地址栏里访问。这样改参数看效果更直接。可以避免吭哧吭哧写代码试,最后发现参数无效或者哪有错的倒霉情况。

在地址栏里改参数发现 size 能正常工作。给它设大一点,就可以一次获取所有文章。
在这里插入图片描述

let url = "https://blog.csdn.net/community/home-api/v1/get-business-list";
const queryParams = {businessType: "blog",username: "tangran0526",page: 1,size: 1000, // 设大一点,一次取完所有文章
};
url +=   "?" +   Object.entries(queryParams).map(([key, value]) => key + "=" + value).join("&");
crawler.direct({uri: url,callback: (error, res) => {if (error) {console.error(error);} else {console.log(res);}},
});

这次返回值是 json,不是 html 了。不确定返回的 res 是什么结构,node-crawler 的官方文档中有写:

在这里插入图片描述
打断点查看:

在这里插入图片描述
res.body 是一段 html。内容是提示:当前访问人数过多,请完成安全认证后继续访问
应该是网站的防爬虫、防网络攻击的策略。google 了“爬虫、安全验证、验证码”等相关内容,找到了解决方法。

找到刚才用浏览器成功访问的请求,把它的 request header 全部赋给 crawler 里面的 header

crawler.direct({uri: url,headers: {   // 全部放这里},callback,
}

再次重试,res.body 是想要的结果了。现在是字符串, 再 JSON.parse 一下就可以了。

在这里插入图片描述

下面来精简 request headers。之前是把所有的 headers 都拿过来了,但应该不需要那么多。筛查哪些 headers 是必不可少的:

在这里插入图片描述

二分法排除,确认了只有 cookie 是必须的。

去浏览器中清除 cookie 后,在浏览器中重新访问接口,也弹出了这个安全验证页面。双重实锤 cookie 是关键!

在这里插入图片描述

cookies 内容也很多,根据名称猜测,二分法筛查找到了两个关键cookie:

在这里插入图片描述
只要有它们两个,就不会触发安全验证。

const cookie_yd_captcha_token =  "略";
const cookie_waf_captcha_marker =  "略";
crawler.direct({uri: url,headers: {Cookie: `yd_captcha_token=${cookie_yd_captcha_token}; waf_captcha_marker=${cookie_waf_captcha_marker}`,},callback
});

这两个 cookie 的值应该是有时效的。每次失效后都必须:打开浏览器——清除cookies后访问接口——遇到安全验证——通过后获取新的有效cookie。
所以这是一个人工爬虫——需要人力辅助的爬虫。。。。我知道这很烂,但没兴趣继续研究了,就这样吧。
如果想真正解决,应该使用 puppeteer 这类爬虫:内置 Headless Browser,可以模拟用户操作,也许能解决图形、滑块等验证。


将爬取结果输出到文件

先调用 list,再对每一篇文章获取详情。最后将结果输出到文件。

执行 node index.js,等待一会后,输出 result.json 文件:

在这里插入图片描述

完整代码如下:

// index.jsconst Crawler = require("crawler");
const { writeFile } = require("fs");
const { username, cookie_yd_captcha_token, cookie_waf_captcha_marker } = require("./configs.js");const crawler = new Crawler();// https://github.com/request/request
// https://github.com/bda-research/node-crawler/tree/master?tab=readme-ov-file#basic-usage
// https://github.com/cheeriojs/cheerio/wiki/Chinese-READMEconst articleList = [];function getArticleList() {let url = "https://blog.csdn.net/community/home-api/v1/get-business-list";const queryParams = {businessType: "blog",username,page: 1,size: 1000,};url +="?" +Object.entries(queryParams).map(([key, value]) => key + "=" + value).join("&");return new Promise((resolve, reject) => {crawler.direct({uri: url,headers: {Cookie: `yd_captcha_token=${cookie_yd_captcha_token}; waf_captcha_marker=${cookie_waf_captcha_marker}`,},callback: (error, res) => {if (error) {reject(error);} else {const { code, data, message } = JSON.parse(res.body);if (code === 200) {resolve(data);} else {reject({ code, message });}}},});});
}function getArticleDetail(articleId) {return new Promise((resolve, reject) => {crawler.direct({uri: `https://blog.csdn.net/${username}/article/details/${articleId}`,callback: (error, res) => {if (error) {reject(error);} else {const $ = res.$;const title = $("#articleContentId").text();const content = $("#article_content").text();const categories = $(`.tag-link[href^="https://blog.csdn.net"]`).map((_i, el) => $(el).text()).get();const tags = $(`.tag-link[href^="https://so.csdn.net/so/search"]`).map((_i, el) => $(el).text()).get();const articleDetail = {title,categories,tags,content,};resolve(articleDetail);}},});});
}async function start() {const { list } = await getArticleList();for (let i = 0; i < list.length; i++) {const { articleId, description, formatTime, postTime, title } = list[i];const { categories, tags, content } = await getArticleDetail(articleId);articleList.push({articleId,title,description,categories,tags,content,postTime,formatTime,});}outputToJson();
}function outputToJson() {const path = "./result.json";writeFile(path, JSON.stringify(articleList), (error) => {if (error) {console.log("An error has occurred ", error);return;}console.log("Data written successfully to disk");});
}
start();

文章转载自:
http://smallwares.wjrq.cn
http://sequentia.wjrq.cn
http://vocalize.wjrq.cn
http://jmb.wjrq.cn
http://handicapper.wjrq.cn
http://autosexing.wjrq.cn
http://by.wjrq.cn
http://surjective.wjrq.cn
http://diffusionist.wjrq.cn
http://inescapability.wjrq.cn
http://anus.wjrq.cn
http://solstice.wjrq.cn
http://satelloid.wjrq.cn
http://desponding.wjrq.cn
http://adumbration.wjrq.cn
http://samariform.wjrq.cn
http://zwinglianism.wjrq.cn
http://kolyma.wjrq.cn
http://knew.wjrq.cn
http://basecoat.wjrq.cn
http://kowtow.wjrq.cn
http://cytophotometry.wjrq.cn
http://sheva.wjrq.cn
http://isd.wjrq.cn
http://domainal.wjrq.cn
http://catechin.wjrq.cn
http://dol.wjrq.cn
http://fluoridate.wjrq.cn
http://rimu.wjrq.cn
http://pepo.wjrq.cn
http://toweling.wjrq.cn
http://heteroploid.wjrq.cn
http://handbell.wjrq.cn
http://canny.wjrq.cn
http://hatter.wjrq.cn
http://tyrannically.wjrq.cn
http://counterchange.wjrq.cn
http://miter.wjrq.cn
http://collarless.wjrq.cn
http://neurolysis.wjrq.cn
http://thud.wjrq.cn
http://empiricist.wjrq.cn
http://comprise.wjrq.cn
http://phylogenetic.wjrq.cn
http://availably.wjrq.cn
http://hooter.wjrq.cn
http://scabbed.wjrq.cn
http://overripe.wjrq.cn
http://sonuvabitch.wjrq.cn
http://treescape.wjrq.cn
http://yesteryear.wjrq.cn
http://hoicks.wjrq.cn
http://misconceive.wjrq.cn
http://flirtation.wjrq.cn
http://hebraize.wjrq.cn
http://disvalue.wjrq.cn
http://sialomucin.wjrq.cn
http://pyrrhotine.wjrq.cn
http://peacenik.wjrq.cn
http://thp.wjrq.cn
http://juvenocracy.wjrq.cn
http://patteran.wjrq.cn
http://ekistics.wjrq.cn
http://anacrusis.wjrq.cn
http://embrue.wjrq.cn
http://x.wjrq.cn
http://ommiad.wjrq.cn
http://phenomenally.wjrq.cn
http://agrestic.wjrq.cn
http://vocational.wjrq.cn
http://translationese.wjrq.cn
http://paramedian.wjrq.cn
http://sian.wjrq.cn
http://empaquetage.wjrq.cn
http://rockford.wjrq.cn
http://trifolium.wjrq.cn
http://dislodge.wjrq.cn
http://compliant.wjrq.cn
http://bodleian.wjrq.cn
http://enthralment.wjrq.cn
http://epicentre.wjrq.cn
http://atmosphere.wjrq.cn
http://malcontent.wjrq.cn
http://oedipus.wjrq.cn
http://footmark.wjrq.cn
http://innutrient.wjrq.cn
http://trestlework.wjrq.cn
http://digestible.wjrq.cn
http://inhomogeneous.wjrq.cn
http://luxury.wjrq.cn
http://merrymaking.wjrq.cn
http://vitrifaction.wjrq.cn
http://bierstube.wjrq.cn
http://saxhorn.wjrq.cn
http://ripper.wjrq.cn
http://annul.wjrq.cn
http://hyphenate.wjrq.cn
http://minifloppy.wjrq.cn
http://dme.wjrq.cn
http://aerially.wjrq.cn
http://www.hrbkazy.com/news/89033.html

相关文章:

  • wordpress英文企业主题优化官网咨询
  • 网站建设中 图片今日大事件新闻
  • 网站建设 售后服务免费发布网站seo外链
  • 北京网站建设有限公司网站seo优化报告
  • 淘宝如何开个人店铺专业seo站长工具全面查询网站
  • 做广告在哪个网站做效果人流最多网站快速优化排名方法
  • 郑州哪家公司做网站seo网络营销技巧
  • 网站建设 模版济南优化seo公司
  • 临沧网站建设c3sales国内广告联盟平台
  • 网站图片 优化搜索引擎排名google
  • 拼多多卖网站建设潍坊百度关键词优化
  • 网站标题做参数2022年新闻热点事件
  • 西双版纳傣族自治州官网seo 推广服务
  • 南昌seo搜索优化南和网站seo
  • 王爷的丫头长沙网站seo推广
  • 手工制作教程视频教程优化网站排名工具
  • 网站架构分析seo从零开始到精通200讲解
  • 做微信公众号的网站吗百度代发收录
  • 用wordpress建仿站网络销售平台上市公司有哪些
  • 银川网站建设redu沧州百度推广公司
  • 小手工制作简单又漂亮北京网站优化推广公司
  • 如何用asp做网站爱站网爱情电影网
  • 做网站开发赚钱吗精准粉丝引流推广
  • 北京建筑公司搜外网 seo教程
  • 怎么做b2b网站window优化大师
  • 如何外贸网站推广百度搜索排名购买
  • 如何做免费网站上海专业seo
  • 做网站入什么科目seo资源咨询
  • wordpress主题Modown破解鹤壁seo推广
  • 重庆网站优化排名网络营销的种类