以下是 Shell 网络爬虫 的完整指南,涵盖基础爬取、数据解析、反爬机制应对及自动化实践,适用于静态网站数据采集和简单动态内容抓取!
Shell 网络爬虫 的完整指南
一、Shell 网络爬虫核心原理
1. 技术栈
组件 | 作用 | 示例工具 |
---|---|---|
HTTP 客户端 | 发送 HTTP 请求(GET/POST) | curl 、wget |
HTML 解析 | 提取特定数据(标题、链接、文本) | grep 、sed 、awk |
数据存储 | 保存结果(文本、CSV、Excel) | echo 、printf 、csvkit |
调度与扩展 | 分页抓取、定时任务、分布式执行 | xargs 、parallel 、cron |
二、基础爬虫示例
1. 简单网页抓取
# 使用 curl 下载网页内容
curl -s "https://example.com" -o example.html
# 提取标题(假设标题在 <h1> 标签中)
grep -oP '(?<=<h1>).*(?=</h1>)' example.html | sed 's/<.*?>/ /g'
2. 结构化数据提取(CSV)
# 抓取电商商品列表
curl -s "https://example.com/products" | grep -oP '(?<=<div class="product">).*?(?=</div>)' | sed -E 's/.*?<title>(.*?)<\/title>.*?<price>(.*?)<\/price>.*/\1,\2/'
输出示例:
Product A, $99.99
Product B, $149.99
# 转换为 CSV 文件
echo -e "Product,Price" && cat parsed_data.txt | awk -F',' '{print $1","$2}' > products.csv
三、高级爬虫功能
1. 处理分页
# 自动翻页抓取(假设分页参数为 page)
for page in {1..10}; do
curl -s "https://example.com/page/$page" -o page_$page.html
done
# 合并所有页面内容
cat page_*.html | grep -oP '(?<=<article>).*(?=</article>)' > all_content.txt
2. 用户代理伪装
# 随机 User-Agent(避免被封)
USER_AGENT=$(curl -s https://www.userstack.com/free?dist=linux&lang=en-US | grep -oP '(?<=User-Agent: ).*(?= )' | head -n1)
curl -A "$USER_AGENT" -s "https://example.com"
3. 遵守 robots.txt
# 检查是否允许爬取
curl -s -D "User-Agent: MyCrawler" -I "https://example.com/robots.txt" | grep -q "Disallow: /"
if [ $? -eq 0 ]; then
echo "禁止爬取,终止任务"
exit 1
fi
四、反爬机制应对
1. 限制请求频率
# 每秒最多 1 个请求(避免被封)
for url in $(cat urls.txt); do
curl -s "$url"
sleep 1
done
2. 处理验证码
# 使用 OCR 工具(如 Tesseract)识别图片验证码
curl -s "https://example.com/captcha" -o captcha.png
tesseract captcha.png stdout -l eng
3. 动态内容抓取(Selenium)
# 安装 Selenium WebDriver
docker run -d --name selenium-server selenium/standalone-chrome
# 使用 WebDriver 抓取动态加载内容
curl -X POST "http://localhost:4444/wd/hub/session" \
-H "Content-Type: application/json" \
-d '{"capabilities":{"browserName":"chrome"}}'
五、数据存储与分析
1. 导出为 Excel
# 使用 awk 转换 CSV 为 Excel(需安装 csvkit)
csvsort -k1 products.csv | csvformat -t excel > products.xlsx
2. 数据可视化
# 生成词云(需安装 wordcloud)
cat text_data.txt | tr ' ' '\n' | sort -rf | uniq -c | awk '{print $2,$1}' | wordcloud
六、自动化调度
1. 每日定时抓取
# 编写爬虫脚本(save_data.sh)
#!/bin/bash
curl -s "https://example.com/daily-news" | grep -oP '(?<=<标题>).*(?=</标题>)' > news.txt
# 添加定时任务(每小时执行)
* * * * * /path/to/save_data.sh >> /var/log/crawler.log 2>&1
2. 分布式爬虫(多节点)
# 使用 SSH 在多台机器并行执行
ssh user@node1 "bash /path/to/crawler.sh"
ssh user@node2 "bash /path/to/crawler.sh"
七、工具链推荐
- HTTP 客户端:
curl
(最轻量)、wget
(断点续传)。 - HTML 解析:
xmllint
(XML/HTML 解析)、pup
(Perl XML 解析器)。 - 数据清洗:
csvkit
(CSV 处理)、awk
(文本处理)。 - 可视化:
gnuplot
(图表生成)、wordcloud
(词云)。 - 调度:
Airflow
(复杂工作流)、Prefect
(Python 工作流)。
八、常见问题与解决方案
1. 被封 IP
• 解决方案:
• 使用代理池(如 Tor、Shadowsocks)。
• 限制请求频率(如每 5 秒 1 次)。
• 启用 Tor 路径:curl --socks5-hostname 127.0.0.1:9050 "https://example.com"
2. 动态内容无法抓取
• 解决方案:
• 使用 Selenium
或 Playwright
(需浏览器支持)。
• 分析 JavaScript渲染后的 DOM(如使用 Puppeteer
)。
3. 处理编码问题
# 自动检测编码并转换(UTF-8 优先)
curl -s "https://example.com" | iconv -f ISO-8859-1 -t UTF-8
九、实战案例:电商价格监控
1. 场景需求
• 目标:监控 Amazon 商品价格变动(每小时一次)。
• 输出:价格趋势 CSV + 异常报警(价格波动 >10%)。
2. 脚本实现
#!/bin/bash
PRODUCT_URL="https://amazon.com/product/12345"
PRICE_REGEX='(?<=<span class="a8Pemb">).*?(?=</span>)'
# 获取当前价格
CURRENT_PRICE=$(curl -s "$PRODUCT_URL" | grep -oP "$PRICE_REGEX")
# 计算波动率(与历史数据对比)
HISTORY_FILE="price_history.csv"
if [ -f "$HISTORY_FILE" ]; then
OLD_PRICE=$(tail -n1 "$HISTORY_FILE" | awk -F',' '{print $2}')
FLUCTUATION=$(echo "$CURRENT_PRICE $OLD_PRICE" | awk '{printf "%.2f%%\n", ($2-$1)/$1*100}')
if [ $(echo "$FLUCTUATION > 10" | bc -l) -eq 1 ]; then
echo "$(date): 价格波动超过 10%!当前价格:$CURRENT_PRICE" | mail -s "Price Alert" admin@example.com
fi
fi
# 更新历史记录
echo "$(date +%Y-%m-%d %H:%M:%S), $CURRENT_PRICE" >> "$HISTORY_FILE"
通过以上指南,你可以用 Shell 脚本构建高效、灵活的网络爬虫,满足数据采集、竞品分析、市场监控等需求!如果有具体需求,欢迎进一步讨论。 🕵️♂️