前言
写给广大网友: 如果不是为了作业我甚至不会写这篇博客, 这篇博客没有任何技术参考价值, 反而可能给各位造成误导, 请各位慎重参考莫要完全置信!
写给助教: 大多数内容是我学习笔记直接Paste上来的...未必代表我的学习顺序.
任务: 安装环境
小任务: 安装node.js
直接从node.js官网上下载即可
小任务: 使用npm
如果要安装某个模块, 只要使用npm i 命令即可.
npm i xxxx
爬虫需要的模块是:
const my_encoding = "utf-8";
const request = require('request');
const myIconv = require('iconv-lite');
const myCheerio = require('cheerio');
const fs = require('fs');
const { stringify } = require('qs');
安装express就能覆盖其中大部分的需要.
小任务: 下载jQuery
从jQuery官网上下载它, 点击链接选择链接另存为, 在网页中使用的时候需要先将jQuery写入网页.
任务: 爬取网页
小任务: 学会使用request
request的第一个参数包括请求头, url, 编码方式等信息, 代表请求; 第二个参数代表回调函数, 其中body部分相当于网页中的document对象
//重新包装后柯里化的request函数
let my_req = (callback) => (url) => {
let options = {
url: url,
encoding: null,
headers: headers,
timeout: 1000
}
try {
request(options, (error, response, body) => {//request的第一个参数包括请求头, url, 编码方式等信息, 代表请求; 第二个参数代表回调函数, 其中body部分相当于网页中的document对象
try {
if (!error && response.statusCode === 200)
callback(body);
else {
console.error("访问 " + url + " 超时, 原因可能是网络不佳或爬虫被屏蔽 " + error + " " + response);
fails++, console.log("有" + fails + "次请求中的失败");
}
} catch (e) { console.log("回调" + url + " 时出现错误 " + e) }
})
} catch (e) { console.error("访问不成功, 可能是非法的url格式, 或回调函数中出现了错误" + e); }
}
小任务: 用正则表达式匹配新闻网页的url
分支小任务: 初步掌握Js类和对象
Js是一种动态语言, 因此它的对象并不是通过声明来固定某种类型, 而是通过调用构造函数生成对象并将它赋值给某个变量.
对象的成员变量(或叫属性)和函数(或叫方法).
分支小任务: 获得一个正则表达式
只需要调用正则表达式的构造函数或者通过简便写法'/a/'就行.
var regexp = new RegExp("a");
var regexp_ = /a/;
正则表达式能够作为字符对象match函数的参数(模式串)使用, match函数的返回值是一个子串, 使得其存在从第0个字符开始的子串能够与模式串匹配.
分支小任务: 正则表达式的匹配逻辑
由于在Leetcode上写过正则表达式那个题, 所以我对两种特殊的模式串'.'和'*'还是比较熟悉的.
bool isMatch(string &s, string &p, int _s = 0, int _p = 0) {
if (_p + 1 < p.size() && p[_p + 1] == '*') {
if (isMatch(s, p, _s, _p + 2)) return true;
for (int i = 1; _s + i - 1 < s.size(); i++) {
if (p[_p] != '.' && p[_p] != s[_s + i - 1]) break;
if (isMatch(s, p, _s + i, _p + 2)) return true;
}
return false;
}
if (_s >= s.size() && _p >= p.size()) return true;
if (_s >= s.size() || _p >= p.size()) return false;
return (p[_p] == '.' || p[_p] == s[_s]) && (isMatch(s, p, _s + 1, _p + 1));
}
能匹配一类字符的特殊字符: '\d'匹配所有数字和'\w'匹配所有字母; '[abc]'匹配方括号内的任意一个字符.
决定匹配次数的特殊字符: '*'匹配它前面的字符任意次(包括0次); '?'匹配它前面的字符0次或1次; '+'匹配它前面的字符1次或更多次.
决定匹配开始和结束的特殊字符: '^'待匹配串的开头是模式串; '$'它之前的待匹配串的结尾是模式串.
分支小任务: 解析新闻网页的url并写出正确的正则表达式
一个网页是新浪主页上的新闻网页, 当网页的url不是.html就是.shtml或者.phtml结尾, 且用https://作为开头.
var news_reg = /https?:\/\/[\S]*.s?p?html$/;