Python 网络爬虫入门教程
引言
网络爬虫(Web Crawler)是一种通过编程从互联网上抓取数据的技术,常用于数据分析、信息采集等任务。Python 作为一门功能强大且易于使用的编程语言,拥有丰富的爬虫库和工具,如 Requests、BeautifulSoup 和 Scrapy,使得网络爬虫的开发变得更加高效便捷。
本文将以一个简单的实例,介绍如何利用 Python 编写一个基本的网络爬虫,抓取网页上的内容。
一、网络爬虫的基本流程
网络爬虫通常包含以下几个步骤:
- 发送请求:通过 HTTP 请求获取目标网页的 HTML 源代码。
- 解析数据:提取网页中有用的信息,如文本、链接、图片等。
- 存储数据:将提取到的数据保存到文件或数据库中,方便后续处理。
二、实现一个简单的网络爬虫
我们以爬取豆瓣电影 Top250 的电影信息为例,抓取电影的标题、评分和评价人数。
2.1 准备工作
在开始之前,请确保安装以下库:
pip install requests beautifulsoup4 lxml
2.2 代码实现
以下是实现爬虫的完整代码:
import requests
from bs4 import BeautifulSoup
import csv
# 目标 URL
BASE_URL = "https://movie.douban.com/top250"
# 获取网页内容
def fetch_page(url):
try:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
response = requests.get(url, headers=headers)
response.raise_for_status() # 如果请求失败会抛出异常
return response.text
except requests.RequestException as e:
print(f"Error fetching {url}: {e}")
return None
# 解析 HTML 并提取数据
def parse_html(html):
soup = BeautifulSoup(html, "lxml")
movie_list = []
for item in soup.find_all("div", class_="item"):
title = item.find("span", class_="title").text.strip()
rating = item.find("span", class_="rating_num").text.strip()
reviews = item.find("div", class_="star").find_all("span")[-1].text.strip()
movie_list.append({
"title": title,
"rating": rating,
"reviews": reviews
})
return movie_list
# 保存数据到 CSV 文件
def save_to_csv(data, filename="movies.csv"):
with open(filename, mode="w", newline="", encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=["title", "rating", "reviews"])
writer.writeheader()
writer.writerows(data)
print(f"Data saved to {filename}")
# 主函数
def main():
movies = []
for start in range(0, 250, 25): # 每页包含25部电影
url = f"{BASE_URL}?start={start}"
print(f"Fetching {url}...")
html = fetch_page(url)
if html:
movies.extend(parse_html(html))
save_to_csv(movies)
if __name__ == "__main__":
main()
三、代码解读
3.1 发送请求
使用 requests
库的 get
方法发送 HTTP 请求。通过设置 User-Agent
模拟浏览器访问,避免被目标网站识别为爬虫:
response = requests.get(url, headers=headers)
3.2 解析 HTML
利用 BeautifulSoup
解析 HTML,提取所需的信息:
soup = BeautifulSoup(html, "lxml")
通过 CSS 选择器找到电影标题、评分和评价人数:
title = item.find("span", class_="title").text.strip()
rating = item.find("span", class_="rating_num").text.strip()
reviews = item.find("div", class_="star").find_all("span")[-1].text.strip()
3.3 存储数据
将提取到的数据保存到 CSV 文件中,便于后续分析:
with open(filename, mode="w", newline="", encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=["title", "rating", "reviews"])
writer.writeheader()
writer.writerows(data)
四、运行结果
运行代码后,程序将抓取豆瓣电影 Top250 的数据,并保存在 movies.csv
文件中。打开文件可以看到以下内容:
Title | Rating | Reviews |
---|---|---|
肖申克的救赎 | 9.7 | 2145323人评价 |
霸王别姬 | 9.6 | 1578122人评价 |
阿甘正传 | 9.6 | 1894831人评价 |
五、注意事项
- 合法性与网站政策:在爬取数据前,请确保遵守目标网站的 robots.txt 文件以及相关法律法规。
- 反爬机制:有些网站可能会检测并限制频繁访问,可通过设置随机延迟、代理 IP 或其他方法绕过。
- 数据清洗:爬取的数据可能需要进一步清洗和处理,确保其适合后续分析。
六、进阶与扩展
如果希望构建更加复杂和高效的爬虫,可以尝试以下技术:
- Scrapy 框架:适合大规模爬取任务,支持分布式爬取和异步处理。
- Selenium:用于爬取动态加载内容的网页。
- 多线程与异步爬取:提高爬取效率,如
concurrent.futures
和asyncio
。
七、总结
本文通过一个爬取豆瓣电影 Top250 的实例,详细介绍了 Python 网络爬虫的基本原理和实现方法。希望这篇教程能够帮助你入门网络爬虫,并为后续的爬虫开发提供灵感。如果你对爬虫技术有更多兴趣,欢迎继续探索更高级的框架和工具!