Python爬虫作为数据采集的核心工具,广泛应用于数据分析、舆情监控、资源整理等场景。但很多新手入门时,常会遇到“爬取失败、被反爬、代码冗余”等问题,白白浪费时间。本文整理了10个高频实用技巧,从基础避坑到高效进阶,覆盖新手到入门进阶的核心需求,无需复杂知识点,看完就能直接套用,轻松提升爬取效率。
一、基础避坑技巧
1. 伪装请求头,避免被直接拦截
这是爬虫最基础也最关键的一步!很多网站会通过“请求头(User-Agent)”识别爬虫程序,直接拒绝无请求头或默认请求头的访问。
技巧:手动添加浏览器请求头,模拟真实用户访问,最简单的方式是复制自己浏览器的User-Agent,直接嵌入代码中。
import requests
# 正确做法:添加请求头伪装浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
response = requests.get("目标网址", headers=headers)
补充:可以准备多个User-Agent,随机切换使用,进一步降低被识别的概率。
2. 合理设置请求延迟,拒绝“暴力爬取”
新手常犯的错误的是:不设置延迟,高频次请求目标网站,轻则被限制访问,重则IP被封禁,导致无法继续爬取。
技巧:使用time模块设置随机延迟,模拟人类浏览节奏,延迟时间建议在1-3秒之间,既不影响效率,也能避免被反爬。
import requests
import time
import random
headers = {"User-Agent": "你的请求头"}
for url in 目标网址列表:
response = requests.get(url, headers=headers)
# 随机延迟1-3秒
time.sleep(random.uniform(1, 3))
3. 处理异常请求,避免程序中途崩溃
爬取过程中,常会遇到“网页不存在(404)、服务器错误(500)、网络中断”等问题,若不处理异常,程序会直接崩溃,之前爬取的数据也可能丢失。
技巧:使用try-except捕获常见异常,确保程序正常运行,同时打印异常信息,方便后续排查问题。
import requests
headers = {"User-Agent": "你的请求头"}
try:
response = requests.get("目标网址", headers=headers, timeout=10) # 设置超时时间,避免无限等待
response.raise_for_status() # 若状态码非200,抛出异常
except requests.exceptions.HTTPError as e:
print(f"HTTP错误:{e}")
except requests.exceptions.Timeout as e:
print(f"请求超时:{e}")
except Exception as e:
print(f"其他异常:{e}")
二、高效爬取技巧(提升效率,节省时间)
1. 使用会话保持,减少重复建立连接
若需要多次请求同一个网站,每次都用requests.get()会重复建立和关闭连接,效率极低。
技巧:使用requests.Session()创建会话对象,保持连接,后续请求直接复用会话,大幅提升爬取速度。
import requests
headers = {"User-Agent": "你的请求头"}
# 创建会话对象
session = requests.Session()
session.headers.update(headers) # 全局设置请求头
# 多次请求复用会话
response1 = session.get("网址1")
response2 = session.get("网址2")
response3 = session.get("网址3")
# 关闭会话(可选)
session.close()
2. 解析数据优先选lxml,拒绝低效解析
解析网页数据时,新手常用BeautifulSoup(默认解析器),但速度较慢;对于复杂网页,推荐使用lxml解析器,解析速度更快、语法更简洁。
技巧:安装lxml库,结合BeautifulSoup使用,或直接用lxml的xpath语法解析,效率翻倍。
from bs4 import BeautifulSoup
import requests
headers = {"User-Agent": "你的请求头"}
response = requests.get("目标网址", headers=headers)
# 使用lxml解析器(需提前安装:pip install lxml)
soup = BeautifulSoup(response.text, "lxml")
# 用xpath解析(更简洁高效)
from lxml import etree
html = etree.HTML(response.text)
# 示例:获取所有a标签的href属性
links = html.xpath("//a/@href")
3. 批量爬取+多线程,提升爬取效率
当需要爬取大量数据(如几百、几千个网页)时,单线程爬取速度极慢,此时可使用多线程,同时请求多个网页,大幅缩短爬取时间。
技巧:使用threading模块或concurrent.futures模块,实现简单多线程爬取,新手优先用concurrent.futures,语法更简单、更安全。
import requests
from concurrent.futures import ThreadPoolExecutor
headers = {"User-Agent": "你的请求头"}
url_list = ["网址1", "网址2", "网址3", ...] # 批量目标网址
# 定义爬取函数
def crawl(url):
try:
response = requests.get(url, headers=headers, timeout=10)
return response.text
except Exception as e:
print(f"爬取{url}失败:{e}")
return None
# 多线程爬取(设置最大线程数,避免过多线程被反爬)
with ThreadPoolExecutor(max_workers=5) as executor:
results = executor.map(crawl, url_list)
# 处理爬取结果
for url, result in zip(url_list, results):
if result:
print(f"爬取{url}成功,数据长度:{len(result)}")
三、反爬应对技巧(突破限制,顺利爬取)
1. 处理cookies,应对登录验证
很多网站需要登录才能爬取数据,此时可通过携带cookies,跳过登录步骤,直接访问需要的页面。
技巧:从浏览器中复制登录后的cookies,嵌入请求头中,注意cookies有有效期,过期后需重新复制。
import requests
headers = {
"User-Agent": "你的请求头",
"Cookie": "从浏览器复制的cookies字符串" # 直接粘贴,无需修改格式
}
# 直接访问需要登录的页面
response = requests.get("登录后才能访问的网址", headers=headers)
2. 使用代理IP,避免IP被封禁
若长期爬取同一个网站,即使设置了延迟,IP也可能被封禁,此时需要使用代理IP,更换访问IP地址。
技巧:选择免费代理IP(适合新手测试)或付费代理IP(稳定,适合长期使用),在请求中添加代理,随机切换。
import requests
headers = {"User-Agent": "你的请求头"}
# 代理IP(示例,需替换为可用的代理)
proxies = {
"http": "http://代理IP:端口",
"https": "https://代理IP:端口"
}
try:
response = requests.get("目标网址", headers=headers, proxies=proxies, timeout=10)
except Exception as e:
print(f"代理爬取失败:{e}")
3. 识别动态加载内容,突破静态爬取限制
很多网站的内容是动态加载的(如滑动加载、点击加载),用requests爬取只能获取静态页面,无法拿到动态内容(如商品列表、评论)。
技巧:新手优先使用Selenium模拟浏览器操作,自动滑动、点击,获取动态加载的内容;进阶可分析接口,直接请求接口获取数据(效率更高)。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 初始化浏览器(需下载对应浏览器驱动)
driver = webdriver.Chrome()
driver.get("目标网址")
# 模拟滑动到底部,加载更多内容
for i in range(3): # 滑动3次
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(2) # 等待加载
# 获取加载后的所有内容
html = driver.page_source
# 关闭浏览器
driver.quit()
四、新手必备注意事项(规范爬取,避免踩坑)
遵守robots协议:爬取前先查看目标网站的robots.txt文件(网址/robots.txt),了解网站允许爬取的内容,不爬取禁止访问的页面。
不爬取敏感数据:避免爬取个人信息、隐私数据、付费内容,遵守法律法规,避免法律风险。
备份爬取数据:爬取过程中及时将数据保存到本地(如txt、csv、数据库),避免程序崩溃导致数据丢失。
循序渐进练习:新手先从简单的静态网站(如博客、文档网站)入手,熟练后再尝试动态网站、登录网站的爬取。
总结
Python爬虫的核心是“模拟人类访问、高效获取数据、规避反爬限制”,以上10个技巧覆盖了新手入门到进阶的核心需求,无需复杂的知识点,直接套用代码就能上手。新手入门时,不用追求“多复杂的功能”,先掌握基础避坑技巧,再逐步学习高效爬取和反爬应对,多练习、多总结,就能快速掌握Python爬虫的精髓。