初学者如何用 Python 写第一个爬虫?
💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长。
🔍 博客内容包括:
- Java核心技术与微服务:涵盖Java基础、JVM、并发编程、Redis、Kafka、Spring等,帮助您全面掌握企业级开发技术。
- 大数据技术:涵盖Hadoop(HDFS)、Hive、Spark、Flink、Kafka、Redis、ECharts、Zookeeper等相关技术。
- 开发工具:分享常用开发工具(IDEA、Git、Mac、Alfred、Typora等)的使用技巧,提升开发效率。
- 数据库与优化:总结MySQL及其他常用数据库技术,解决实际工作中的数据库问题。
- Python与大数据:专注于Python编程语言的深度学习,数据分析工具(如Pandas、NumPy)和大数据处理技术,帮助您掌握数据分析、数据挖掘、机器学习等技术。
- 数据结构与算法:总结数据结构与算法的核心知识,提升编程思维,帮助您应对大厂面试挑战。
🌟 我的目标:持续学习与总结,分享技术心得与解决方案,和您一起探索技术的无限可能!在这里,我希望能与您共同进步,互相激励,成为更好的自己。
📣 欢迎订阅本专栏,与我一起在这个知识的海洋中不断学习、分享和成长!💻🚀
📍版权声明:本博客所有内容均为原创,遵循CC 4.0 BY-SA协议,转载请注明出处。
目录
网页爬虫是一种通过程序自动抓取网页数据的技术。对于初学者来说,使用 Python 写一个简单的爬虫是一个很好的入门项目。Python 提供了许多强大的工具和库,如 requests
和 BeautifulSoup
,可以帮助快速实现网页数据的爬取。
在本文中,我们将从爬虫的基本概念开始,逐步实现一个可以抓取网页内容的简单爬虫,并探讨如何改进爬虫以应对复杂场景。我们将从以下几个方面展开:
一、爬虫的基本概念
1. 爬虫的定义
爬虫(Web Crawler)是一种自动化脚本或程序,它会模拟用户访问网页的行为,从而提取网页中的特定内容。
2. 爬虫的主要工作流程
一个典型的爬虫任务通常包括以下步骤:
-
发送请求:通过 HTTP 协议访问目标网页,获取其 HTML 内容。
-
解析数据:对获取到的 HTML 进行解析,提取我们需要的数据。
-
存储数据:将提取到的数据保存到文件或数据库中,便于后续处理。
3. 常用 Python 工具
-
requests
:发送 HTTP 请求,获取网页内容。 -
BeautifulSoup
:解析 HTML 或 XML 数据,提取特定内容。 -
re
(正则表达式):对复杂文本模式进行匹配和提取。 -
pandas
:对数据进行清洗和分析。
二、环境准备
1. 安装 Python
确保你的计算机上已经安装了 Python(推荐使用 3.7 及以上版本)。如果尚未安装,可以从 Python 官方网站 下载并安装。
2. 安装必要库
打开命令行或终端,运行以下命令安装我们需要的 Python 库:
pip install requests beautifulsoup4
-
requests
:用于发送 HTTP 请求。 -
beautifulsoup4
:用于解析 HTML 数据。
三、写第一个简单的爬虫
我们来实现一个简单的爬虫,它将抓取某个网页的标题和正文内容。
1. 完整代码示例
以下代码实现了一个基本的爬虫:
import requests
from bs4 import BeautifulSoup
def simple_crawler(url):
try:
# 1. 发送请求
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
# 2. 解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
# 3. 提取标题和段落内容
title = soup.find('title').text # 获取网页标题
paragraphs = soup.find_all('p') # 获取所有段落内容
print(f"网页标题: {title}\n")
print("网页内容:")
for p in paragraphs:
print(p.text)
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
# 示例网址
url = "https://example.com" # 替换为你想爬取的网页地址
simple_crawler(url)
2. 代码逐步解析
1)发送 HTTP 请求
response = requests.get(url)
-
使用
requests.get()
方法向目标网址发送 GET 请求。 -
返回的
response
对象包含网页的所有内容,包括 HTML 源代码。
2)检查请求状态
response.raise_for_status()
-
通过
raise_for_status()
检查请求是否成功。如果返回的 HTTP 状态码表示错误(如 404 或 500),会抛出异常。
3)解析 HTML 数据
soup = BeautifulSoup(response.text, 'html.parser')
-
BeautifulSoup
用于解析 HTML 内容,并将其转化为 Python 对象,方便后续操作。 -
第二个参数
'html.parser'
指定使用 Python 内置的 HTML 解析器。
4)提取网页内容
title = soup.find('title').text
paragraphs = soup.find_all('p')
-
find('title')
方法返回<title>
标签的内容。 -
find_all('p')
方法返回所有段落标签<p>
,并以列表形式存储。
5)打印结果
for p in paragraphs:
print(p.text)
-
遍历提取到的段落内容,并打印每个段落的文本。
四、改进爬虫功能
1. 添加请求头
一些网站会检测爬虫程序并阻止访问。可以通过添加请求头来模拟浏览器访问。
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"
}
response = requests.get(url, headers=headers)
2. 控制爬取频率
为了避免对目标网站造成过高的负载,可以在每次请求后添加延时。
import time
def delay_request(url):
response = requests.get(url)
time.sleep(2) # 等待 2 秒
return response
3. 保存数据
将爬取的数据保存为文件或数据库。
保存到文件:
with open("output.txt", "w", encoding="utf-8") as f:
f.write(f"标题: {title}\n")
for p in paragraphs:
f.write(p.text + "\n")
保存到 CSV 文件:
import csv
with open("output.csv", "w", newline="", encoding="utf-8") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["段落内容"])
for p in paragraphs:
writer.writerow([p.text])
五、应对复杂网页
1. 动态加载网页
对于 JavaScript 渲染的网页,requests
无法获取完整内容,可以使用 selenium
或 playwright
。
示例(使用 selenium):
from selenium import webdriver
url = "https://example.com"
# 配置 WebDriver
driver = webdriver.Chrome()
driver.get(url)
# 获取动态加载的内容
html = driver.page_source
print(html)
# 关闭浏览器
driver.quit()
2. 爬取图片或文件
import os
# 下载图片
img_url = "https://example.com/image.jpg"
response = requests.get(img_url)
# 保存图片
with open("image.jpg", "wb") as f:
f.write(response.content)
六、爬虫的注意事项
1. 遵守法律和道德
-
避免违反法律:确保爬取行为符合目标网站的使用条款。
-
尊重 robots.txt 文件:通过
robots.txt
查看目标网站的爬取限制。
2. 处理异常
对于网络请求失败、数据缺失等情况,添加异常处理逻辑:
try:
response = requests.get(url)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
3. 避免过于频繁的请求
可以设置延时或使用代理 IP:
proxies = {
"http": "http://123.45.67.89:8080",
"https": "http://123.45.67.89:8080"
}
response = requests.get(url, proxies=proxies)
原文地址:https://blog.csdn.net/weixin_45710998/article/details/145136577
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!