网站Logo 开飞机的舒克

Python爬虫基础学习总结

dddd
23
2026-01-10

1. 爬虫基础概念

爬虫是一种按照一定规则,自动抓取互联网信息的程序或脚本。Python爬虫主要涉及以下几个核心环节:

  • 发送HTTP请求获取网页内容

  • 解析和提取目标数据

  • 存储数据

2. urllib库基础

2.1 基本使用(first.py)

urllib是Python内置的HTTP请求库,用于发送请求和获取响应。

from urllib.request import urlopen

# 1. 定义目标URL
baseUrl = "https://www.baidu.com"

# 2. 发送GET请求,获取响应对象
response = urlopen(baseUrl)

# 3. 读取响应内容并解码为字符串
html = response.read().decode("utf-8")

# 4. 将内容保存到本地文件
with open('./mybaidu.html', 'w', encoding='utf-8') as f:
    f.write(html)

2.2 核心知识点

  • urlopen(): 发送HTTP请求,返回响应对象

  • read(): 读取响应内容(字节流)

  • decode(): 将字节流转换为字符串,需要指定编码格式(如utf-8)

  • 文件读写: 使用with open()上下文管理器安全操作文件

3. requests库入门

3.1 基本使用(test_requests.py)

requests是Python最流行的HTTP库,比urllib更简洁易用。

import requests

# 1. 定义目标URL
url = 'https://www.baidu.com'

# 2. 发送GET请求,获取响应对象
response = requests.get(url)

# 3. 查看响应信息
print("响应对象:", response)           # <Response [200]>
print("响应状态码:", response.status_code)  # 200
print("响应头:", response.headers)        # 包含服务器返回的所有头信息
print("响应内容(bytes):", response.content)  # 字节流形式
print("响应内容(str):", response.text)      # 字符串形式

3.2 核心知识点

  • requests.get(): 发送GET请求

  • 响应对象的核心属性:

    • status_code: 响应状态码(200表示成功)

    • headers: 响应头

    • content: 字节流响应内容

    • text: 自动解码的字符串响应内容

4. requests库进阶 - GET请求

4.1 带Headers的GET请求(requests_do.py)

Headers用于模拟浏览器请求,避免被服务器识别为爬虫。

import requests

# 1. 定义目标URL
url = f'https://www.sougou.com/web?query=周杰伦&_asf=www.sogou.com&_ast=1768034633&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index'

# 2. 定义Headers,模拟浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    # 其他Headers...
}

# 3. 发送带Headers的GET请求
res = requests.get(url, headers=headers)

4.2 带Params的GET请求(douban.py)

Params用于构建查询字符串,适合动态参数传递。

import requests

# 1. 定义基础URL
url = "https://movie.douban.com/j/chart/top_list"

# 2. 定义查询参数
params = {
    'type': '24',          # 电影类型(喜剧)
    'interval_id': '100:90',  # 评分区间
    'action': '',
    'start': '0',          # 起始索引
    'limit': '20'          # 获取数量
}

# 3. 定义Headers
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
}

# 4. 发送带Params和Headers的GET请求
res = requests.get(url, params=params, headers=header)

# 5. 处理JSON响应
print(res.json())

# 6. 保存JSON数据到本地
with open('./douban.json', 'w', encoding='utf-8') as f:
    f.write(res.text)

4.3 GET请求核心知识点

  • headers参数:模拟浏览器,包含User-Agent等信息

  • params参数:构建查询字符串,自动添加到URL

  • json()方法:将JSON格式的响应内容转换为Python字典

5. requests库进阶 - POST请求

5.1 带Data的POST请求(baidufanyi.py)

POST请求用于向服务器提交数据,如表单提交、API调用等。

import requests

# 1. 定义目标URL
url = f'https://fanyi.baidu.com/sug'

# 2. 定义Headers
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    # 其他Headers...
}

# 3. 定义要提交的数据
data = {
    'kw': 'dog',  # 翻译关键词
}

# 4. 发送POST请求
res = requests.post(url, headers=headers, data=data)

# 5. 处理JSON响应
print(res.json()['data'][0])  # 获取翻译结果

5.2 POST请求核心知识点

  • requests.post(): 发送POST请求

  • data参数:提交表单数据,适合application/x-www-form-urlencoded格式

  • 对于JSON格式的请求体,使用json参数

6. 数据解析 - 正则表达式

6.1 正则表达式基础(datadeal.py)

正则表达式是一种用于匹配字符串的强大工具,常用于从HTML、JSON等文本中提取数据。

6.1.1 常用元字符

元字符

描述

.

匹配任意字符(除换行符)

\d

匹配数字(0-9)

\D

匹配非数字

\w

匹配字母、数字、下划线

\W

匹配非字母、数字、下划线

\s

匹配空格、制表符、换行符

\S

匹配非空白字符

^

匹配字符串开头

$

匹配字符串结尾

[]

匹配方括号中的任意字符

[^]

匹配非方括号中的任意字符

`

`

()

分组,提取匹配内容

6.1.2 常用量词

量词

描述

*

匹配0次或多次

+

匹配1次或多次

?

匹配0次或1次

{n}

匹配n次

{n,}

匹配n次或多次

{n,m}

匹配n到m次

6.1.3 贪婪匹配与惰性匹配

  • .* 贪婪匹配:匹配尽可能多的字符

  • .*? 惰性匹配:匹配尽可能少的字符

6.2 re模块常用方法

import re

# 1. findall() - 获取所有匹配结果,返回列表
res = re.findall(r'\d+', '永远18岁,还要有很多很多100万')  # ['18', '100']

# 2. finditer() - 获取所有匹配结果,返回迭代器
res = re.finditer(r'\d+', '永远18岁,还要有很多很多100万')
for item in res:
    print(item.group())  # 18, 100

# 3. search() - 返回第一次匹配结果,返回匹配对象
res = re.search(r'\d+', '永远18岁,还要有很多很多100万')
print(res.group())  # 18

# 4. match() - 从字符串开头匹配,返回匹配对象
res = re.match(r'\d+', '永远18岁')  # None,因为开头不是数字

# 5. compile() - 编译正则表达式,提高复用性
pattern = re.compile(r'\d+')
res = pattern.findall('永远18岁,还要有很多很多100万')  # ['18', '100']

6.3 正则表达式解析HTML

# HTML示例
html = '''
<html>
    <head>
        <title>这是一个标题</title>
    </head>
    <body>
        <h1>这是一个h1标题</h1>
        <p>这是一个段落</p>
        <div>这是一个div<span id="span1">中国移动</span></div>
        <div>这是一个div<span id="span2">中国电信</span></div>
    </body>
</html>
'''

# 提取标题
res = re.findall(r'<title>(.*?)</title>', html)
print(res[0])  # 这是一个标题

# 提取span内容和id(分组)
res = re.findall(r'<div>这是一个div<span id="(span\d+?)">(.*?)</span></div>', html)
print(res)  # [('span1', '中国移动'), ('span2', '中国电信')]

# 使用命名分组
res = re.finditer(r'<div>这是一个div<span id="(?P<span_id>span\d+?)">(?P<span_content>.*?)</span></div>', html)
for item in res:
    print(item.group('span_id'))  # span1, span2
    print(item.group('span_content'))  # 中国移动, 中国电信

7. 学习建议

  1. 基础巩固:熟练掌握HTTP协议、HTML结构和CSS选择器

  2. 库的选择

    • 发送请求:requests库(简洁易用)

    • 数据解析:

      • 正则表达式(通用但复杂)

      • BeautifulSoup(HTML解析神器)

      • lxml(高效的HTML/XML解析库)

      • jsonpath(JSON数据解析)

  3. 进阶学习

    • 动态加载数据爬取(Selenium、Playwright)

    • 异步爬虫(asyncio + aiohttp)

    • 爬虫框架(Scrapy)

    • 反爬策略应对(代理IP、验证码识别、动态UA)

  4. 实战练习:从简单网站开始,逐步挑战复杂网站

  5. 遵守规则:尊重网站robots.txt协议,不要过度请求影响网站正常运行

8. 下一步学习方向

  1. 学习BeautifulSoup和lxml库,更高效地解析HTML

  2. 学习处理JavaScript动态加载的内容

  3. 学习使用Scrapy框架进行大规模爬虫开发

  4. 学习数据库操作,将爬取的数据持久化存储

  5. 学习爬虫部署和监控


仅供学习,请勿乱搞