楼主: W1608162031217B
21 0

[教育经济学基本知识] 爬虫入门与实战:从原理到实践的完整指南 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-8-30
最后登录
2018-8-30

楼主
W1608162031217B 发表于 4 小时前 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

在数据驱动的当下,网络爬虫(Web Crawler)已经成为获取公开信息的重要手段。无论是用于市场分析、舆情监控,还是为机器学习项目构建训练数据集,爬虫技术都发挥着不可或缺的作用。本文将系统介绍爬虫的核心原理、常用工具、开发流程及合规要点,并通过一个合法、无反爬机制的实战案例,帮助你快速掌握基础技能。

理解网络爬虫的基本概念

网络爬虫,也被称为网页蜘蛛或网络机器人,是一种能够自动访问互联网页面并提取信息的程序。它模拟人类浏览行为,向目标网站发送 HTTP 请求,获取响应内容后,对其中的数据进行解析与结构化处理,最终将结果存储为本地文件或写入数据库。

典型的爬虫工作流程包含以下环节:

  • 发起请求:向指定 URL 发送 HTTP/HTTPS 请求;
  • 接收响应:获取服务器返回的 HTML、JSON 或其他格式数据;
  • 内容解析:利用正则表达式、XPath 或 CSS 选择器提取关键信息;
  • 数据存储:将提取结果保存为 CSV 文件、数据库记录或上传至云存储;
  • 任务调度与去重:管理待抓取链接队列,避免重复采集相同页面。
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get('https://example.com', headers=headers)
print(response.text)

主流爬虫工具与框架介绍

Requests + BeautifulSoup —— 入门首选组合

对于初学者而言,Python 中的 Requests 库配合 BeautifulSoup 是最友好的选择。

  • Requests:简洁高效的 HTTP 客户端库,用于发送网络请求;
  • BeautifulSoup:支持 HTML 和 XML 解析,可通过 CSS 选择器或 XPath 提取节点内容。

该组合适用于静态网页抓取,学习成本低,代码可读性强。

Scrapy —— 高效专业的爬虫框架

Scrapy 是一个功能完整的异步爬虫框架,内置请求调度器、中间件系统、数据管道和去重机制,适合处理大规模、高并发的数据采集任务。其模块化设计便于扩展,广泛应用于企业级项目中。

Selenium —— 动态内容抓取利器

面对由 JavaScript 渲染的页面(如使用 AJAX、React 或 Vue 构建的站点),传统方法无法获取完整 DOM 结构。Selenium 可操控真实浏览器(如 Chrome、Firefox),实现自动化操作,从而捕获动态加载后的页面内容。

Playwright 与 Puppeteer —— 新一代浏览器自动化工具

Playwright(支持 Python 和 Node.js)和 Puppeteer(基于 Node.js)是近年来迅速发展的替代方案,具备更优性能和更强功能,包括多浏览器支持、无头模式运行、页面截图、PDF 导出等,逐渐成为 Selenium 的有力竞争者。

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, 'html.parser')
titles = soup.select('h2.title a')  # 使用 CSS 选择器
for title in titles:
    print(title.get_text(), title['href'])

爬虫开发的标准流程

第一步:目标网站分析

在编码前,应先手动浏览目标页面,观察以下几个方面:

  • 所需数据是否存在于原始 HTML 源码中?(可通过右键“查看网页源代码”确认)
  • 是否需要登录授权?是否存在验证码、IP 封禁等反爬策略?
  • URL 是否具有规律性?(例如分页参数变化、时间戳传递)

借助浏览器开发者工具(F12 打开),切换到 Network 面板,可以追踪实际发出的请求,有时直接调用后端 API 接口比解析整个 HTML 更高效、稳定。

第二步:发送请求并获取响应

以 Python 的 Requests 库为例,发送 GET 请求获取网页内容时,建议设置合理的请求头信息,尤其是 User-Agent,以模拟普通用户访问,降低被识别为爬虫的风险。

import csv

with open('articles.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['标题', '链接'])
    for title in titles:
        writer.writerow([title.get_text(), title['href']])

第三步:解析网页内容

假设我们需要提取页面中的所有文章标题,可以使用 BeautifulSoup 结合标签结构进行定位,通过 find_all 或 select 方法精准抓取文本节点。

try:
    response = requests.get(url, timeout=10)
    response.raise_for_status()
except requests.RequestException as e:
    print(f"请求失败: {e}")

第四步:持久化存储数据

提取完成后,可将结构化数据写入 CSV 文件,便于后续分析。Python 内置的 csv 模块即可完成此任务,也可选用 pandas 进行更灵活的处理。

<li>
  <span class="date">2025-11-15</span>
  <a href="/sj/zxfb/202511/t20251115_1960235.html">2025年10月份国民经济运行情况</a>
</li>

第五步:应对反爬机制与异常处理

常见的反爬手段包括:

  • IP 限制:采用代理池轮换出口 IP 地址;
  • 频率控制:添加 time.sleep() 延迟请求间隔;
  • 验证码拦截:结合 OCR 技术或第三方打码服务解决;
  • User-Agent 检测:随机更换请求头中的浏览器标识;
  • JavaScript 加密渲染:改用 Selenium、Playwright 等工具执行脚本后抓取内容。

同时,必须加入 try-except 异常捕获机制,确保程序在网络错误、超时或解析失败时不会中断运行。

import requests
from bs4 import BeautifulSoup
import csv
import time
import os

def scrape_nbs_latest_reports():
    url = "http://www.stats.gov.cn/sj/zxfb/"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36"
    }

    try:
        print("正在请求国家统计局最新发布页面...")
        response = requests.get(url, headers=headers, timeout=10)
        response.encoding = 'utf-8'  # 国家统计局使用 UTF-8 编码
        response.raise_for_status()
    except Exception as e:
        print(f"请求失败: {e}")
        return

    soup = BeautifulSoup(response.text, 'html.parser')
    items = soup.select('ul.list li')  # 定位所有新闻条目

    reports = []
    for item in items:
        date_tag = item.find('span', class_='date')
        link_tag = item.find('a')
        
        if date_tag and link_tag:
            pub_date = date_tag.get_text(strip=True)
            title = link_tag.get_text(strip=True)
            full_url = "http://www.stats.gov.cn" + link_tag['href'] if link_tag['href'].startswith('/') else link_tag['href']
            reports.append([pub_date, title, full_url])

    # 保存到 CSV
    os.makedirs('data', exist_ok=True)
    with open('data/nbs_latest_reports.csv', 'w', newline='', encoding='utf-8-sig') as f:
        writer = csv.writer(f)
        writer.writerow(['发布日期', '标题', '详情链接'])
        writer.writerows(reports)

    print(f"? 抓取完成!共获取 {len(reports)} 条最新发布信息,已保存至 data/nbs_latest_reports.csv")

if __name__ == '__main__':
    scrape_nbs_latest_reports()
    time.sleep(1)  # 礼貌性延迟,尊重服务器

实战演练:采集国家统计局“最新统计月报”信息

为了规避版权争议和反爬风险,我们选取中华人民共和国国家统计局官网(http://www.stats.gov.cn)作为目标站点。该平台发布大量政府公开数据,其“最新发布”栏目定期更新《统计月报》《国民经济运行情况》等权威报告,适合作为教学案例。

本次任务目标:抓取“最新发布”页面中最近几期《统计月报》的标题及其发布时间。

合规说明:根据《政府信息公开条例》,国家统计局发布的数据属于法定公开信息,公民有权依法获取。本案例仅用于技术学习,不涉及任何敏感或个人信息,符合法律法规要求。

页面结构分析

进入国家统计局首页 → 查找“最新发布”栏目(通常位于首页中部区域)→ 确认列表页地址为:http://www.stats.gov.cn/sj/zxfb/

查看网页源码发现,每条新闻条目均包裹在特定容器内,且位于 <ul> 标签下的多个 <li> 子元素中,结构清晰,易于提取。

编写爬虫脚本

基于上述分析,使用 Requests 获取页面内容,BeautifulSoup 解析 HTML 结构,提取标题和日期字段,并写入 CSV 文件。

运行结果展示

执行脚本后,系统将在 data/ 目录下生成一个 CSV 文件,包含所抓取的《统计月报》条目信息,包括标题名称和发布日期,可用于进一步的数据分析或可视化处理。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Javascript beautiful exception response articles

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-5 21:19