PostCrawler是一个用于爬取网站:技术文章摘抄上的文章的爬虫
| 组件或工具 | 版本 | 链接 |
|---|---|---|
| Ubuntu 22.04.5 LTS (Jammy Jellyfish) | 22.04(桌面版) | https://releases.ubuntu.com/jammy/ |
| Python | 3.10 | Ubuntu22.04预载Python3.10 |
| Deno | 2.0.6 | https://deno.com/ |
| Chrome Browser | 64 位 .deb(适用于 Debian/Ubuntu) | https://www.google.com/chrome/ |
| single-file-cli | / | https://github.com/gildas-lormeau/single-file-cli |
curl -fsSL https://deno.land/install.sh | sh
- 使用Ubuntu自带的FireFox浏览器访问Chrome官网下载
google-chrome-stable_current_amd64.deb - 执行以下命令安装
sudo apt install ./google-chrome-stable_current_amd64.deb
引用自组件的github
- Download and unzip manually the master archive provided by Github
unzip master.zip . cd single-file-cli-master
- Make
single-fileexecutable (Linux/Unix/BSD etc.).chmod +x single-file
最后一步,将single-file加入bash path:
vim ~/.bashrc在最后一行添上:
# singlefile-folder-path是你解压出来的singlefile目录路径
export PATH={singlefile-folder-path}:$PATH之后,重新打开一个窗口,或在当前窗口执行以下命令使环境变量生效:
source ~/.bashrc
python crawler.py [-h] [--posts_limit POSTS_LIMIT] [--links_limit LINKS_LIMIT] [--timeout TIMEOUT] [--output_dir OUTPUT_DIR] url
| 参数 | 必选 | 说明 |
|---|---|---|
| help | 否 | 列举脚本参数及说明 |
| url | 是 | 要爬取的页面的链接,但实际上这个脚本只适配了技术文章摘抄这个网站首页的页面结构,所以一般是写死的;有需要的话可以自己改造脚本来适应不同网站的页面结构 |
| posts_limit | 否 | 技术文章摘抄首页的一个文章合集我称为一个posts(例如,10x程序员工作法就是一个posts),这个参数用于限制爬虫最终爬取的文章合集的数量,例如,当使用 --posts_limit 1 作为参数时,表示只会爬取第一个文章合集;不指明该参数时,将会爬取所有文章合集 |
| links_limit | 否 | 这个参数用于设置爬虫最终爬取文章合集中的文章的数量,当使用 --links_limit 1 作为参数时,表示只会爬取每个文章合集里的第一篇文章;不指明该参数时,将会爬取文章合集里的所有文章 |
| timeout | 否 | 这个参数用于指定HTML文件下载间隔,防止触发网站的反爬虫措施。不指定该参数时默认设置为30s |
| output_dir | 否 | 指定要下载文件的保存目录,不指明该参数时,将默认在脚本所在目录下创建一个以posts_{timestamp}命名的目录;指定目录后,脚本会在下载每个文件前查看目录下是否已经存在该文件,存在则跳过 |
python crawler.py "https://learn.lianglianglee.com"执行后,会在脚本所在的目录下创建一个以posts_{timestamp}命名的目录,并将技术文章摘抄首页的所有文章下载到该目录
| Task | Status |
|---|---|
| 完成脚本的第一个版本 | ✔ |
| 将脚本执行过程中产生的日志输出到日志文件中 | ✔ |
| 加入重试机制。所有导出任务完成后重新下载那些没有下载成功的html | ✔ |
| 加入下载超时机制。若某条链接下载时超过指定时间仍未能下载完成,则打印错误日志,之后直接下载下一条连接 | ✔ |
| 加入断点续传机制。新增一个指定下载目录的参数,下载HTML前会判断目录中是否已存在该文件,若存在则跳过 | ✔ |