一、爬虫简介与道德法律红线
网络爬虫是什么?简单来说,它就是一段自动访问互联网并抓取所需信息的程序,就像一个不知疲倦的、高效的“数据采集员”。
在开始之前,我们必须先划清道德与法律的界线,这是每个爬虫学习者的第一课:
-
遵守
robots.txt:在爬取任何网站前,请先访问网站域名/robots.txt(例如:https://example.com/robots.txt)。这个文件规定了哪些内容允许或被禁止爬取。 -
避免暴力爬取:设置合理的请求间隔时间,不要对目标网站服务器造成过大压力。
-
尊重版权与隐私:爬取的数据仅用于个人学习与研究,不得用于商业用途或侵犯他人隐私。
-
切勿爬取敏感信息。
本文仅以公开的、用于学习的技术演示为目的。
二、环境搭建与工具准备
工欲善其事,必先利其器。我们需要安装两个核心库:
-
Requests:一个优雅而简单的HTTP库,用于发送网络请求,获取网页源代码。
-
BeautifulSoup:一个HTML/XML解析库,用于从Requests获取的杂乱HTML中提取整洁的数据。
安装命令:
打开你的命令行(CMD或Terminal),输入以下命令:
bash
pip install requests beautifulsoup4
注意:本文使用的是
beautifulsoup4(简称bs4)。如果你的环境是Python 3,请确保使用pip3或配置了正确的Python环境路径。
三、实战开始:爬取优快云资讯首页文章标题
我们将以优快云资讯首页(https://blog.youkuaiyun.com/nav/news)为例进行演示。
步骤1:获取网页源代码
首先,我们使用Requests库来获取整个页面的HTML内容。
python
import requests
# 目标URL
url = 'https://blog.youkuaiyun.com/nav/news'
# 设置请求头,模拟浏览器访问,这是一个简单的反反爬虫策略
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
# 发送GET请求
response = requests.get(url, headers=headers)
# 检查请求是否成功 (状态码200表示成功)
if response.status_code == 200:
# 打印网页源代码(前500个字符用于预览)
print(response.text[:500])
else:
print(f'请求失败,状态码:{response.status_code}')
-
代码解释:
-
headers:有些网站会拒绝没有浏览器标识(User-Agent)的请求。我们通过添加这个信息,让请求看起来像是从浏览器发出的。 -
response.status_code:HTTP响应状态码,200代表成功。 -
response.text:包含了服务器返回的网页HTML源代码。
-
运行这段代码,你会看到一堆结构化的HTML文本,这就是我们数据的“矿藏”。
步骤2:解析HTML并提取数据
现在轮到BeautifulSoup大显身手了!我们需要先分析网页结构,找到文章标题所在的HTML标签。
-
使用浏览器“检查”元素:
-
在优快云资讯页面,右键点击一篇文章的标题,选择“检查”或“审查元素”。
-
你会发现,标题很可能在一个
<a>标签里,并且这个标签有特定的类(class),比如class="text"或class="title"。通过观察,我们确定目标结构。
-
-
编写解析代码:
python from bs4 import BeautifulSoup # 假设我们已经有了 response.text html_content = response.text # 使用BeautifulSoup解析HTML,指定解析器为'html.parser' soup = BeautifulSoup(html_content, 'html.parser') # 查找所有包含文章标题的标签。 # 注意:你需要根据实际检查结果来修改选择器! # 这里是一个示例,实际选择器可能需要调整。 # 例如,可能是 soup.find_all('a', class_='text') 或 soup.find_all('h2') title_list = soup.find_all('a', class_='text') # 请根据实际情况修改class_ # 创建一个空列表来存储提取出来的纯文本标题 articles = [] # 遍历找到的所有标题标签 for title_tag in title_list: # .get_text() 方法可以获取标签内的纯文本,.strip() 用于去除首尾空白字符 article_title = title_tag.get_text().strip() articles.append(article_title) # 打印看看效果 print(article_title) # 打印总共爬取了多少篇文章 print(f"\n总共爬取了 {len(articles)} 篇文章") -
核心方法:
-
BeautifulSoup(html, 'html.parser'):创建解析对象。 -
soup.find_all(‘tag', class_=‘class_name’):查找所有指定的标签。这是最常用的方法。 -
.get_text():提取标签内的文本。
-
-
重要提示:网站的HTML结构可能会更新,
class_='text'这个选择器在未来可能失效。你必须使用浏览器的“检查”功能,找到当前页面标题正确的CSS选择器,并替换上面的代码。这是爬虫工程中的常态。步骤3:将数据存储到CSV文件
将数据保存在文件中,便于后续分析。CSV(逗号分隔值)是一种通用且简单的格
-
python import csv # 定义要保存的文件名 filename = 'csdn_articles.csv' # 以写入模式打开文件,`newline=''` 是为了防止在Windows下出现空行 with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile: # 创建一个csv写入器 writer = csv.writer(csvfile) # 写入表头 writer.writerow(['文章标题']) # 遍历文章列表,将每个标题作为一行写入 for article in articles: writer.writerow([article]) print(f'数据已成功保存到 {filename}')
四、常见反爬虫策略及应对建议
-
User-Agent检测:解决方案就是我们上面使用的,添加合法的请求头。
-
访问频率过高:解决方案是在请求之间增加随机延时。
python
import time
import random
# 在循环请求中插入
time.sleep(random.uniform(1, 3)) # 休眠1到3秒之间的随机时间
-
IP被封禁:对于大规模爬取,可能需要使用代理IP池。
-
动态加载内容:有些数据是通过JavaScript异步加载的,在HTML源码中看不到。这时需要使用 Selenium 或 Playwright 等工具来模拟浏览器行为。
对于入门者来说,做好前两点已经能应对很多场景。
五、总结与完整代码
我们来回顾一下本篇文章的完整流程和代码:
python
import requests
from bs4 import BeautifulSoup
import csv
# 1. 发送请求
url = 'https://blog.youkuaiyun.com/nav/news'
headers = {'User-Agent': '你的User-Agent'} # 请复制使用上面的User-Agent
response = requests.get(url, headers=headers)
if response.status_code == 200:
# 2. 解析内容
soup = BeautifulSoup(response.text, 'html.parser')
# !!! 关键:请根据实际网页结构修改下面的选择器 !!!
title_list = soup.find_all('a', class_='text')
articles = []
for title_tag in title_list:
article_title = title_tag.get_text().strip()
articles.append(article_title)
# 3. 存储数据
filename = 'csdn_articles.csv'
with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['文章标题'])
for article in articles:
writer.writerow([article])
print(f'成功爬取 {len(articles)} 篇文章并保存到 {filename}!')
else:
print('请求失败')
你已经成功搭建了一个基础但功能完整的爬虫!从这个起点出发,你可以去学习更强大的解析方法(如CSS选择器)、处理分页、模拟登录等高级主题。
互动与讨论
欢迎在评论区分享你的爬取成果和遇到的问题!
你成功运行这个爬虫了吗?爬取到了什么内容?
在寻找正确的CSS选择器时遇到了什么困难?
你还想了解爬虫的哪些进阶知识(例如:爬取图片、处理登录、应对更复杂的反爬机制)?
免责声明:本文所有代码及技术仅用于学习交流,请勿用于任何非法或侵犯他人权益的用途。爬取数据时请务必遵守目标网站的相关规定,尊重版权与隐私。
354

被折叠的 条评论
为什么被折叠?



