13-实战项目4-爬取网页数据
信息差就是钱!
你有没有过这样的经历:
- 想统计某个网站的商品价格,手动记录到崩溃
- 想批量下载图片,一个一个右键保存到吐血
- 想获取竞争对手的数据,手动复制粘贴到天荒地老
别再假装你会手动收集数据了,用Python吧!
今天我们做一个网页爬虫,自动获取网页数据,信息差就是钱!
准备工作
安装所需库:
pip install requests beautifulsoup4
基础:获取网页内容
import requests
def get_webpage(url):
"""
获取网页内容
Args:
url: 网页URL
Returns:
网页HTML内容
"""
try:
# 设置请求头(模拟浏览器)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
# 发送请求
response = requests.get(url, headers=headers)
# 检查状态码
if response.status_code == 200:
print(f"成功获取网页:{url}")
return response.text
else:
print(f"请求失败,状态码:{response.status_code}")
return None
except Exception as e:
print(f"请求失败:{e}")
return None
# 使用示例
if __name__ == "__main__":
url = "https://www.example.com"
html = get_webpage(url)
if html:
print(html[:500]) # 打印前500个字符
进阶:解析HTML提取数据
from bs4 import BeautifulSoup
def parse_html(html):
"""
解析HTML提取数据
Args:
html: HTML字符串
Returns:
提取的数据
"""
# 创建BeautifulSoup对象
soup = BeautifulSoup(html, "html.parser")
# 提取标题
title = soup.title.string
print(f"网页标题:{title}")
# 提取所有链接
print("\n所有链接:")
for link in soup.find_all("a"):
href = link.get("href")
text = link.string
if href and text:
print(f" - {text}: {href}")
# 提取所有图片
print("\n所有图片:")
for img in soup.find_all("img"):
src = img.get("src")
alt = img.get("alt", "")
if src:
print(f" - {alt}: {src}")
# 使用示例
if __name__ == "__main__":
import requests
url = "https://www.example.com"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
parse_html(response.text)
实战:爬取新闻标题
import requests
from bs4 import BeautifulSoup
import json
def crawl_news(url):
"""
爬取新闻标题
Args:
url: 新闻网站URL
Returns:
新闻列表
"""
try:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
# 发送请求
response = requests.get(url, headers=headers)
if response.status_code != 200:
print(f"请求失败,状态码:{response.status_code}")
return []
# 解析HTML
soup = BeautifulSoup(response.text, "html.parser")
# 提取新闻标题(这里需要根据实际网页结构修改)
news_list = []
# 示例:提取所有h2标题
for item in soup.find_all("h2"):
title = item.string
link = item.find("a")
if title and link:
news_list.append({
"title": title,
"link": link.get("href")
})
return news_list
except Exception as e:
print(f"爬取失败:{e}")
return []
def save_news(news_list, filename):
"""
保存新闻到JSON文件
Args:
news_list: 新闻列表
filename: 文件名
"""
with open(filename, "w", encoding="utf-8") as f:
json.dump(news_list, f, ensure_ascii=False, indent=2)
print(f"新闻已保存到:{filename}")
# 使用示例
if __name__ == "__main__":
url = "https://www.example.com/news" # 替换成实际的新闻网站
news_list = crawl_news(url)
print(f"\n共爬取 {len(news_list)} 条新闻")
for news in news_list[:10]: # 只显示前10条
print(f"- {news['title']}")
save_news(news_list, "news.json")
实战:批量下载图片
import requests
import os
from urllib.parse import urljoin
def download_images(url, save_folder="images"):
"""
批量下载网页图片
Args:
url: 网页URL
save_folder: 保存文件夹
"""
try:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
# 获取网页
response = requests.get(url, headers=headers)
if response.status_code != 200:
print(f"请求失败,状态码:{response.status_code}")
return
# 解析HTML
soup = BeautifulSoup(response.text, "html.parser")
# 创建保存文件夹
os.makedirs(save_folder, exist_ok=True)
# 找到所有图片
images = soup.find_all("img")
print(f"找到 {len(images)} 张图片")
# 下载图片
for i, img in enumerate(images, 1):
src = img.get("src")
if not src:
continue
# 转换成绝对URL
img_url = urljoin(url, src)
try:
# 下载图片
img_response = requests.get(img_url, headers=headers)
if img_response.status_code == 200:
# 提取文件扩展名
ext = os.path.splitext(img_url)[1]
if not ext:
ext = ".jpg"
# 保存图片
filename = f"image_{i:03d}{ext}"
filepath = os.path.join(save_folder, filename)
with open(filepath, "wb") as f:
f.write(img_response.content)
print(f" [{i}/{len(images)}] 下载成功:{filename}")
except Exception as e:
print(f" [{i}/{len(images)}] 下载失败:{e}")
print(f"\n图片已保存到:{save_folder}")
except Exception as e:
print(f"下载失败:{e}")
# 使用示例
if __name__ == "__main__":
url = "https://www.example.com" # 替换成实际的网页
download_images(url, "downloaded_images")
注意事项
1. 遵守robots.txt
爬取前先查看网站的robots.txt文件,了解哪些页面可以爬取。
2. 控制请求频率
不要发送太多请求,避免对网站造成压力。
3. 设置合理的延迟
在请求之间添加延迟,模拟人类行为。
4. 尊重网站服务
不要用于非法用途。
本章小结
- 获取网页内容:使用requests库
- 解析HTML:使用BeautifulSoup
- 爬取新闻:提取新闻标题和链接
- 批量下载图片:自动下载网页图片
- 注意事项:遵守规则,控制频率
网页爬虫让你自动化获取数据,信息差就是钱!
学习总结
恭喜你完成了《小白Python入门基础知识》的学习!
你已经掌握了:
- 环境配置 - Python开发环境搭建
- 变量和数据 - 存储和操作数据
- 条件判断 - 让电脑学会思考
- 循环 - 一次做1000件事
- 函数 - 把代码打包成工具
- 字符串操作 - 处理文字,像Excel一样简单
- 列表和字典 - 存储和管理数据
- 文件操作 - 读写Excel、Word、PDF
- 实战项目1 - 自动整理文件夹
- 实战项目2 - 批量处理Excel
- 实战项目3 - 自动发邮件
- 实战项目4 - 爬取网页数据
接下来你可以:
- 继续深入学习Python高级特性
- 学习数据分析、机器学习
- 开发自己的项目
- 加入Python社区,分享你的作品
记住:最好的学习方式就是动手实践!
别再假装你不会编程了,从现在开始,用Python自动化你的工作,每天节省2小时,一年多出一个月的空闲时间!
加油!