超详细 Python 爬虫指南

目录

一、爬虫的基本原理

二、爬虫实现步骤

1. 准备工作

2. 详细代码实现

三、处理反爬机制

四、爬取复杂数据的技巧

1. JSON 数据爬取

2. 分页数据爬取

3. 下载文件

五、完整爬虫示例

六、注意事项


一、爬虫的基本原理
  1. HTTP 请求与响应
    • 爬虫通过 HTTP 协议与目标网站服务器通信。
    • 发送请求时可指定 URL、请求方法(GETPOST)、请求头等。
    • 服务器根据请求返回 HTML 页面、JSON 数据或其他格式的响应。
  2. HTML 解析
    HTML 是网页的主要结构。爬虫通过解析 HTML 提取有用信息,如标题、图片、表格等。
  3. 数据存储
    抓取的数据可存储到文件(如 CSV、JSON)、数据库(如 MySQL、MongoDB)等介质中,便于后续分析。
  4. 反爬机制
    • User-Agent 检测:服务器检查请求来源是否合法。
    • 频率限制:高频访问可能触发封禁。
    • 验证码验证:部分网站通过验证码阻止自动化行为。
  5. robots.txt 协议
    网站通过 robots.txt 指定哪些页面可以被爬取,爬虫需遵守此协议。

二、爬虫实现步骤
1. 准备工作

安装必要的库:

pip install requests beautifulsoup4 lxml pandas 
2. 详细代码实现

(1)发送 HTTP 请求 通过 requests 库获取网页内容。

import requests # 定义目标 URL url = "https://example.com" # 设置请求头,伪装为浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" } # 发送请求 response = requests.get(url, headers=headers) # 检查状态码 if response.status_code == 200: print("请求成功!") print(response.text[:500]) # 打印部分网页内容 else: print(f"请求失败,状态码: {response.status_code}") 

(2)解析 HTML 数据 使用 BeautifulSoup 提取 HTML 中的内容。

from bs4 import BeautifulSoup # 使用 BeautifulSoup 解析 HTML soup = BeautifulSoup(response.text, "lxml") # 提取网页标题 title = soup.title.string print(f"网页标题: {title}") # 提取所有超链接 links = [] for a_tag in soup.find_all("a", href=True): links.append(a_tag["href"]) print("提取到的链接:") print(" ".join(links)) 

(3)存储数据 将数据保存为 CSV 文件。

import pandas as pd # 构造数据字典 data = {"Links": links} # 转换为 DataFrame df = pd.DataFrame(data) # 保存为 CSV df.to_csv("links.csv", index=False, encoding="utf-8-sig") print("数据已保存到 links.csv") 

(4)动态网页处理 有些网页通过 JavaScript 加载数据,requests 无法直接抓取。这时需使用浏览器自动化工具,如 Selenium 或 Playwright。

以下是 Selenium 的示例:

pip install selenium from selenium import webdriver from selenium.webdriver.common.by import By # 配置 Selenium WebDriver(以 Chrome 为例) options = webdriver.ChromeOptions() options.add_argument("--headless") # 无头模式 driver = webdriver.Chrome(options=options) # 打开网页 driver.get("https://example.com") # 等待页面加载 driver.implicitly_wait(10) # 提取动态加载的内容 titles = driver.find_elements(By.TAG_NAME, "h1") for title in titles: print(title.text) # 关闭浏览器 driver.quit() 

三、处理反爬机制

添加随机延迟 避免频繁请求被封禁:

import time import random time.sleep(random.uniform(1, 3)) # 随机延迟 1-3 秒 

使用代理 IP 通过代理绕过 IP 封禁:

proxies = { "http": "http://username:password@proxyserver:port", "https": "http://username:password@proxyserver:port" } response = requests.get(url, headers=headers, proxies=proxies) 

处理验证码 使用 OCR 识别验证码:

pip install pytesseract pillow from PIL import Image import pytesseract # 读取验证码图片 image = Image.open("captcha.png") # 使用 OCR 识别文本 captcha_text = pytesseract.image_to_string(image) print(f"验证码内容: {captcha_text}") 

四、爬取复杂数据的技巧
1. JSON 数据爬取

许多网站的动态内容通过 API 提供 JSON 数据,可以直接请求这些接口:

api_url = "https://example.com/api/data" response = requests.get(api_url, headers=headers) # 解析 JSON 数据 data = response.json() print(data) 
2. 分页数据爬取

自动抓取多页内容:

base_url = "https://example.com/page={}" for page in range(1, 6): url = base_url.format(page) response = requests.get(url, headers=headers) print(f"抓取第 {page} 页内容") 
3. 下载文件

下载图片或文件到本地:

file_url = "https://example.com/image.jpg" response = requests.get(file_url, stream=True) # 保存到本地 with open("image.jpg", "wb") as file: for chunk in response.iter_content(chunk_size=1024): file.write(chunk) print("文件下载完成!") 

五、完整爬虫示例

以下是一个完整的爬虫脚本,抓取新闻网站标题与链接并保存为 CSV 文件:

import requests from bs4 import BeautifulSoup import pandas as pd import time import random # 设置目标 URL 和请求头 base_url = "https://news.ycombinator.com/" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" } # 存储数据 titles = [] links = [] # 爬取内容 for page in range(1, 4): # 抓取前三页 url = f"{base_url}?p={page}" response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "lxml") for item in soup.find_all("a", class_="titlelink"): titles.append(item.text) links.append(item["href"]) print(f"完成第 {page} 页爬取") time.sleep(random.uniform(1, 3)) # 随机延迟 # 保存数据到 CSV data = {"Title": titles, "Link": links} df = pd.DataFrame(data) df.to_csv("news.csv", index=False, encoding="utf-8-sig") print("新闻数据已保存到 news.csv") 

六、注意事项
  1. 避免法律风险
    • 爬取前阅读目标网站的使用条款。
    • 遵守 robots.txt 协议。
  2. 优化性能
    使用多线程或异步技术(如 asyncioaiohttp)提高效率。
  3. 应对反爬
    熟练使用代理、延迟和伪装技巧。

Read more

OpenClaw 都在排队养,你还在云端白嫖?手把手教你用 Python 搭建本地 AI 智能体(小白也能养自己的小龙虾)

OpenClaw 都在排队养,你还在云端白嫖?手把手教你用 Python 搭建本地 AI 智能体(小白也能养自己的小龙虾)

🦞 长文警告! 📜 文章目录(点击跳转,这波操作稳如老狗) 1. 前言:别再当云端 AI 的韭菜了,把“小龙虾”养在自己家 2. 第一步:给电脑装个“胃”——下载安装 Python(含官网地址) 3. 第二步:请个本地“大脑”——Ollama + Qwen 模型(白嫖党狂喜) 4. 第三步:搭个“龙虾笼子”——安装 OpenClaw(附项目地址) 5. 第四步:用 Python 写个“传话筒”,让你的小龙虾听你指挥 6. 第五步:第一次对话——你的本地贾维斯上线 7. 总结:白嫖虽好,但别让龙虾把你的电脑“钳”

By Ne0inhk
Python开发从入门到精通:异步编程与协程

Python开发从入门到精通:异步编程与协程

《Python开发从入门到精通》设计指南第二十一篇:异步编程与协程 一、学习目标与重点 💡 学习目标:掌握Python异步编程的基本概念和方法,包括协程、任务调度、事件循环等;学习asyncio、aiohttp等核心库的使用;通过实战案例开发异步应用程序。 ⚠️ 学习重点:协程的定义与使用、任务调度、事件循环、asyncio库、aiohttp库、异步编程实战。 21.1 异步编程概述 21.1.1 什么是异步编程 异步编程是一种并发编程方式,通过非阻塞的操作提高程序的执行效率。在异步编程中,程序可以在等待I/O操作完成时继续执行其他任务,而不需要阻塞等待。 21.1.2 异步编程的优势 * 提高执行效率:在等待I/O操作完成时,程序可以继续执行其他任务。 * 降低资源消耗:减少了线程切换的开销。 * 简化代码结构:通过协程和任务调度,代码结构更加简洁。 21.1.3 异步编程的应用场景

By Ne0inhk
2026 Python+AI 学习方向拆解:3 个高性价比赛道,新手优先学

2026 Python+AI 学习方向拆解:3 个高性价比赛道,新手优先学

欢迎文末添加好友交流,共同进步! “ 俺はモンキー・D・ルフィ。海贼王になる男だ!” * 前言 * 一、AI数据处理与分析赛道 * 1.1 为什么选择这个方向? * 1.2 核心技能树 * 1.3 实战代码示例 * 数据清洗与预处理 * 1.4 学习路线图 * 二、AI应用开发赛道(LLM + RAG) * 2.1 为什么选择这个方向? * 2.2 RAG技术架构流程 * 2.3 实战代码:构建RAG问答系统 * 2.4 学习路线图 * 三、AI自动化办公赛道 * 3.1 为什么选择这个方向? * 3.2 自动化办公应用场景 * 3.3 实战代码示例

By Ne0inhk
Python:从数据科学到星辰大海,无所不能的编程“瑞士军刀”

Python:从数据科学到星辰大海,无所不能的编程“瑞士军刀”

🌟 Hello,我是蒋星熠Jaxonic! 🌈 在浩瀚无垠的技术宇宙中,我是一名执着的星际旅人,用代码绘制探索的轨迹。 🚀 每一个算法都是我点燃的推进器,每一行代码都是我航行的星图。 🔭 每一次性能优化都是我的天文望远镜,每一次架构设计都是我的引力弹弓。 🎻 在数字世界的协奏曲中,我既是作曲家也是首席乐手。让我们携手,在二进制星河中谱写属于极客的壮丽诗篇! 摘要 我时常被问到一个问题:“在众多编程语言中,为何你对 Python 情有独钟?” 每当这时,我总会微笑着回想起初次接触它时的情景。那时的我,还在为 C++ 的指针和内存管理而焦头烂额,为 Java 繁复的样板代码而感到窒息。直到 Python 如同一股清流,以其极致的简洁和优雅,瞬间俘获了我的心。它就像一把瑞士军刀,看似小巧,却集成了你所能想象到的几乎所有功能。我的探索之旅始于用它编写简单的自动化脚本,将我从繁琐的重复性工作中解放出来,让我第一次真切地感受到了“用代码改变生活”的魔力。随着探索的深入,我驾驶着 Python 这艘飞船,驶入了 Web 开发的广阔星域。借助 Django

By Ne0inhk