Python 网络爬虫基础教程
网络爬虫分类
- 通用网络爬虫:搜索引擎使用,通常遵守 robots 协议。
- robots 协议:网站通过 robots 协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。通用网络爬虫需要遵守 robots 协议(君子协议)。
Python 网络爬虫基础教程涵盖爬虫分类、请求模块 urllib 使用、URL 编码及静态页面抓取实战。内容详解如何构建请求对象、设置 User-Agent 避免封禁、处理中文参数编码,并通过百度贴吧案例演示完整的数据获取与保存流程。强调遵守 robots 协议及法律合规性,适合初学者掌握网页数据采集核心技能。

https://www.baidu.com/robots.txt使用 urllib.request 模块发送 HTTP 请求。
from urllib import request
# 获得响应对象
res = request.urlopen(url='http://www.baidu.com/')
# 获取网页源代码(默认是字节串,需要转为字符串)
html = res.read().decode()
# 获取实际地址(有些网页可能会进行重定向,从而返回另一个地址)
url = res.geturl()
# 返回 http 响应码
code = res.getcode()
print(res)
print('=' * 30)
print(html[:500]) # 仅打印前 500 字符以便阅读
print('=' * 30)
print(url)
print('=' * 30)
print(code)
注意: res.geturl() 返回的是最终的实际地址,因为某些网页会进行重定向。
浏览器访问网站时会携带 User-Agent 信息,而 Python 默认的请求头可能包含 python-urllib 标识,容易被服务器识别并拒绝访问。
问题: 直接访问可能被拦截。
解决方案: 在请求头中伪装成浏览器。
from urllib import request
# 1. 定义常用变量
url = 'http://httpbin.org/get'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
# 2. 包装请求
req = request.Request(url=url, headers=headers)
# 3. 发请求
res = request.urlopen(req)
# 4. 获取响应内容
html = res.read().decode()
print(html)
总结: 设置 User-Agent 可以有效模拟浏览器行为,降低被目标网站屏蔽的风险。
import urllib.parse 或 from urllib import parsehttps://www.baidu.com/s?wd=美女https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3拼接 URL 的三种方式:
parse.urlencodeparse.quote小练习: 编写一个脚本,输入关键字,搜索百度并保存结果。
from urllib import request
from urllib import parse
import time
import random
# 1. 拼接 url 地址
word = input('请输入百度搜索关键字:')
params = parse.urlencode({'wd': word})
url = 'http://www.baidu.com/s?{}'.format(params)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
# 2. 发请求获取响应内容
req = request.Request(url=url, headers=headers)
res = request.urlopen(req)
html = res.read().decode()
# 3. 保存到本地文件
filename = word + '.html'
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
print(f'搜索结果已保存至 {filename}')
import random
import time
import re
from urllib import request
from urllib import parse
class BaiduTiebaSpider:
def __init__(self):
self.url_template = 'http://tieba.baidu.com/f?kw={}&pn={}'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
def get_html(self, url):
req = request.Request(url=url, headers=self.headers)
try:
res = request.urlopen(req, timeout=10)
html = res.read().decode('utf-8')
return html
except Exception as e:
print(f'请求失败:{e}')
return None
def parse_html(self, html):
"""解析提取数据的函数"""
if not html:
return []
# 使用正则表达式匹配帖子标题和链接
pattern = r'<a class="j_th_tit ".*?href="(.*?)".*?>(.*?)</a>'
matches = re.findall(pattern, html)
data_list = []
for link, title in matches:
data_list.append({'title': title.strip(), 'link': link})
return data_list
def save_html(self, filename, html):
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
def run(self):
name = input('请输入贴吧名:')
start = int(input('请输入起始页:'))
end = int(input('请输入终止页:'))
params = parse.quote(name)
for page in range(start, end + 1):
pn = (page - 1) * 50 # 根据所选贴吧 url 规律计算得出
url = self.url_template.format(params, pn)
html = self.get_html(url)
if html:
filename = '{}_第{}页.html'.format(name, page)
self.save_html(filename, html)
# 解析并展示部分数据
data = self.parse_html(html)
print(f'第{page}页抓取成功,共发现 {len(data)} 个帖子')
# 控制数据抓取的频率,避免被封禁
time.sleep(random.randint(1, 3))
if __name__ == '__main__':
test = BaiduTiebaSpider()
test.run()
运行结果示例:
请输入贴吧名:赵丽颖
请输入起始页:1
请输入终止页:3
第 1 页抓取成功,共发现 30 个帖子
第 2 页抓取成功,共发现 30 个帖子
第 3 页抓取成功,共发现 30 个帖子

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online