资讯动态

旧电脑装Ubuntu跑Python爬虫:从系统选型到定时任务全流程

发布时间:2026/10/5 10:57:30 来源:尧图企业网站定制
家里那台2006年的品牌机奔腾4 3.0GHz的处理器1GB DDR2内存80GB IDE硬盘开机进Windows XP都得等两分钟装个Win7基本就是折磨。本想送去回收站后来想通了一条路给它装Ubuntu 14.04只跑Python爬虫和定时自动化任务。结果这台老古董不但活过来了还在墙角7x24小时跑了几个月没关机。这篇就把从装系统、配Python、写爬虫、做定时调度的完整过程和踩坑记录写下来手里有旧机器想让它再发挥余热的朋友可以直接照着抄。1. 老电脑复活第一步硬件评估和系统选型1.1 06年老电脑的硬件底子要怎么评估先别急着下载ISO先搞清楚这台机器到底是个什么配置。06年前后的电脑硬件跨度挺大高端有刚出的Core 2 Duo低端有赛扬D、奔腾4。跑Linux服务器版判断标准很简单CPU主频有没有1GHz以上、内存有没有512MB以上、硬盘有没有10GB可用空间。只要满足这三条跑爬虫和自动化任务就没有问题。我手里这台是奔腾4 3.0GHz单核1GB DDR2内存80GB IDE硬盘板载显卡64MB显存。单看CPU其实不算弱P4 3.0GHz跑点轻量任务还是可以的真正的瓶颈是内存和磁盘。IDE硬盘的随机读写性能很差安装系统和编译软件会明显感觉到慢这个要有心理准备。内存1GB跑图形界面会吃力但如果只跑服务器版不带桌面装完系统空闲内存大概就200MB左右跑Python完全够。评估的时候还要看一个东西BIOS是否支持USB启动。06年的主板大部分支持但有些老板子对U盘启动支持不好启动时可能识别不到。如果USB启动不了退路是刻光盘。另外如果机器里有原装IDE硬盘建议先检查硬盘健康状态用HD Tune或者MHDD扫一下坏道。我遇到过一块三星80GB老盘扫出十几个坏道系统装到一半卡死换了个160GB的IDE盘才顺利。老硬盘老化是经常出问题的点系统装到一半报I/O错误多半就是硬盘不行了。还有一个容易忽略的坑CMOS电池。06年的机器到现在的纽扣电池多半已经没电了表现就是关机断电后系统时间重置开机显示2005年1月1日。如果不管这个直接装系统后面会引发一堆怪问题比如wget下载证书校验失败、apt更新报签名错误、Python爬HTTPS站点报SSL错误。所以动手之前先把电池换了或者装完系统第一时间校时。1.2 为什么选Ubuntu 14.04而不是追新版系统很多人上来就问既然要用Linux为什么不用最新版Ubuntu原因很实在新版系统对老硬件不友好。现在的Ubuntu从20.04之后基本放弃了对32位架构的支持安装镜像要么没有i386版本要么装了也跑不顺。06年的机器如果装的是32位系统最新版Ubuntu根本没办法正常安装。而Ubuntu 14.04是最后一批对32位硬件支持完善的LTS版本之一安装镜像还能找到i386版。再看性能。Ubuntu 14.04是2014年发布的内核3.13图形栈还是Xorg加Unity桌面整个系统设计的年代就比现在早对奔腾4这种老CPU没有额外的性能负担。当然我不建议装桌面装server版更好。server版没有图形界面默认占用内存少系统干净更符合爬虫服务器的定位。装完系统直接SSH上去操作反正跑爬虫也不需要显示器。还有一个实际因素教程多。Ubuntu 14.04年代久远当年大量教程都是基于这个版本的从换软件源到装Python、配置cron随便搜索都能找到答案。虽然它已经停止维护了但有old-releases源可以用软件包依然能下载自己用完全没问题。同期的Debian 8/9其实也是个选择但Ubuntu系的教程和信息密度更高对新手更友好。这里要明确一个态度老系统一旦联网安全性无法保证不要拿它做任何暴露在公网的关键服务。关掉不需要的端口只做内网爬虫和定时任务这是玩老机器的基本原则。1.3 装Ubuntu 14.04 server版的关键步骤与避坑安装前先去把ISO下载下来推荐ubuntu-14.04.6-server-i386.iso注意后缀是i386代表32位版。如果已经确认CPU是64位比如Core 2 Duo也可以下amd64版不过06年的机器很多还是32位系统保守起见用i386更稳。写入U盘的方法有很多Windows下用Rufus选DD镜像模式写入。Linux下直接dd就行。如果主板不支持U盘启动刻一张CD也行Ubuntu 14.04的CD安装没有问题只是光盘读取慢安装时间会长一些。安装过程我挑几个关键点说。语言选择建议选英文不要问我为什么中文locale在老系统上偶尔会出现乱码和安装界面文本缺失的问题英文最稳。键盘布局默认就好如果你的键盘是中文输入习惯装完再改。分区是重点。我建议手动分区而不是用整盘自动分区/分区给8-10GB用于系统和软件swap分区给2GB老机器内存小swap能救命如果想以后存数据再留一个/data分区爬虫数据放那里手动分区的操作其实不复杂选Manual然后选择磁盘按提示创建一个ext4根分区和一个swap分区搞定。这里有个坑06年主板很多把硬盘设成IDE模式如果BIOS里已经是AHCI模式安装时也能识别SATA盘但IDE模式的兼容性更好尤其是老硬盘建议BIOS里确认一遍。软件包选择那一步勾选OpenSSH server这样装完就能远程操作不用一直守着显示器。system utilities保持默认。装完后拔掉U盘重启登录后用sudo apt-get update确认软件源是否正常如果报404之类的错误说明要用old-releases源这个后面专门讲。装完系统后做两件小事第一把SSH服务设为开机自启14.04默认就是第二设置一个静态IP在/etc/network/interfaces里配置避免DHCP每次分配的IP不一样导致后面crontab脚本连不上。静态IP配置大致是这样的auto eth0 iface eth0 inet static address 192.168.1.88 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 192.168.1.1配置完重启网络或重启机器SSH连上去这台老电脑的基础算是打好了。2. Python环境搭建老系统上的版本选择和编译细节2.1 系统自带Python和编译新版本怎么权衡Ubuntu 14.04系统自带Python 2.7.6和Python 3.4.3。这两个版本都能用但都有明显限制。Python 2.7早就停止维护了而Python 3.4是2014年的版本现在的requests、urllib3等库的新版本基本都要求Python 3.6以上。更麻烦的是老版本的OpenSSL系统自带1.0.1配合Python 3.4的ssl模块访问一些现代网站时会出现TLS握手失败或证书校验问题。所以在老系统上配Python要先决定走哪条路方案A直接用系统自带的Python 3.4。优点是不需要编译省时间缺点是用不了新库。pip最高只能升到19.1requests只能装2.21.0左右BeautifulSoup可以装4.9.x爬一些老站点或简单HTTP接口问题不大。如果目标网站是老牌网站没有强制TLS 1.3这个方法完全可行。方案B手动编译Python 3.6.15。3.6是最后一个能很舒服地在老系统上编译的大版本兼容性好第三方库覆盖面广很多库直到2023年还支持Python 3.6。我实测下来在glibc 2.19的Ubuntu 14.04上编译Python 3.6.15非常顺利_ssl模块能正常编译访问大多数网站只要TLS 1.2就行没有问题。两个方案我推荐直接选B。虽然编译要花点时间但换来的是更顺手的依赖安装和更好的网络兼容性。下面把编译全流程写清楚。2.2 编译安装Python 3.6.15的完整流程编译前先把系统依赖装全避免编译到一半报错。执行sudo apt-get update sudo apt-get install -y build-essential zlib1g-dev libssl-dev libffi-devbuild-essential是编译工具链包含了gcc、make等zlib1g-dev是Python压缩模块的依赖libssl-dev提供OpenSSL头文件如果没有它编译出来的Python不会有ssl模块爬虫访问HTTPS站点会直接失败libffi-dev是ctypes模块需要的。然后下载并解压源码wget https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tar.xz tar xf Python-3.6.15.tar.xz cd Python-3.6.15configure这一步要说明一下。我用的是./configure --prefix/usr/local/python3.6把Python装到独立的/usr/local/python3.6目录下这样和系统的Python 3.4互不干扰不会破坏系统自带的包管理器依赖。然后就是漫长的编译老机器上这一步特别考验耐心。P4 3.0GHz编译Python大概需要半个小时到四十分钟正好趁这个时间去把本章后面pip配置的事情准备好。执行make -j2 sudo make altinstall注意是altinstall不是install。altinstall不会覆盖系统里的python3软链接只安装python3.6这是老系统上避免把系统搞坏的关键操作。编译完验证一下/usr/local/python3.6/bin/python3.6 -V /usr/local/python3.6/bin/python3.6 -c import ssl; print(ssl.OPENSSL_VERSION)如果import ssl报错说明OpenSSL头文件没装全回头检查libssl-dev。如果提示找不到OpenSSL但头文件确实装了可以在configure时指定路径./configure --prefix/usr/local/python3.6 --with-openssl/usr这个坑我踩过后来发现是Ubuntu 14.04的OpenSSL老版本在某些配置下自动检测不到需要手动指定。不过大部分情况下安装libssl-dev后默认配置就能过。编译完成后建议顺手设置一下环境变量在/etc/profile.d/python3.6.sh里写入export PATH/usr/local/python3.6/bin:$PATH这样之后登录就能直接敲python3.6不用输全路径。2.3 pip、虚拟环境和镜像源Python 3.6自带pip但版本不是最新的先升级一下/usr/local/python3.6/bin/python3.6 -m pip install --upgrade pipPython 3.6能用的最高pip版本是21.3.1再新的pip会拒绝在3.6上安装。升级完之后建议装一个虚拟环境工具。Python 3.6自带venv模块直接这样用就行mkdir -p /home/oldpc/spider cd /home/oldpc/spider /usr/local/python3.6/bin/python3.6 -m venv venv source venv/bin/activate虚拟环境会解决一个很现实的问题老系统上系统级包不能乱动万一装错依赖把系统搞坏整个机器都得重来。在虚拟环境里怎么造都行装坏了删掉目录重建一个就行成本很低。因为默认pip源是国外的老机器网络又慢这里建议配置国内镜像。创建~/.pip/pip.conf文件[global] index-url https://mirrors.aliyun.com/pypi/simple/ trusted-host mirrors.aliyun.com配置完执行pip install requests beautifulsoup4速度会快很多。如果要用lxml建议也装上解析HTML性能好不少但老CPU编译lxml会很慢耐心等待或者直接换用Python自带的html.parser解析器。我实测在P4上编译lxml大概需要五分钟以上但效果值得看你需求。3. 爬虫脚本实战抓取数据的基本框架与健壮性设计3.1 爬虫程序的结构与请求策略老电脑跑爬虫最大的优势是它不需要一直盯着放在那跑就行了。但要注意别把目标网站搞挂。我写爬虫程序时遵循这么几个原则第一单线程足够。06年的机器CPU性能摆在那多线程爬虫反而会因为GIL和上下文切换降低效率而且单线程更容易控制请求频率。如果确实需要并发ramping到双线程已经是极限多开几个进程效果反而好但占内存。爬虫这活儿慢就是快稳定才有意义。第二请求头要伪造得合理。很多网站会检查User-Agent直接放一个正常的浏览器UArequests库默认的python-requests/x.x.x一眼就会被识别为爬虫。最简单的做法是自定义一个UAHEADERS { User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8, Accept-Language: zh-CN,zh;q0.8,en-US;q0.5,en;q0.3 }第三加超时和重试。网络请求不可能百分百成功设置5-10秒超时失败后重试2-3次这是爬虫程序的基本素养。第四控制频率并遵守规则。每次请求之间至少间隔几秒并且要检查目标站点的robots.txt。这一点不是技术问题是伦理和合规底线。不要伪造身份、不要绕验证码、不要突破登录鉴权只抓公开允许抓取的数据。3.2 requests与BeautifulSoup抓取代码实例老系统上的爬虫代码和现代Linux上没什么区别Python逻辑完全一样。下面给一个完整示例以本地测试服务为例演示保证能跑通。先在老电脑上起一个简单的HTTP服务做靶子mkdir -p /tmp/testweb echo htmlbodydiv classitema href/1标题一/a/divdiv classitema href/2标题二/a/div/body/html /tmp/testweb/index.html cd /tmp/testweb python3.6 -m http.server 8080 然后写爬虫脚本spider.pyimport re import time import sqlite3 import requests from bs4 import BeautifulSoup UA {User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/91.0.4472.101} BASE_URL http://127.0.0.1:8080/index.html DB_PATH /home/oldpc/spider/data.db def fetch(url): for attempt in range(3): try: resp requests.get(url, headersUA, timeout10) resp.raise_for_status() return resp.text except requests.RequestException as e: print(第{}次请求失败: {}.format(attempt 1, e)) time.sleep(5) return None def parse_and_save(html): soup BeautifulSoup(html, html.parser) items [] for a in soup.select(.item a): text a.get_text(stripTrue) href a.get(href) if text and href: items.append((text, href)) conn sqlite3.connect(DB_PATH) conn.execute(CREATE TABLE IF NOT EXISTS items(title TEXT, href TEXT)) conn.executemany(INSERT INTO items VALUES(?, ?), items) conn.commit() conn.close() print(本轮抓取 {} 条已写入数据库.format(len(items))) if __name__ __main__: html fetch(BASE_URL) if html: parse_and_save(html) time.sleep(5)代码里有两个小细节resp.raise_for_status()会把HTTP 4xx/5xx状态码当作异常抛出不需要手动判断状态码数据库连接每次都打开关闭避免长时间挂着一个连接导致SQLite锁定问题。这个脚本在老机器上跑一次从请求到入库整个过程用不了一秒完全在P4的承受范围内。真实爬虫场景下只要把BASE_URL换成目标地址再把.item a这个选择器换成目标网站的HTML结构就可以直接复用。如果目标站点返回的不是完整HTML而是JSON接口解析逻辑就更简单了直接用resp.json()取字段。3.3 反爬机制的基础应对与合规边界网站的反爬手段主要分几类检查User-Agent、检查请求频率、验证Session/Cookie、要求JavaScript渲染。对老电脑跑轻量爬虫来说能用上的应对手段不多但基础的一定要做维护一个固定UA池每次请求随机换一个每次请求后sleep随机时间控制在3到8秒之间把请求参数伪装成真实浏览器的请求头顺序遇到403暂时性拒绝时退避重试不要硬怼对于需要登录的页面如果目标站点的服务条款不允许爬取那就不要想办法绕过。老电脑跑爬虫本来就是靠水滴石穿的理念追求的是长时间稳定跑而不是短时间高效突破。真正值得做的数据采集目标是那些公开可读、robots.txt允许抓取的页面。这里顺便说一句服务端防护的话题。很多开发者会问怎么防止爬虫那通常是另一篇文章的内容核心思路包括频率限制、校验UA、校验Cookie、动态页面渲染等。但作为爬虫使用者我更建议把精力放在如何规范、低速、不打扰目标网站地采集数据上而不是研究怎么绕过防护。守住这个边界技术才能用得安心。4. 自动化落地定时调度与无人值守运行4.1 crontab定时任务的写法与调试爬虫写好了接下来要让它定时自动跑这才是自动化三个字的含义。Linux下最朴素的定时工具就是cronUbuntu 14.04默认安装了cron服务直接用。编辑定时任务crontab -e插入类似这样的规则# 每天凌晨2点跑一次主采集脚本 0 2 * * * cd /home/oldpc/spider ./venv/bin/python spider.py /var/log/spider.log 21 # 每6小时跑一次增量更新 0 */6 * * * cd /home/oldpc/spider ./venv/bin/python update.py /var/log/update.log 21cron的语法是五个星段分钟、小时、日、月、星期。0 2 * * *表示每天凌晨2点0分执行0 */6 * * *表示每隔6小时的第0分钟执行。日志重定向是重点 /var/log/spider.log 21把标准输出和错误输出都追加到同一份日志这样出错了能第一时间看到。调试cron任务有个经验写完先手动执行一遍脚本确认没有错误再改下cron时间改成两分钟后观察日志是否真的触发。很多新手写完crontab发现跑不起来原因多半是脚本里的绝对路径写错了。记住cron执行时的环境变量和登录shell不一样没有~/.bashrc里的PATH设置所以脚本里凡是出现python最好都写成绝对路径或者像上面那样通过cd进目录后调用虚拟环境里的python。定时任务跑一段时间后记得定期看日志。我会写一个极简的shell脚本check.sh每天检查日志文件大小和最新记录时间如果一个小时内没有新的日志行说明脚本卡死或者机器有问题马上人工介入ALL/var/log/spider.log if [ -f $ALL ] [ $(stat -c %Y $ALL) -lt $(date -d 1 hour ago %s) ]; then echo spider log too old, check it now fi这套东西不复杂但能让你发现问题的速度从几天后偶然发现变成当天就能察觉。4.2 防止脚本重复运行与崩溃自愈定时任务有一个常见隐患上一次任务还没跑完下一次又启动了。尤其是爬虫这种可能因为网络慢而跑很久的任务如果被重复触发内存和磁盘会被迅速耗尽。解决办法是给脚本加锁用flock命令。写一个包装脚本run_spider.sh#!/bin/bash exec 9/tmp/spider.lock flock -n 9 || exit 1 cd /home/oldpc/spider ./venv/bin/python spider.py /var/log/spider.log 21flock -n在拿不到锁时直接退出不会排队等待保证同一时刻只会有一个爬虫进程在跑。如果脚本因为异常退出了锁会自动释放下一次cron触发又能正常跑。再进一步如果定时任务因为网络原因失败了可以做简单的自愈在脚本里写重试逻辑或者用cron做一个看门狗。比如写一个watchdog.sh每5分钟检查一次爬虫进程是否存在如果不存在就重新拉起来#!/bin/bash if ! pgrep -f spider.py /dev/null; then cd /home/oldpc/spider nohup ./venv/bin/python spider.py /var/log/spider.log 21 fi在crontab里加上*/5 * * * * /home/oldpc/spider/watchdog.sh。这样即使主任务挂了5分钟内会被重新拉起比人肉盯日志靠谱得多。这两个脚本看下来老电脑在角落里无人值守跑上一整年不是问题。4.3 老电脑7x24小时运行的稳定性保障老机器长时间运行真正的坑不在软件而在硬件。首先是散热。06年的品牌机机箱风扇和CPU风扇用了十几年轴承多少都有噪音和卡顿。我看到老电脑CPU温度接近80度的时候果断换了风扇清了一遍灰温度稳定在50度以下。长时间运行建议装一个lm-sensors看温度sudo apt-get install lm-sensors sudo sensors-detect --auto sensors其次是内存。1GB的DDR2内存跑Python勉强够用但如果数据量积累多了SQLite查询变慢、内存占用变大可能会触发OOM。解决办法是增加swap空间。Ubuntu 14.04装完系统后swap是安装时分好的2GB如果空间紧张还可以再补一个swap文件sudo dd if/dev/zero of/swapfile bs1M count1024 sudo mkswap /swapfile sudo swapon /swapfile echo /swapfile none swap sw 0 0 | sudo tee -a /etc/fstab再一个就是断电重启后的自启动。如果机器的ACPI配置支持通电自动开机在BIOS里把Restore on AC Power Loss设为Power On断电再通电后机器自动启动。系统起来后cron的reboot指令可以让爬虫自动恢复reboot /home/oldpc/spider/watchdog.sh这个组合保证断电重启后cron自动拉起watchdogwatchdog拉起爬虫整套系统不需要人工介入就能回到工作状态。5. 常见问题排查与性能调优实录5.1 Ubuntu 14.04软件源失效的修复Ubuntu 14.04在2019年就停止支持了之后archive.ubuntu.com上的源默认访问会直接404或者返回空内容所以apt-get update会报错。解决办法是切换到old-releases.ubuntu.com这个专门存放EOL版本的源。先备份原配置文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后用sed把源地址全部替换sudo sed -i s/archive.ubuntu.com/old-releases.ubuntu.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/old-releases.ubuntu.com/g /etc/apt/sources.list再执行sudo apt-get update。如果还报错检查一下文件里security.ubuntu.com的替换情况手动打开sources.list确认每一行都是old-releases.ubuntu.com开头。这个坑很典型处理完源编译、装依赖这些问题都会轻松很多。5.2 Python依赖安装失败的版本锁坑老系统上装Python依赖最容易遇到的问题就是找不到匹配版本。因为Python 3.6虽然能用的库很多但最新版本的某些包已经放弃对3.6的支持。比如最新版requests2.32.x其实还支持3.7以上但有些库的更新日志明确写着requires Python 3.8。我在实际使用中会坚持一套版本组合直接从requirements.txt里锁定requests2.25.1 beautifulsoup44.9.3 lxml4.6.3这套版本在Python 3.6上实测兼容没有任何依赖冲突。注意pip install requests时如果自动装到了较新的版本遇到问题就手动指定版本降级。另外Python 3.6的pip是21.3.1此时安装一些老版本库可能会出现兼容性警告不影响使用别慌。如果安装某个库时提示需要编译C扩展比如lxml在老CPU上会很慢。等不了的话就换用Python内置的html.parser代码里把BeautifulSoup(html, html.parser)改一下就行功能上的差距对简单页面几乎感觉不到。5.3 性能实测与最终配置清单这台老机器最终稳定运行后我记录了一些实际数据系统空闲内存约220MBPython爬虫进程常驻内存约90MB单次抓取解析入库耗时约0.6秒受网站响应速度影响每天全量抓取100个页面累计耗时约15分钟CPU占用峰值不超过50%长时间运行后物理内存占用1GB中约占350MBswap基本不被动用这些数据说明一个结论06年的机器跑现代爬虫任务瓶颈不在CPU在网络延迟和磁盘I/O。只要控制好频率它完全可以当一个专用数据采集节点。最终的软件配置清单如下系统Ubuntu 14.04.6 server i386Python3.6.15编译安装到/usr/local/python3.6虚拟环境venv位于/home/oldpc/spider/venv核心依赖requests 2.25.1、beautifulsoup4 4.9.3、lxml 4.6.3定时调度crontab flock锁 watchdog脚本存储SQLite数据库每天自动清理三个月前的旧数据这套配置从稳定运行的角度看已经足够轻快。如果哪天想上更大的数据量可以考虑把SQLite换成PostgreSQL或者外接一块SSD做数据库盘但那样就脱离老电脑复活的初衷了。最后聊一点个人心得。06年的机器跑攻防渗透、图形桌面、3D渲染那是痴心妄想但跑爬虫和定时任务就像用菜刀切豆腐性能绰绰有余。我当初差点把它卖废品现在它每天固定跑三次采集还会自动把我需要的报表生成到局域网共享目录里偶尔我会远程上去看看日志一切安稳。技术这回事不一定要追最新把合适的工具放在合适的位置上老机器一样能干漂亮活。这台古董的下一站我打算再给它接一个USB蓝牙模块让它把小区里的环境传感器数据定时攒起来继续当我的基础设施钉子户。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑