本文面向爬虫入门及进阶学习者,聚焦Python爬虫核心技术栈,通过极简案例串联实战流程,同时明确合规边界与反爬应对思路,拒绝冗余理论,直击技术要点。
一、核心环境与工具准备
爬虫开发的基础依赖可归纳为"核心库+辅助工具",无需复杂配置,快速上手:
-
核心库:requests(处理HTTP请求,替代urllib的繁琐操作)、BeautifulSoup4(解析HTML/XML,提取数据)、lxml(高效解析器,提升BeautifulSoup性能)、json(处理接口返回的JSON数据)。
-
辅助工具:Chrome开发者工具(分析请求、定位数据)、Postman(模拟HTTP请求,调试接口)、PyCharm(开发IDE,支持断点调试)。
-
安装命令 :一行命令完成核心依赖安装:
pip install requests beautifulsoup4 lxml
二、爬虫核心流程拆解
爬虫本质是"模拟浏览器请求-获取数据-解析提取-存储"的闭环流程,每一步都有明确的技术选型和避坑点:
1. 发送HTTP请求(requests核心用法)
核心是构造合规请求头,避免被服务器直接拦截,关键参数:
-
url:目标资源地址(必传);
-
headers:请求头,至少包含User-Agent(模拟浏览器,格式如:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36);
-
method:请求方式(GET/POST,GET用于获取数据,POST用于提交数据);
-
params/data:GET请求用params传参,POST请求用data/json传参。
极简案例(获取网页内容):
import requests url = "https://example.com" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) response.encoding = response.apparent_encoding # 自动识别编码,避免乱码 html_content = response.text # 获取网页HTML内容
2. 数据解析(BeautifulSoup实战)
重点是通过标签、类名、ID等定位数据,BeautifulSoup支持CSS选择器和HTML标签遍历,最常用CSS选择器(效率高、易上手):
from bs4 import BeautifulSoup soup = BeautifulSoup(html_content, "lxml") # 指定lxml解析器,速度更快 # 示例1:提取所有class为"title"的a标签文本 titles = [item.get_text(strip=True) for item in soup.select("a.title")] # 示例2:提取id为"content"的div标签下的p标签内容 content = soup.select_one("div#content p").get_text(strip=True) # 示例3:提取a标签的href属性(跳转链接) links = [item["href"] for item in soup.select("a.title")]
避坑点:若数据在script标签中(动态加载),需先提取script内容,再用json.loads()解析,而非直接用CSS选择器定位。
3. 数据存储(本地/数据库)
根据数据量选择存储方式,入门阶段优先掌握本地文件和MySQL存储:
- 本地存储:TXT/CSV(适合小数据量),用csv库避免乱码:
import csv # 写入CSV文件 with open("data.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow(["标题", "链接"]) # 表头 for title, link in zip(titles, links): writer.writerow([title, link])
- 数据库存储:MySQL(适合大数据量),用pymysql库连接:
import pymysql # 连接MySQL(需提前创建数据库和表) db = pymysql.connect(host="localhost", user="root", password="123456", database="crawler_db") cursor = db.cursor() # 插入数据 sql = "INSERT INTO article(title, link) VALUES (%s, %s)" for title, link in zip(titles, links): cursor.execute(sql, (title, link)) db.commit() cursor.close() db.close()
三、常见反爬与应对策略
爬虫开发的核心挑战是反爬,入门阶段需掌握3类基础反爬应对:
-
请求头反爬:除User-Agent外,需补充Referer(模拟从某个页面跳转)、Cookie(维持登录状态),可通过Chrome开发者工具复制完整请求头。
-
IP封禁:频繁请求会导致IP被封,解决方案:① 加入随机延时(time.sleep(random.uniform(1,3)));② 使用代理IP(requests.get(url, proxies={"http":"http://ip:port", "https":"https://ip:port"}))。
-
动态加载(JavaScript渲染):数据通过AJAX加载,常规requests无法获取,解决方案:① 用Chrome开发者工具抓包,直接请求真实接口(优先选择,效率高);② 用Selenium模拟浏览器渲染(适合复杂场景,代码示例如下):
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() # 需下载ChromeDriver,与浏览器版本匹配 driver.get("https://example.com") time.sleep(2) # 等待页面加载完成 # 提取数据(通过XPath定位) titles = [item.text for item in driver.find_elements(By.XPATH, "//a[@class='title']")] driver.quit()
四、爬虫合规边界(必看)
合法爬虫是前提,需遵守以下3点:
-
查看目标网站的robots.txt协议(如https://example.com/robots.txt),遵守"禁止爬取"的目录;
-
控制请求频率,避免给服务器造成压力(建议添加延时,单机请求频率不超过1次/秒);
-
不得爬取隐私数据、商业机密,不得用于违法用途,爬取数据仅用于个人学习。
五、总结与进阶方向
本文覆盖Python爬虫的核心流程:请求构造-数据解析-数据存储-反爬应对,掌握这些内容可应对80%的基础爬虫场景。进阶方向:① 分布式爬虫(Scrapy框架);② 验证码识别(OCR、打码平台);③ 异步爬虫(aiohttp)。建议从实战入手,选择一个公开数据的网站(如博客园、开源项目文档)反复练习,快速提升技术。
如果本文对你有帮助,欢迎点赞、收藏,如有疑问可在评论区留言交流~