第3课_网络爬虫基础
热度🔥:8 免费课程
授课语音
Python 脚本爬虫
在 Python 中,爬虫是通过模拟浏览器访问网页,提取网页数据的程序。爬虫一般涉及 HTTP 请求、HTML 页面解析以及数据存储等步骤。Python 提供了多个库来支持爬虫开发,其中最常用的包括:
requests
:用于发送 HTTP 请求。BeautifulSoup
:用于解析 HTML 网页。lxml
:用于高效解析 XML 和 HTML。pandas
:用于数据存储和处理。
1. 安装必要的库
在进行爬虫开发之前,我们需要先安装一些常用的 Python 库。最常见的爬虫开发库有 requests
和 beautifulsoup4
。可以通过以下命令安装这些库:
pip install requests beautifulsoup4
如果需要更强的解析功能,还可以安装 lxml
:
pip install lxml
2. 爬虫基本流程
爬虫的基本流程大致分为以下几个步骤:
- 发送 HTTP 请求:向目标网站发送请求,获取网页的 HTML 内容。
- 解析网页内容:通过 HTML 解析器解析网页,提取需要的信息。
- 存储数据:将提取的数据保存到本地文件或数据库中。
3. 爬虫实战:爬取一个网页数据
我们通过一个简单的爬虫实例来演示如何抓取网页数据。
目标:爬取一个博客网站的标题和文章链接
假设我们要爬取 https://quotes.toscrape.com/
网站上的所有名言及作者,下面是具体代码实现:
import requests
from bs4 import BeautifulSoup
# 1. 发送 HTTP 请求
url = "https://quotes.toscrape.com/"
response = requests.get(url)
# 检查请求是否成功
if response.status_code == 200:
# 2. 解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
# 3. 提取所有名言和作者
quotes = soup.find_all('div', class_='quote')
for quote in quotes:
# 获取名言文本
text = quote.find('span', class_='text').get_text()
# 获取作者名称
author = quote.find('small', class_='author').get_text()
# 输出名言和作者
print(f"名言: {text}")
print(f"作者: {author}")
print("-" * 50)
else:
print("请求失败,无法获取网页内容。")
4. 代码讲解
- 发送 HTTP 请求:我们使用
requests.get(url)
向目标网站发送 GET 请求,获取网页的 HTML 内容。 - 解析网页内容:通过
BeautifulSoup
解析网页内容,BeautifulSoup(response.text, 'html.parser')
将网页 HTML 内容转换为可操作的 BeautifulSoup 对象。 - 提取数据:我们使用
find_all()
方法查找网页中所有符合条件的元素(例如:所有名言和作者)。然后通过find()
获取子元素的内容。 - 打印结果:提取到的名言和作者被打印出来。
5. 深入解析
1. 使用 find()
和 find_all()
方法
find()
:返回第一个符合条件的标签。find_all()
:返回所有符合条件的标签。
例如,在上面的例子中,soup.find_all('div', class_='quote')
获取了网页中所有 class 为 quote
的 <div>
元素。
2. 获取元素的属性
除了获取标签内的文本,还可以获取标签的属性。比如获取链接的 href
属性:
# 获取文章链接
link = quote.find('a')['href']
print(f"链接: {link}")
3. 处理分页
如果网页上有分页,爬虫需要访问每一页,获取分页数据。可以通过循环遍历每一页的链接来爬取所有数据。例如:
page_number = 1
while True:
url = f"https://quotes.toscrape.com/page/{page_number}/"
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
quotes = soup.find_all('div', class_='quote')
if not quotes:
break # 如果当前页没有数据,则退出循环
for quote in quotes:
text = quote.find('span', class_='text').get_text()
author = quote.find('small', class_='author').get_text()
print(f"名言: {text}")
print(f"作者: {author}")
print("-" * 50)
page_number += 1 # 切换到下一页
else:
print("请求失败,无法获取网页内容。")
break
4. 使用 User-Agent 防止被屏蔽
很多网站会检查请求头中的 User-Agent
字段来防止自动化爬虫。可以通过设置 User-Agent
来模拟浏览器请求:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers)
6. 存储数据
爬虫的核心目标之一是提取有用数据并进行存储。可以将数据保存为不同格式的文件,如 CSV、JSON 或数据库。以下是将数据保存为 CSV 文件的示例:
import csv
# 定义 CSV 文件的列名
fields = ['Quote', 'Author']
# 打开 CSV 文件,准备写入
with open('quotes.csv', 'w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(fields)
for quote in quotes:
text = quote.find('span', class_='text').get_text()
author = quote.find('small', class_='author').get_text()
writer.writerow([text, author])
print("数据已保存到 'quotes.csv' 文件。")
7. 爬虫的注意事项
遵守 Robots.txt:大多数网站会在根目录下提供一个
robots.txt
文件,告诉爬虫哪些页面可以爬取,哪些不可以。你应该尊重这些规则。避免频繁请求:频繁向同一网站发送请求可能会导致服务器负载过重,甚至被封禁 IP。建议设置请求间隔,避免过度请求。
处理反爬虫措施:许多网站会对爬虫进行反制措施,如验证码、IP 封锁等。在开发爬虫时,需要注意这些问题,并采取相应的解决方案,如使用代理池、模拟浏览器行为等。
8. 总结
- Python 的
requests
库和BeautifulSoup
库是开发爬虫的基础工具。 - 爬虫的基本流程包括发送 HTTP 请求、解析网页内容、提取需要的数据,并将数据存储到文件或数据库中。
- 需要注意爬虫的规范性,包括遵守
robots.txt
、避免频繁请求等。 - 可以使用
pandas
、csv
等库来存储和处理抓取的数据。
爬虫技术不仅能帮助自动化获取网络数据,也是数据分析、新闻聚合、价格监控等应用的重要工具。