全篇大概 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 requests
response = 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 BeautifulSoup
url = '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 csv
data = [
    {'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 PooledDB
pool = 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 time
def 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 movies
        
    except 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文件中已经有内容了。
 









![LINUX网络基础 [五] - HTTP协议](https://i-blog.csdnimg.cn/direct/7f4a60b9fa72401a9c61b5a51821e0a2.gif)









