跳到主要内容
Python 爬虫入门实战:从 Requests 到 Scrapy 分布式部署 | 极客日志
Python 算法
Python 爬虫入门实战:从 Requests 到 Scrapy 分布式部署 Python 爬虫技术体系涵盖静态页面抓取、动态渲染处理及分布式架构设计。本文详解 Requests、BeautifulSoup 基础用法,深入 Scrapy 框架配置与中间件开发,介绍 Selenium 与 Playwright 应对 JS 渲染,以及 aiohttp 异步高并发方案。同时提供数据存储(MySQL/MongoDB)、反爬策略(代理/IP 池/验证码)及去重机制的完整实践指南,适合希望构建高效稳定数据采集系统的开发者参考。
Pythonist 发布于 2026/3/24 更新于 2026/4/25 2 浏览Python 爬虫入门实战:从 Requests 到 Scrapy 分布式部署
前言
在信息爆炸的时代,互联网已成为最丰富的数据来源。无论是电商价格、新闻动态还是招聘信息,通过爬虫都能高效获取。对于初学者而言,只要理解 HTTP、HTML 及基础 Python 编程,就能快速入门。
本教程面向零基础用户,讲解从最基本的抓取到进阶框架、异步、分布式再到反爬策略,逐步深入,手把手指导你搭建完整爬虫,并总结截至 2024 年底最常用的 Python 爬虫库。
核心亮点
循序渐进 :从 requests + BeautifulSoup 开始,到 Scrapy、Selenium、Playwright、异步爬虫,一步步掌握。
实战示例 :每个工具/框架都配有完整可运行的示例代码。
最新库盘点 :整理截至 2024 年常用的爬虫生态主流库。
反爬与实战 :从 User-Agent 伪装到代理 IP 池、验证码识别,多角度应对目标网站的各种反爬机制。
温馨提示 :本教程示例均基于 Python 3.8+,强烈建议使用 Python 3.10 或更高版本。爬取网站数据时,请务必遵守目标网站的 robots.txt 以及相关法律法规,避免给他人服务器带来不必要的压力。
爬虫基础知识
什么是爬虫?
爬虫(Web Crawler)是一种通过程序自动访问网页,并将其中有用信息提取下来存储的数据采集工具。
原理简述 :爬虫首先向指定 URL 发起 HTTP 请求,获取网页源代码(HTML、JSON、图片等),再通过解析技术(如 XPath、CSS 选择器、正则)从源码中提取所需数据,最后将数据保存到文件或数据库中。
应用场景
数据分析 :电商价格监控、商品评论分析、竞品调研。
舆情监控 :社交媒体热搜、论坛帖子、新闻资讯统计。
搜索引擎 :Google、Bing 等搜索引擎通过爬虫定期抓取网页进行索引。
招聘信息采集 :自动抓取招聘网站的岗位、薪资、公司信息。
学术研究 :论文元数据爬取、知识图谱构建等。
基本流程
确定目标 URL :明确要爬取的网页地址。
发送 HTTP 请求 :使用 requests、httpx、aiohttp 等库发送 GET、POST 请求。
解析响应内容 :常用解析工具有 BeautifulSoup、lxml、parsel、PyQuery、正则表达式等。
提取数据 :根据标签名、属性、XPath、CSS Selector 等定位到目标内容。
数据处理与存储 :清洗、去重,然后保存到 CSV、JSON、SQLite、MySQL、MongoDB 等介质中。
翻页/递归 :分析翻页逻辑,循环执行请求与解析。
异常处理与反爬对策 :设置代理、随机 User-Agent、限速、IP 轮换。
法律与伦理问题
请求前务必查看目标站点的 robots.txt,遵从抓取规则;
遵守版权与隐私政策,不要对目标站点造成过大压力,建议设置合适的延时;
遵守爬虫与爬取数据后续处理相关法律法规,切勿用于违法用途。
开发环境准备
安装 Python
Windows :前往官网下载对应安装包,默认选中'Add Python 3.x to PATH'。
macOS :建议使用 Homebrew 安装:brew install [email protected]
Linux (Ubuntu/Debian) :
sudo apt update && sudo apt install python3 python3-pip python3-venv -y
安装完成后,执行 python3 --version 确认。
创建虚拟环境 为了避免全局依赖冲突,强烈建议为每个爬虫项目创建独立的虚拟环境:
mkdir my_spider && cd my_spider
python3 -m venv venv
常用开发工具推荐
IDE/编辑器 :PyCharm、VS Code、Sublime Text。
调试工具 :VS Code/PyCharm 自带调试器,命令行脚本可使用 pdb。
版本管理 :Git + GitHub/Gitee。
辅助工具 :Postman / Insomnia(模拟 HTTP 请求)、Charles / Fiddler(抓包调试)。
基础篇:用 Requests + BeautifulSoup 做简单爬虫
安装必要库 pip install requests beautifulsoup4 lxml
requests:最常用的 HTTP 库。
beautifulsoup4:常见的 HTML/XML 解析库。
lxml:速度快、功能强大的解析器。
认识 HTTP 请求与响应
HTTP 请求 :由方法(GET、POST 等)、URL、请求头(Headers)、请求体(Body)组成。
HTTP 响应 :包含状态码、响应头、响应体。
Requests 常用参数 :url、params、headers、data/json、timeout、proxies。
import requests
url = 'https://httpbin.org/get'
params = {'q' : 'python 爬虫' , 'page' : 1 }
headers = {'User-Agent' : 'Mozilla/5.0 ...' }
response = requests.get(url, params=params, headers=headers, timeout=10 )
print (response.status_code)
print (response.encoding)
print (response.text[:200 ])
编写第一个爬虫:抓取网页标题 下面以爬取 https://www.example.com 网页标题为例:
import requests
from bs4 import BeautifulSoup
def fetch_title (url ):
try :
headers = {'User-Agent' : 'Mozilla/5.0 ...' }
response = requests.get(url, headers=headers, timeout=10 )
response.raise_for_status()
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text, 'lxml' )
title_tag = soup.find('title' )
if title_tag:
return title_tag.get_text().strip()
else :
return '未找到 title 标签'
except Exception as e:
return f'抓取失败:{e} '
if __name__ == '__main__' :
url = 'https://www.example.com'
title = fetch_title(url)
print (f'网页标题:{title} ' )
解析 HTML:BeautifulSoup 用法详解 BeautifulSoup 库使用简单,常用方法如下:
查找单个节点 :soup.find(tag_name, attrs={})
查找所有节点 :soup.find_all(tag_name, attrs={})
CSS 选择器 :soup.select('div.content > ul li a')
获取属性或文本 :node.get('href')、node.get_text(strip=True)
html = response.text
soup = BeautifulSoup(html, 'lxml' )
for h2 in soup.find_all('h2' , class_='post-title' ):
a_tag = h2.find('a' )
title = a_tag.get_text(strip=True )
link = a_tag['href' ]
print (title, link)
文件存储:将抓到的数据保存为 CSV/JSON import sqlite3
conn = sqlite3.connect('spider.db' )
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS articles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
url TEXT UNIQUE
);
''' )
items = [('第一篇' , 'https://...' ), ('第二篇' , 'https://...' )]
for title, url in items:
try :
cursor.execute('INSERT INTO articles (title, url) VALUES (?, ?)' , (title, url))
except sqlite3.IntegrityError:
pass
conn.commit()
conn.close()
import json
data = [{'title' : '第一篇' , 'url' : 'https://...' }]
with open ('result.json' , 'w' , encoding='utf-8' ) as f:
json.dump(data, f, ensure_ascii=False , indent=4 )
常见反爬措施及应对策略
User-Agent 检测 :默认 requests 的 User-Agent 容易被识别。应用:在请求头中随机选用常见浏览器 User-Agent。
IP 限制 :如果同一 IP 短时间内发起大量请求,服务器可能会封禁。应对:使用代理池,定期更换 IP。
Cookie 验证 :某些网站登录后才能访问。用 requests.Session() 管理会话,同一 Session 自动保存并发送 Cookie。
AJAX / 动态渲染 :如果页面数据是通过 JavaScript 动态加载,直接用 requests 只能获取静态 HTML。需分析 AJAX 接口或使用浏览器自动化工具。
进阶篇:更强大的解析工具 虽然 BeautifulSoup 足以应付大部分新手场景,但遇到结构复杂、嵌套多、或需要批量高效提取时,下面这些工具会更适合。
lxml (XPath)
特点 :基于 C 语言实现,解析速度快,支持标准的 XPath 查询。
常见语法 ://tag[@attr="value"]、text()、@href。
from lxml import etree
html = '''<html><body>
<div><h2><a href="/p1">文章 A</a></h2></div>
<div><h2><a href="/p2">文章 B</a></h2></div>
</body></html>'''
tree = etree.HTML(html)
titles = tree.xpath('//div/h2/a/text()' )
links = tree.xpath('//div/h2/a/@href' )
for t, l in zip (titles, links):
print (t, l)
parsel(Scrapy 内置的解析器)
特点 :Scrapy 自带的一套基于 Css/XPath 的快速解析工具。
from parsel import Selector
html = '''<ul>
<li><a href="/a1">Item1</a></li>
<li><a href="/a2">Item2</a></li>
</ul>'''
sel = Selector(text=html)
for item in sel.css('li' ):
title = item.css('a::text' ).get()
link = item.css('a::attr(href)' ).get()
print (title, link)
PyQuery(类似 jQuery 的解析方式)
特点 :接口风格类似 jQuery,前端同学会很快上手。
from pyquery import PyQuery as pq
html = '''<div>
<h2><a href="/x1">新闻 X1</a></h2>
<h2><a href="/x2">新闻 X2</a></h2>
</div>'''
doc = pq(html)
for item in doc('#posts h2' ):
a = pq(item).find('a' )
title = a.text()
url = a.attr('href' )
print (title, url)
正则表达式在爬虫中的应用
正则并不是万能的 HTML 解析方案,但在提取简单规则(如邮箱、电话号码)时非常方便。
import re
from bs4 import BeautifulSoup
html = '<div>联系邮箱:[email protected] 联系电话:123-4567-890</div>'
soup = BeautifulSoup(html, 'lxml' )
info = soup.find('div' ).get_text()
email_pattern = r'[\w\.-]+@[\w\.-]+'
emails = re.findall(email_pattern, info)
print ('邮箱:' , emails)
框架篇:Scrapy 全面入门 如果你想快速搭建一个可维护、可扩展的爬虫项目,Scrapy 是 Python 爬虫生态中最成熟、最流行的爬虫框架之一。
Scrapy 简介
适用场景 :大规模爬取同类型大量网页、复杂数据清洗、高度定制化中间件。
安装与项目结构 scrapy startproject myproject
myproject/
scrapy.cfg
myproject/
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/
example_spider.py
编写第一个 Scrapy 爬虫 Spider 假设我们要爬取 quotes.toscrape.com 网站上所有名言及作者:
import scrapy
class MyprojectItem (scrapy.Item):
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
编写 Spider (spiders/quotes_spider.py)
import scrapy
from myproject.items import MyprojectItem
class QuotesSpider (scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com' ]
start_urls = ['https://quotes.toscrape.com/' ]
def parse (self, response ):
for quote in response.css('div.quote' ):
item = MyprojectItem()
item['text' ] = quote.css('span.text::text' ).get()
item['author' ] = quote.css('small.author::text' ).get()
item['tags' ] = quote.css('div.tags a.tag::text' ).getall()
yield item
next_page = response.css('li.next a::attr(href)' ).get()
if next_page:
yield response.follow(next_page, callback=self .parse)
Scrapy Shell 在线调试 Shell 模式下,你可以快速试错、验证提取逻辑。
scrapy shell 'https://quotes.toscrape.com/'
并发配置
并发请求数 :在 settings.py 中设置 CONCURRENT_REQUESTS(默认 16)。
下载延时 :DOWNLOAD_DELAY(默认 0)。
自动限速 :AUTOTHROTTLE_ENABLED = True。
中间件与扩展
Downloader Middleware :位于引擎与下载器之间,常用于动态设置 User-Agent、Proxy、拦截修改请求/响应头。
示例:随机 User-Agent Middleware
import random
from scrapy import signals
class RandomUserAgentMiddleware :
def __init__ (self, user_agents ):
self .user_agents = user_agents
@classmethod
def from_crawler (cls, crawler ):
return cls(user_agents=crawler.settings.get('USER_AGENTS_LIST' ))
def process_request (self, request, spider ):
ua = random.choice(self .user_agents)
request.headers.setdefault('User-Agent' , ua)
动态内容爬取:Selenium 与 Playwright 当目标网页内容依赖 JavaScript 动态渲染时,单纯用 requests 获取到的 HTML 往往不包含最终可视化的数据。此时可以使用'浏览器自动化'工具。
Selenium 基础用法
下载 WebDriver :下载与本地 Chrome 版本相匹配的 chromedriver。
显式等待与隐式等待 :使用 WebDriverWait 与 ExpectedConditions。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
chrome_options = Options()
chrome_options.add_argument('--headless' )
chrome_options.add_argument('--no-sandbox' )
service = ChromeService(executable_path='path/to/chromedriver' )
driver = webdriver.Chrome(service=service, options=chrome_options)
try :
driver.get('https://quotes.toscrape.com/js/' )
html = driver.page_source
soup = BeautifulSoup(html, 'lxml' )
for quote in soup.select('div.quote' ):
text = quote.find('span' , class_='text' ).get_text()
author = quote.find('small' , class_='author' ).get_text()
print (text, author)
finally :
driver.quit()
Playwright for Python
优点 :启动速度快、API 简洁、无需单独下载 WebDriver。
from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup
def main ():
with sync_playwright() as p:
browser = p.chromium.launch(headless=True )
page = browser.new_page()
page.goto('https://quotes.toscrape.com/js/' )
page.wait_for_selector('div.quote' )
html = page.content()
browser.close()
soup = BeautifulSoup(html, 'lxml' )
for quote in soup.select('div.quote' ):
text = quote.select_one('span.text' ).get_text()
author = quote.select_one('small.author' ).get_text()
print (text, author)
if __name__ == '__main__' :
main()
异步爬虫:aiohttp + asyncio 与 HTTPX 当面对上千个、甚至上万个链接需要同时抓取时,同步阻塞式的 requests 效率低下。Python 原生的 asyncio 协程、aiohttp 库或 httpx 异步模式可以极大提升并发性能。
aiohttp 入门示例 使用 asyncio + aiohttp 并发抓取
import asyncio
import aiohttp
from bs4 import BeautifulSoup
async def fetch (session, url ):
try :
async with session.get(url, timeout=10 ) as response:
text = await response.text()
return text
except Exception as e:
print (f'抓取 {url} 失败:{e} ' )
return None
async def parse (html, url ):
if not html:
return
soup = BeautifulSoup(html, 'lxml' )
title = soup.find('title' ).get_text(strip=True ) if soup.find('title' ) else 'N/A'
print (f'URL: {url} ,Title: {title} ' )
async def main (urls ):
conn = aiohttp.TCPConnector(limit=50 )
async with aiohttp.ClientSession(connector=conn) as session:
tasks = []
for url in urls:
task = asyncio.create_task(fetch(session, url))
tasks.append(task)
htmls = await asyncio.gather(*tasks)
for html, url in zip (htmls, urls):
await parse(html, url)
if __name__ == '__main__' :
urls = [f'https://example.com/page/{i} ' for i in range (1 , 101 )]
asyncio.run(main(urls))
HTTPX:Requests 的异步升级版
特点 :与 requests API 十分相似,同时支持同步与异步模式。
import asyncio
import httpx
from bs4 import BeautifulSoup
async def fetch (client, url ):
try :
resp = await client.get(url, timeout=10.0 )
resp.raise_for_status()
return resp.text
except Exception as e:
print (f'Error {url} : {e} ' )
return None
async def main (urls ):
async with httpx.AsyncClient(limits=httpx.Limits(max_connections=50 )) as client:
tasks = [asyncio.create_task(fetch(client, url)) for url in urls]
for coro in asyncio.as_completed(tasks):
html = await coro
if html:
title = BeautifulSoup(html, 'lxml' ).find('title' ).get_text(strip=True )
print ('Title:' , title)
if __name__ == '__main__' :
urls = [f'https://example.com/page/{i} ' for i in range (1 , 101 )]
asyncio.run(main(urls))
数据存储与去重
本地文件与数据库
CSV/JSON :适合一次性、容量较小、对数据结构要求不高的场景。
SQLite :轻量级嵌入式数据库,适合中小规模项目。
MySQL/PostgreSQL :适合大规模数据存储,支持 SQL 强大的查询功能。
MongoDB :文档型数据库,对半结构化 JSON 数据支持友好。
Redis 用作去重与短期缓存
Redis Set :小规模去重可直接用 Redis set 存储已爬 URL。
布隆过滤器 :当 URL 数量达到数百万级别时,普通 Python 集合会占用大量内存,布隆过滤器用空间换时间。
import redis
r = redis.Redis(host='localhost' , port=6379 , db=0 )
url = 'https://example.com/page/1'
if r.sadd('visited_urls' , url):
print ('新 URL,可爬取' )
else :
print ('URL 已存在,跳过' )
分布式爬虫:Scrapy-Redis 与分布式调度 当单机爬虫难以满足高并发、大规模抓取时,就需要分布式爬虫。Scrapy-Redis 是 Scrapy 官方推荐的分布式方案之一。
集成 Scrapy-Redis
安装 :pip install scrapy-redis
配置 Settings :
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://:[email protected] :6379/0'
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline' : 300 }
修改 Spider :继承 scrapy_redis.spiders.RedisSpider。
多机协作示例
部署多台服务器(A、B、C),都能访问同一个 Redis 实例。
在 A、B、C 机上,各自拉取完整的 Scrapy 项目代码,并配置好 settings.py 中的 REDIS_URL。
三台机器会自动协调,每台都从 Redis 队列中取 URL,去重也由 Redis 统一维护。
常见反爬与反制策略
频率限制与请求头伪装
访问频率控制 :Scrapy 中使用 DOWNLOAD_DELAY、AUTOTHROTTLE_ENABLED 等。
User-Agent 伪装 :通过随机 User-Agent 模拟不同浏览器。
Referer、Accept-Language 等 Headers :模拟真实浏览器请求时携带的完整 Header。
登录验证与 Cookie 管理
Session 对象 :在 requests 中,使用 requests.Session() 方便统一管理 Cookie。
模拟登录流程 :获取登录页 Token -> POST 登录接口 -> 保持 Session 状态。
验证码识别
常见类型 :图片验证码、滑动验证码、点选验证码。
方案 :打码平台/人工打码、绕过/获取接口、OCR 识别(如 pytesseract)。
代理 IP 池的搭建与旋转
为什么要用代理 :降低单 IP 请求频率,防止被封禁。
获取代理 :免费代理(不稳定)、付费代理(稳定)。可在 Scrapy 中配置 RandomProxyMiddleware。
完整案例:爬取某新闻网站并存入数据库 本节以'爬取某模拟新闻网站头条新闻,并将标题、摘要、链接存入 MySQL 数据库'为例,完整演示 Scrapy + MySQL 的使用。
需求分析
目标数据 :新闻标题、摘要、文章链接、发布时间。
存储方式 :MySQL 数据库。
反爬策略 :设置随机 User-Agent、下载延时。
实现步骤 编写 Spider (news_spider/spiders/news.py)
import scrapy
from news_spider.items import NewsSpiderItem
class NewsSpider (scrapy.Spider):
name = 'news'
allowed_domains = ['news.example.com' ]
start_urls = ['https://news.example.com/' ]
def parse (self, response ):
for news in response.css('div.headline-list div.item' ):
item = NewsSpiderItem()
item['title' ] = news.css('h2.title::text' ).get().strip()
item['summary' ] = news.css('p.summary::text' ).get().strip()
item['url' ] = response.urljoin(news.css('a::attr(href)' ).get())
item['pub_date' ] = news.css('span.pub-date::text' ).get().strip()
yield scrapy.Request(
url=item['url' ],
callback=self .parse_detail,
meta={'item' : item}
)
next_page = response.css('a.next-page::attr(href)' ).get()
if next_page:
yield response.follow(next_page, callback=self .parse)
def parse_detail (self, response ):
item = response.meta['item' ]
pub_date = response.css('div.meta span.date::text' ).get().strip()
item['pub_date' ] = self .parse_date(pub_date)
yield item
def parse_date (self, date_str ):
from datetime import datetime
try :
dt = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S' )
return dt
except :
return None
MySQL Pipeline (news_spider/pipelines.py)
import pymysql
from pymysql.err import IntegrityError
class MySQLPipeline :
def open_spider (self, spider ):
self .conn = pymysql.connect(
host=spider.settings.get('MYSQL_HOST' ),
port=spider.settings.get('MYSQL_PORT' ),
user=spider.settings.get('MYSQL_USER' ),
password=spider.settings.get('MYSQL_PASSWORD' ),
db=spider.settings.get('MYSQL_DB' ),
charset=spider.settings.get('MYSQL_CHARSET' ),
cursorclass=pymysql.cursors.DictCursor
)
self .cursor = self .conn.cursor()
def close_spider (self, spider ):
self .cursor.close()
self .conn.close()
def process_item (self, item, spider ):
insert_sql = """ INSERT INTO headline_news (title, summary, url, pub_date) VALUES (%s, %s, %s, %s) """
try :
self .cursor.execute(insert_sql, (
item.get('title' ),
item.get('summary' ),
item.get('url' ),
item.get('pub_date' )
))
self .conn.commit()
except IntegrityError:
pass
return item
Python 爬虫相关的常用第三方库一览 以下对各类常用库进行分类归纳,并附简要说明与典型使用场景。
基础请求与解析 库名 功能简介 典型场景 requests 同步 HTTP 请求,API 简洁 绝大多数简单爬虫 httpx 支持同步 & 异步 需要异步或更多高级功能 aiohttp 原生 asyncio 协程模式 高并发抓取 BeautifulSoup HTML/XML 解析 初学者快速上手 lxml 高性能解析器,支持 XPath 需要高性能、大量数据解析 parsel Scrapy 自带解析器 Scrapy 项目中快捷解析
浏览器自动化 库名 功能简介 典型场景 Selenium 最成熟的浏览器自动化框架 需模拟用户操作、抓取 JS 渲染内容 Playwright 微软出品,API 简洁 高性能 headless 模式 undetected-chromedriver 对抗反爬,屏蔽 Selenium 特征 需要更强的逃避检测能力
异步爬取 库名 功能简介 典型场景 asyncio Python 标准库,事件循环 编写异步爬虫主框架 aiohttp 基于 asyncio 的 HTTP 客户端 高并发抓取 httpx 支持同步 & 异步 无缝切换异步模式
登录模拟与验证码处理 库名 功能简介 典型场景 requests + Session 模拟登录,自动管理 Cookie 大部分需要登录后抓取的场景 pytesseract OCR 识别图片文字 简单验证码识别 captcha_solver 第三方打码平台 SDK 调用付费打码平台
反爬与代理 库名 功能简介 典型场景 fake-useragent 随机生成 User-Agent 防止被识别为爬虫 scrapy-rotating-proxies Scrapy 专用代理轮换中间件 大规模抓取避免单 IP 封禁 proxylist2 从多个免费代理网站抓取代理 IP 自动化维护免费代理列表
分布式调度 库名 功能简介 典型场景 scrapy-redis Scrapy 分布式爬虫扩展 分布式 Scrapy 项目 scrapy-cluster 基于 Kafka + Redis 的系统 企业级分布式环境
附录
常见报错及解决方案
ModuleNotFoundError :未安装该包或安装在全局而非虚拟环境中。解决:确认虚拟环境并执行 pip install xxx。
SSLError :本机 CA 证书有问题。解决:升级 certifi 或临时忽略(不推荐)。
ValueError :XPath 返回多值时解包错误。解决:检查 XPath 语法或使用 zip()。
WebDriverException :chromedriver 路径问题。解决:下载匹配版本并添加到 PATH。
OperationalError :MySQL 连接失败。解决:检查用户名、密码、服务是否运行。
常用 HTTP 状态码速查 状态码 含义 200 OK,请求成功 301 永久重定向 403 Forbidden,服务器拒绝访问 404 Not Found,资源不存在 429 Too Many Requests,请求频率过高 500 Internal Server Error,服务器内部错误
学习资源
官方文档 :Requests、BeautifulSoup、Scrapy、Selenium、Playwright、aiohttp、httpx。
推荐书籍 :《Python 网络数据采集》、《深入 Python 爬虫框架 Scrapy》、《Python3 网络爬虫开发实战》。
社区资源 :Stack Overflow、SegmentFault、GitHub Trending。
总结 本教程从最基础的 requests + BeautifulSoup,到 Scrapy 框架、浏览器自动化、异步爬虫、分布式爬虫,系统梳理了 Python 爬虫的常见技术与实践要点。对于初学者而言,掌握以下几个关键点即可快速上手:
理解 HTTP 基础 :会构造 GET/POST 请求、分析响应;
掌握 HTML 解析 :熟悉 BeautifulSoup、lxml(XPath/CSS Selector);
尝试 Scrapy :学会搭建 Scrapy 项目、编写 Spider、Pipeline、Settings;
应对动态页面 :熟练使用 Selenium 或 Playwright 抓取 JS 渲染内容;
探索异步爬虫 :理解协程原理,用 aiohttp、httpx 提升并发性能;
数据存储与去重 :掌握多种存储方式,并做好 URL 去重;
反爬与反制 :设置 User-Agent、代理 IP 池等,了解验证码处理思路;
分布式爬虫 :学习 Scrapy-Redis,将任务分配到多台机器。
最后,爬虫技术更新迅速,建议在入门后,积极关注各大 Python 社区、GitHub Trending 以及官方文档,及时跟进新特性、新库、新思路,不断优化自己的爬虫方案。祝你能在数据抓取的道路上越走越远!
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online