Python 网络爬虫从入门到实战:全面解析与项目示例

一、前言

在信息化高度发展的今天,数据成为一种关键资产。互联网上蕴含着海量的信息,而如何高效、自动地从网页中提取数据成为许多行业的刚需。Python 以其简洁易用的语法和强大的生态系统,成为实现网络爬虫任务的首选语言。

本篇文章将带你从原理入门,到实战项目构建,掌握用 Python 进行网页数据抓取的完整流程,适合零基础或有一定编程基础的读者阅读。


二、网络爬虫基础原理

1. 什么是网络爬虫?

网络爬虫(Web Crawler)是通过模拟浏览器访问网页,从中提取所需信息的程序。其基本步骤包括:

  1. 发送请求(Request)
  2. 接收响应(Response)
  3. 提取数据(解析 HTML、JSON 等)
  4. 数据保存(存储到文件、数据库等)

2. 网络请求基础

常用的协议:HTTP/HTTPS

常用的请求方法:

  • GET: 获取网页内容(最常见)
  • POST: 向服务器提交数据
  • HEAD/PUT/DELETE: 一般用于接口开发

请求头示例:

makefile 复制代码
http
复制编辑
GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0

三、核心工具库介绍

库名 功能说明
requests 发送网络请求,获取网页内容
bs4(BeautifulSoup) 解析 HTML/XML 文档
lxml 更快的解析器(支持 XPath)
re 正则表达式,强力匹配字符串
selenium 浏览器自动化操作(应对 JS 渲染页面)
aiohttp 异步网络请求库(适合大规模爬取)

四、实战入门:抓取豆瓣书籍排行榜

1. 安装依赖

复制代码
bash
复制编辑
pip install requests beautifulsoup4

2. 示例代码

ini 复制代码
python
复制编辑
import requests
from bs4 import BeautifulSoup

url = 'https://book.douban.com/top250'
headers = {
    'User-Agent': 'Mozilla/5.0'
}

res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')

books = soup.find_all('tr', class_='item')
for book in books:
    title = book.find('div', class_='pl2').a.text.strip().replace('\n', '')
    rating = book.find('span', class_='rating_nums').text
    print(f"{title} - 评分:{rating}")

3. 输出示例

python 复制代码
python-repl
复制编辑
活着 - 评分:9.4  
百年孤独 - 评分:9.2  
...  

五、进阶数据提取:使用 XPath 与正则

1. 使用 lxml + XPath

css 复制代码
python
复制编辑
from lxml import etree
html = etree.HTML(res.text)
titles = html.xpath('//div[@class="pl2"]/a/text()')

2. 使用正则提取链接

python 复制代码
python
复制编辑
import re
urls = re.findall(r'href="(https://book.douban.com/subject/\d+/)"', res.text)

六、实战项目:爬取知乎热榜并保存为 Excel

1. 目标站点

知乎热榜:www.zhihu.com/hot

2. 代码实现

ini 复制代码
python
复制编辑
import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://www.zhihu.com/hot'
headers = {'User-Agent': 'Mozilla/5.0'}

res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')

titles = soup.select('.HotList-itemTitle')
data = [{'排名': i+1, '标题': title.text} for i, title in enumerate(titles)]

# 保存为 Excel
df = pd.DataFrame(data)
df.to_excel('知乎热榜.xlsx', index=False)
print('热榜保存成功')

七、破解反爬:如何应对限制与封禁

1. 添加 Headers 模拟浏览器

ini 复制代码
python
复制编辑
headers = {'User-Agent': 'Mozilla/5.0'}

2. 使用代理

rust 复制代码
python
复制编辑
proxies = {
    'http': 'http://123.123.123.123:8888',
    'https': 'http://123.123.123.123:8888'
}
requests.get(url, headers=headers, proxies=proxies)

3. 设置请求间隔

lua 复制代码
python
复制编辑
import time
time.sleep(1 + random.random())

4. 使用 Selenium 绕过 JS 加载页面

ini 复制代码
python
复制编辑
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.taobao.com')
html = driver.page_source
driver.quit()

八、多线程与异步爬虫

1. 多线程爬虫(适合 I/O 密集任务)

scss 复制代码
python
复制编辑
import threading

def crawl(url):
    res = requests.get(url)
    print(url, len(res.text))

urls = ['https://example.com/page1', 'https://example.com/page2']
threads = [threading.Thread(target=crawl, args=(url,)) for url in urls]

for t in threads:
    t.start()
for t in threads:
    t.join()

2. 异步爬虫(推荐使用 aiohttp + asyncio)

python 复制代码
python
复制编辑
import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as res:
        html = await res.text()
        print(url, len(html))

async def main():
    urls = ['https://example.com'] * 10
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        await asyncio.gather(*tasks)

asyncio.run(main())

九、爬虫数据存储方案

存储方式 适用场景
CSV / Excel 轻量级数据存储
SQLite 本地轻量数据库
MySQL / Postgres 多人协作项目数据管理
MongoDB 存储 JSON 等非结构化数据

示例保存为 CSV:

ini 复制代码
python
复制编辑
df.to_csv('数据.csv', index=False)

十、完整项目实战:爬取招聘信息并入库

1. 目标站点:51job 搜索页面

ini 复制代码
python
复制编辑
import requests
from bs4 import BeautifulSoup
import csv

url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,Python,2,1.html'
headers = {'User-Agent': 'Mozilla/5.0'}

res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')

# 注意:实际页面结构较复杂,需结合 DevTools 分析标签路径

2. 提取字段并写入 CSV

ini 复制代码
python
复制编辑
with open('招聘信息.csv', 'w', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    writer.writerow(['职位', '公司', '地点', '薪资'])

    for job in jobs:
        title = ...
        company = ...
        salary = ...
        writer.writerow([title, company, location, salary])

十一、合法合规与反爬伦理

网络爬虫虽然强大,但不应滥用。在编写爬虫时请务必:

  • 遵守网站的 robots.txt 文件规则
  • 控制请求频率,避免攻击性访问
  • 不爬取涉及个人隐私、敏感数据内容
  • 不用于商业用途(如爬取付费 API)

十二、总结与拓展方向

本文带你系统学习了 Python 网络爬虫的基本原理、常用库、反爬策略及多个实战项目示例。掌握爬虫技术,不仅能为你提供高效的数据采集能力,也为数据分析、自然语言处理、商业情报等场景打下坚实基础。

下一步建议学习方向:

  • 使用 Scrapy 框架构建大型项目
  • 利用异步技术实现高性能爬虫
  • 接入数据库 + 爬虫 + 可视化构建数据平台
相关推荐
zeijiershuai1 小时前
SpringBoot Controller接收参数方式, @RequestMapping
java·spring boot·后端
zybsjn1 小时前
后端项目中静态文案国际化语言包构建选型
java·后端·c#
L2ncE1 小时前
ES101系列07 | 分布式系统和分页
java·后端·elasticsearch
无限大62 小时前
《计算机“十万个为什么”》之前端与后端
前端·后端·程序员
初次见面我叫泰隆2 小时前
Golang——2、基本数据类型和运算符
开发语言·后端·golang
南风lof2 小时前
ReentrantLock与AbstractQueuedSynchronizer源码解析,一文读懂底层原理
后端
写bug写bug3 小时前
彻底搞懂 RSocket 协议
java·后端
就是我3 小时前
轻松管理Linux定时任务:Cron实用教程
linux·后端
橘子青衫3 小时前
深入理解Callable与Future:实现Java多线程中的异步任务处理
java·后端
bobz9653 小时前
libvirt 相关 sock 整理
后端