共计 3107 个字符,预计需要花费 8 分钟才能阅读完成。
在数据驱动的时代,网络爬虫(Web Scraping)成为了获取网页数据的重要工具。Python 以其丰富的库和简单易学的语法,成为爬虫开发的首选语言。本篇博客将带你从零开始,逐步掌握如何用 Python 编写爬虫,从基础到进阶,涵盖常见问题和反爬机制应对策略。
1. 什么是 Web 爬虫?
Web 爬虫是一种自动化脚本,它能够访问网页并提取所需数据。通常,爬虫的工作流程如下:
- 发送 HTTP 请求到目标网页。
- 获取网页的 HTML 内容。
- 解析 HTML 结构并提取所需数据。
- 存储数据到本地或数据库。
Python 提供了多种爬虫库,如 requests、BeautifulSoup、Scrapy 和 Selenium,可满足不同需求。
2. 爬虫的基本工具
在正式开始之前,确保你的 Python 环境已经安装了必要的爬虫库。你可以使用以下命令安装:
pip install requests beautifulsoup4 lxml scrapy selenium
requests:用于发送 HTTP 请求,获取网页内容。BeautifulSoup:解析 HTML 结构,提取数据。lxml:用于解析 HTML/XML,提高解析效率。Scrapy:一个强大的爬虫框架,适用于大规模数据抓取。Selenium:用于处理 JavaScript 动态加载的网页。
3. 用 requests 和 BeautifulSoup 编写简单爬虫
让我们从一个简单的示例开始,爬取豆瓣电影 Top 250 的电影信息。
3.1 发送 HTTP 请求
使用 requests 获取网页 HTML 内容:
import requests
url = "https://movie.douban.com/top250"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
print(response.text[:500]) # 预览前 500 个字符
3.2 解析 HTML 并提取数据
使用 BeautifulSoup 解析 HTML:
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
movies = soup.find_all("div", class_="item")
for movie in movies:
title = movie.find("span", class_="title").text
rating = movie.find("span", class_="rating_num").text
print(f"电影:{title},评分:{rating}")
4. 处理 JavaScript 渲染的网页
有些网站使用 JavaScript 加载数据,requests 无法直接获取。这时,我们可以使用 Selenium。
4.1 安装并配置 Selenium
安装 Selenium 及 ChromeDriver:
pip install selenium
然后下载 ChromeDriver 并确保其版本与 Chrome 浏览器匹配( 下载地址 )。
4.2 使用 Selenium 爬取动态网页
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 配置 Selenium 浏览器
options = webdriver.ChromeOptions()
options.add_argument("--headless") # 无头模式(不打开浏览器)driver = webdriver.Chrome(options=options)
# 访问动态网页
driver.get("https://quotes.toscrape.com/js/")
# 等待加载
time.sleep(3)
# 提取内容
quotes = driver.find_elements(By.CLASS_NAME, "text")
for quote in quotes:
print(quote.text)
# 关闭浏览器
driver.quit()
5. 反爬机制及应对策略
网站通常会检测爬虫行为,并采取措施进行反爬,如 IP 限制、User-Agent 检测、验证码等。以下是常见应对策略:
- 伪装 User-Agent:
headers = {"User-Agent": "Mozilla/5.0"} requests.get(url, headers=headers) - 使用代理 IP:
proxies = {"http": "http:// 代理 IP: 端口"} requests.get(url, proxies=proxies) - 使用
time.sleep()进行请求间隔 :import time time.sleep(2) # 避免频繁请求触发封锁 - 模拟用户操作 (使用
Selenium)。 - 使用分布式爬虫 (如
Scrapy+Scrapy-Redis)。
6. 进阶:使用 Scrapy 构建高效爬虫
Scrapy 是一个功能强大的爬虫框架,适用于大规模数据抓取。
6.1 创建 Scrapy 项目
scrapy startproject myspider
cd myspider
6.2 编写爬虫
在 spiders 目录下创建 douban.py:
import scrapy
class DoubanSpider(scrapy.Spider):
name = "douban"
start_urls = ["https://movie.douban.com/top250"]
def parse(self, response):
for movie in response.css("div.item"):
yield {"title": movie.css("span.title::text").get(),
"rating": movie.css("span.rating_num::text").get(),}
6.3 运行爬虫
scrapy crawl douban -o movies.json
这将抓取数据并保存到 movies.json 文件中。
7. 数据存储
爬取的数据可以存入数据库,如 MySQL、MongoDB 或 CSV 文件。
7.1 保存到 CSV
import csv
data = [("电影 1", "9.0"), ("电影 2", "8.5")]
with open("movies.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["电影", "评分"])
writer.writerows(data)
7.2 存入 MongoDB
from pymongo import MongoClient
client = MongoClient("mongodb://localhost:27017/")
db = client["movies_db"]
collection = db["top250"]
collection.insert_many([{"title": "电影 1", "rating": "9.0"}, {"title": "电影 2", "rating": "8.5"}])
8. 总结
本文从基础到进阶,介绍了 Python 爬虫的核心知识点:
- 使用
requests和BeautifulSoup进行基础爬取。 - 处理 JavaScript 渲染的网页(
Selenium)。 - 反爬机制及应对策略。
- 使用
Scrapy进行高效爬取。 - 数据存储方案。
掌握这些知识后,你可以应用爬虫技术来抓取新闻、股票数据、电商信息等。希望本文能帮助你更好地理解 Python 爬虫,享受数据采集的乐趣!