全篇大概 5000 字(含代码),建议阅读时间 40min
一、Python爬虫简介
1.1 什么是网络爬虫?
定义:
网络爬虫(Web Crawler)是自动浏览互联网并采集数据的程序,就像电子蜘蛛在网页间"爬行"。
分类
:
- 通用爬虫:Google等搜索引擎的爬虫
- 聚焦爬虫:定向采集特定领域数据(如电商价格)
- 增量式爬虫:只抓取更新内容
- 深层爬虫:抓取需要登录的页面
1.2 Python爬虫的优势
示例对比:
//Java实现HTTP请求
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://aizlian.xyz")).build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
#Python实现同样功能
import requests
response = requests.get("https://aizlian.xyz")
优势对比
:
- 语法简洁:代码量减少50%
- 库生态丰富:requests(网络请求)、BeautifulSoup(HTML解析)、Scrapy(框架)等
- 跨平台:Windows/MacOS/Linux通用
- 调试方便:REPL环境快速测试代码
二、环境搭建
2.1 Python环境安装
进入Python官网,下载与电脑系统匹配的版本。
下载完成后,按照提示完成环境安装。
验证安装
:在终端命令行窗口输入命令
python --version
输出以下提示,说明安装成功。
三、Requests库
相比Python内置的urllib
,requesets
设计更简洁直观,例如发送GET请求仅需一行代码:requests.get(url)
3.1 安装与导入
安装 requests
pip install requests
导入requests
import requests
3.2 发送GET请求
通过requests.get()获取网页内容:
response = requests.get("https://aizlian.xyz")
状态码:检查请求是否成功(200表示成功):
print(response.status_code) # 输出:200
文本内容:获取网页HTML或文本:
print(response.text) # 输出网页内容
全部代码
import requestsresponse = requests.get("https://aizlian.xyz")print(response.status_code)
print(response.text)
3.3 发送POST请求
用 requests.post()
提交数据(如表单或登录):
import requests
# 提交表单数据
data = {"username": "admin", "password": "123456"}
response = requests.post("https://httpbin.org/post", data=data)# 提交JSON数据
json_data = {"key": "value"}
response = requests.post("https://httpbin.org/post", json=json_data)
3.4 处理响应内容
解析JSON:直接转为Python字典:
data = response.json()
print(data) # 输出解析后的JSON
二进制内容(如下载图片):
import requests
response = requests.get("图片网址")
with open("image.jpg", "wb") as f:f.write(response.content) # 保存二进制数据
3.5 参数
URL参数:通过params添加查询参数:
params = {"page": 1, "limit": 10}
response = requests.get("https://httpbin.org/get", params=params)
请求头:伪装浏览器标识(避免被反爬):
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
3.6 异常处理
if response.status_code == 200:print("请求成功!")
else:print("请求失败,状态码:", response.status_code)
四、BeautifulSoup库
解析复杂HTML/XML
文档,将网页转化为可操作的树形结构
4.1 安装与导入
安装
pip install beautifulsoup4
pip install lxml
导入
from bs4 import BeautifulSoup
4.2 核心功能
文档对象创建
from bs4 import BeautifulSoup
# 通过字符串或requests响应创建对象[2,5](@ref)
soup = BeautifulSoup(HTML文档, 'lxml')
元素定位
三剑客
方法 | 功能描述 | 代码示例 |
---|---|---|
find() | 获取第一个匹配元素 | soup.find(‘div’, id=‘header’) |
find_all() | 返回所有匹配元素的列表 | soup.find_all(‘a’, class_=‘link’) |
select() | CSS选择器精准定位 | soup.select(‘div.content > p’) |
select_one() | 返回第一个匹配的 CSS 选择器元素 | soup.select_one(‘.title’) |
find_parent() | 查找当前标签的父级标签 | tag.find_parent(‘div’) |
find_next() | 查找后续第一个符合条件的标签 | tag.find_next(‘p’) |
数据提取
技巧
- 文本内容:
tag.text
(包含子标签文本)或tag.get_text()
- 属性值获取:
tag['href']
或tag.get('src')
(避免KeyError) - 嵌套处理:通过
.parent
/.children
遍历文档树
4.3 动态网页数据抓取
import requests
from bs4 import BeautifulSoupurl = 'https://www.aizlian.xyz'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')cates = []
for cate in soup.select('.col-4'):cates.append(cate.a['href'])print(cates)
五、数据存储
5.1 CSV存储最佳实践
安装
pip install csv
使用DictWriter
避免列错位:
import csvdata = [{'name': '商品A', 'price': 299},{'name': '商品B', 'price': 599}
]with open('products.csv', 'w', newline='', encoding='utf-8-sig') as f:writer = csv.DictWriter(f, fieldnames=['name', 'price'])writer.writeheader()writer.writerows(data)
5.2 MySQL数据库操作
安装
pip install pymysql
连接池
管理:
import pymysql
from dbutils.pooled_db import PooledDBpool = PooledDB(creator=pymysql,host='localhost',user='root',password='pass123',database='crawler_db',maxconnections=5
)# 使用连接
conn = pool.connection()
cursor = conn.cursor()
cursor.execute("INSERT INTO movies VALUES (%s, %s)", ("泰坦尼克号", 9.4))
conn.commit()
六、实战
实战项目:豆瓣电影Top250
完整代码(含异常处理):
import requests
from bs4 import BeautifulSoup
import csv
import timedef get_movie_info(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Accept-Language': 'zh-CN,zh;q=0.9'}try:response = requests.get(url, headers=headers, timeout=10)response.raise_for_status() # 自动处理HTTP错误soup = BeautifulSoup(response.text, 'lxml')movies = []for item in soup.find_all('div', class_='item'):# 使用CSS选择器精确提取title = item.select_one('.title').text.strip()rating = item.select_one('.rating_num').text.strip()link = item.find('a')['href']movies.append([title, rating, link])return moviesexcept Exception as e:print(f"抓取失败:{e}")return []def main():base_url = "https://movie.douban.com/top250?start={}"with open('douban_top250.csv', 'w', newline='', encoding='utf-8-sig') as f:writer = csv.writer(f)writer.writerow(['排名', '电影名称', '评分', '详情链接'])for page in range(0, 250, 25):url = base_url.format(page)movies = get_movie_info(url)for idx, movie in enumerate(movies, start=page+1):writer.writerow([idx] + movie)print(f"已抓取第{page//25+1}页数据")time.sleep(2)if __name__ == '__main__':main()
执行完程序之后我们可以看到csv文件中已经有内容了。