一、网络爬虫的核心概念
-
作用:自动化抓取网页数据(文本、图片、视频等)。
-
流程:发送请求 → 获取响应 → 解析数据 → 存储结果。
-
合法性:
-
遵守
robots.txt
协议。 -
避免高频请求(防止被封IP)。
-
尊重数据版权(禁止商用未授权数据)。
-
二、Python 爬虫核心技术
1. 基础工具库
-
HTTP 请求:
-
requests
:简单易用的 HTTP 库(同步请求)。 -
aiohttp
:异步高性能请求(适合大规模爬取)。
-
import requests
response = requests.get(url, headers=headers, timeout=5)
html = response.text # 或 response.content(二进制数据)
数据解析:
-
BeautifulSoup
:基于标签的 HTML/XML 解析。 -
lxml
:高性能解析库(支持 XPath)。 -
parsel
(Scrapy 内置):结合 CSS 和 XPath。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
title = soup.find('h1', class_='title').text
2. 动态页面处理
-
JavaScript 渲染:
-
Selenium
:自动化浏览器(支持 Chrome/Firefox)。 -
Playwright
:跨浏览器自动化工具(比 Selenium 更快)。
-
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url)
dynamic_content = driver.page_source
-
API 逆向工程:
-
使用浏览器开发者工具(Network 标签)分析 XHR/Fetch 请求。
-
直接调用隐藏的 JSON 接口(避免解析 HTML)。
-
3. 反爬虫策略应对
-
常见反爬手段:
-
User-Agent 检测
-
IP 频率限制
-
验证码(图片、滑块、点选)
-
数据加密(JavaScript 混淆)
-
-
应对方案:
-
请求头伪装:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...', 'Referer': 'https://www.example.com' }
-
IP 代理池:
-
proxies = {'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080'}
requests.get(url, proxies=proxies)
-
验证码处理:
-
使用第三方服务(如打码平台)。
-
机器学习模型自动识别(Tesseract OCR + OpenCV 预处理)。
-
-
请求频率控制:
import time
time.sleep(random.uniform(1, 3)) # 随机延时
三、爬虫框架与进阶技术
1. Scrapy 框架
-
核心组件:
-
Spider:定义爬取逻辑。
-
Item:数据容器。
-
Pipeline:数据清洗与存储。
-
Middleware:处理请求/响应(如代理、UA 轮换)。
-
-
示例:
import scrapy
class MySpider(scrapy.Spider):
name = 'example'
start_urls = ['https://example.com']
def parse(self, response):
yield {
'title': response.css('h1::text').get(),
'url': response.url
}
-
分布式爬虫:
-
使用
Scrapy-Redis
实现多机协同。 -
基于 Redis 的任务队列去重。
-
2. 数据存储
-
文件存储:
-
CSV/JSON:
pandas.to_csv()
/json.dump()
。 -
Excel:
openpyxl
库。
-
-
数据库:
-
MongoDB:
pymongo
库(适合非结构化数据)。 -
MySQL:
sqlalchemy
或pymysql
(结构化数据)。
-
3. 高性能优化
-
异步爬虫:
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, url)
-
并发控制:
-
使用
asyncio.Semaphore
限制并发数。 -
Scrapy 的
CONCURRENT_REQUESTS
参数调节。
-
四、实战项目示例
1. 静态网站爬虫
-
目标:抓取豆瓣电影 Top250。
-
步骤:
-
分析页面结构(标题、评分、链接)。
-
分页遍历(URL 规律:
start=0, 25, 50...
)。 -
数据存储到 CSV。
-
2. 动态网站爬虫
-
目标:抓取电商网站商品价格(JavaScript 渲染)。
-
工具:Selenium 或 Playwright 模拟滚动加载。
3. API 数据抓取
-
目标:获取天气数据(通过公开 API)。
-
方法:
import requests
api_url = 'https://api.weather.com/v3/...'
params = {'key': 'YOUR_API_KEY', 'location': 'Beijing'}
data = requests.get(api_url, params=params).json()
五、注意事项
-
法律风险:
-
禁止爬取个人隐私数据(如手机号、身份证)。
-
遵守《数据安全法》和《个人信息保护法》。
-
-
道德规范:
-
控制请求频率,避免对目标服务器造成压力。
-
标明数据来源(如学术用途需注明)。
-
六、学习资源推荐
-
书籍:
-
《Python网络数据采集》(Ryan Mitchell)
-
《Scrapy 网络爬虫实战》
-
-
在线教程:
-
Scrapy 官方文档(https://scrapy.org)
-
菜鸟教程 - Python 爬虫基础
-
-
工具:
-
Postman:调试 API 接口。
-
XPath Helper(Chrome 插件):快速生成 XPath。
-