Shell 网络爬虫 的完整指南

在这里插入图片描述


以下是 Shell 网络爬虫 的完整指南,涵盖基础爬取、数据解析、反爬机制应对及自动化实践,适用于静态网站数据采集和简单动态内容抓取!



一、Shell 网络爬虫核心原理

1. 技术栈

组件作用示例工具
HTTP 客户端发送 HTTP 请求(GET/POST)curlwget
HTML 解析提取特定数据(标题、链接、文本)grepsedawk
数据存储保存结果(文本、CSV、Excel)echoprintfcsvkit
调度与扩展分页抓取、定时任务、分布式执行xargsparallelcron

二、基础爬虫示例

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"

七、工具链推荐

  1. HTTP 客户端:curl(最轻量)、wget(断点续传)。
  2. HTML 解析:xmllint(XML/HTML 解析)、pup(Perl XML 解析器)。
  3. 数据清洗:csvkit(CSV 处理)、awk(文本处理)。
  4. 可视化:gnuplot(图表生成)、wordcloud(词云)。
  5. 调度:Airflow(复杂工作流)、Prefect(Python 工作流)。

八、常见问题与解决方案

1. 被封 IP

• 解决方案:
• 使用代理池(如 Tor、Shadowsocks)。
• 限制请求频率(如每 5 秒 1 次)。
• 启用 Tor 路径:curl --socks5-hostname 127.0.0.1:9050 "https://example.com"

2. 动态内容无法抓取

• 解决方案:
• 使用 SeleniumPlaywright(需浏览器支持)。
• 分析 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 脚本构建高效、灵活的网络爬虫,满足数据采集、竞品分析、市场监控等需求!如果有具体需求,欢迎进一步讨论。 🕵️♂️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独隅

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值