Python爬虫实战:Requests与BeautifulSoup高效应用指南

发布时间:2026/9/14 8:32:17
Python爬虫实战:Requests与BeautifulSoup高效应用指南 1. Python爬虫入门Requests与BeautifulSoup基础解析最近在帮几个刚入门Python的朋友搭建爬虫环境时发现很多新手都会卡在基础工具的使用上。Requests和BeautifulSoup这对黄金组合虽然简单易用但想要写出健壮的爬虫代码还是需要掌握一些核心技巧。今天我就结合自己这些年踩过的坑聊聊如何用这两个库快速构建一个可靠的网页抓取工具。2. 核心工具链解析2.1 Requests库实战要点安装requests库时建议指定版本pip install requests2.31.0处理429 Too Many Requests错误时最稳妥的做法是加入指数退避重试机制import time from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry session requests.Session() retries Retry( total3, backoff_factor1, status_forcelist[429, 500, 502, 503, 504] ) session.mount(http://, HTTPAdapter(max_retriesretries))重要提示实测发现设置User-Agent头能显著降低被封禁概率建议模仿主流浏览器的UA格式2.2 BeautifulSoup的深度使用解析HTML时指定lxml解析器效率最高from bs4 import BeautifulSoup soup BeautifulSoup(html_content, lxml)XPath和CSS选择器混用技巧# CSS选择器找父节点 parent soup.select_one(div.content).parent # XPath式属性查找 links soup.find_all(attrs{class: external})3. 完整爬虫实现流程3.1 网页请求最佳实践处理重定向的正确方式response requests.get(url, allow_redirectsFalse) if response.status_code 302: print(f重定向到{response.headers[Location]})代理设置方案需自行替换有效代理proxies { http: http://proxy_ip:port, https: http://proxy_ip:port } response requests.get(url, proxiesproxies)3.2 数据提取进阶技巧处理动态class名的可靠方法import re items soup.find_all(class_re.compile(rproduct-\d))表格数据提取模板for row in soup.select(table tr): cols [td.get_text(stripTrue) for td in row.find_all(td)] if cols: print(cols)4. 反爬对抗实战方案4.1 请求头精细化配置建议至少包含这些头部信息headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64), Accept-Language: zh-CN,zh;q0.9, Referer: https://www.google.com/ }4.2 请求频率控制策略智能延迟算法实现import random import time def smart_delay(last_request_time): elapsed time.time() - last_request_time delay max(0, random.uniform(1, 3) - elapsed) time.sleep(delay) return time.time()5. 异常处理与日志记录5.1 健壮性增强方案网络异常统一处理from requests.exceptions import RequestException try: response session.get(url, timeout10) except RequestException as e: print(f请求失败{str(e)}) # 加入重试逻辑或记录到日志5.2 结构化日志配置推荐使用logging模块import logging logging.basicConfig( filenamespider.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s )6. 数据存储方案选型6.1 轻量级存储方案CSV存储优化写法import csv with open(data.csv, a, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([标题, 价格, 链接])6.2 数据库存储实现SQLite3基础操作import sqlite3 conn sqlite3.connect(data.db) c conn.cursor() c.execute(CREATE TABLE IF NOT EXISTS products (title text, price real))7. 项目优化与扩展7.1 性能提升技巧使用Session对象保持连接with requests.Session() as s: s.headers.update(headers) # 多个请求复用同一会话7.2 分布式爬虫雏形基础任务队列实现from queue import Queue task_queue Queue() for url in url_list: task_queue.put(url) # 工作线程处理 def worker(): while not task_queue.empty(): url task_queue.get() # 处理逻辑8. 法律合规注意事项在实际项目中有几点必须特别注意严格遵守robots.txt协议单域名请求频率控制在合理范围不抓取个人隐私数据商业用途需获得授权我常用的做法是在代码中加入合规检查def check_robots_txt(url): domain urlparse(url).netloc robots_url fhttps://{domain}/robots.txt try: response requests.get(robots_url, timeout5) # 解析是否允许当前路径抓取 except: return False