从零开始:Python入门级爬虫实战教程
本章节对Requests库的基础使用方法进行了详细介绍,包括如何安装配置、发送GET和POST请求、定制请求头部以及处理HTTPS请求。掌握这些基础技巧,对于进行高效和安全的网络爬虫开发至关重要。后续章节将会进一步深入探讨如何结合BeautifulSoup进行HTML文档的解析和数据提取,以及如何优化爬虫性能,应对各种复杂的网络环境。反爬虫机制是网站为了防止自动化脚本或者爬虫程序过多地消耗服务器资
简介:本项目是为Python初学者设计的入门级爬虫练习,旨在教授如何利用Python编写爬虫程序来爬取百度百科的词条和简介。通过本项目,初学者将学会使用Requests和BeautifulSoup库进行网页请求和内容解析,并了解如何保存和循环爬取数据。同时,还将学习到如何处理反爬策略、遵守法律法规以及进行异常处理,从而为进阶的爬虫技术打下基础。 
1. Python爬虫入门
1.1 爬虫的基本概念
爬虫,也称为网络蜘蛛或网络机器人,是自动抓取网页数据的程序。它们按照一定的规则,自动地抓取互联网信息,为大数据分析、搜索引擎等领域提供数据基础。
1.2 Python在爬虫领域的优势
Python语言简洁易学,拥有丰富的第三方库支持,如Requests用于HTTP请求,BeautifulSoup和lxml用于HTML/XML解析,Scrapy用于构建复杂的爬虫。这让Python成为开发网络爬虫的理想选择。
1.3 第一个爬虫示例
让我们以Python标准库中的urllib模块为例,完成一个简单的网页内容抓取程序。首先,使用urlopen方法打开指定的网页地址,然后读取网页内容并打印输出。
import urllib.request
# 打开网页并获取数据
response = urllib.request.urlopen("http://example.com")
data = response.read()
# 打印输出获取的数据
print(data)
通过上述基础示例,我们完成了网络爬虫入门的第一个简单步骤。随着我们继续深入,会逐步学会如何解析数据,如何处理异常,以及如何应对网站反爬策略等问题。
2. BeautifulSoup解析HTML
2.1 BeautifulSoup的基本使用
2.1.1 BeautifulSoup的安装和导入
在开始使用BeautifulSoup进行HTML解析之前,首先需要安装这个库。通常使用pip进行安装,只需在终端或者命令提示符中运行以下命令即可:
pip install beautifulsoup4
此命令会安装BeautifulSoup库的最新版本。另外,对于HTML文档的解析,BeautifulSoup支持多种解析器,如lxml、html.parser等,其中lxml的解析速度较快,推荐使用。
安装完毕后,接下来是在Python脚本中导入BeautifulSoup库:
from bs4 import BeautifulSoup
2.1.2 BeautifulSoup的基本语法
BeautifulSoup将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是Python对象。这些对象又包含了解析树中所有的HTML标签和字符串。
最简单的使用方式是创建一个BeautifulSoup对象,并把要解析的HTML文档作为第一个参数:
soup = BeautifulSoup(html_doc, 'html.parser')
这里, html_doc 是一个包含HTML文档的字符串。第二个参数 'html.parser' 指定了使用HTML解析器解析文档。
2.1.3 解析HTML文档的几种方式
BeautifulSoup支持多种方法来查找和定位文档树中的节点。以下是一些常用的定位方法:
find(): 查找文档树中的第一个标签,可以指定标签名和属性进行搜索。find_all(): 查找所有匹配的标签,返回一个列表。select(): 使用CSS选择器定位节点,返回匹配的节点列表。
例如,查找文档中所有的 <a> 标签:
for link in soup.find_all('a'):
print(link.get('href'))
这些方法通常接受参数来过滤搜索结果。
2.2 BeautifulSoup的数据提取
2.2.1 标签和属性的筛选方法
BeautifulSoup允许你根据标签名、属性等多种方式筛选节点。可以通过标签名来获取特定的标签:
title_tag = soup.title
要获取标签的属性,可以直接访问标签的字典形式:
img_tag = soup.find('img')
image_url = img_tag.get('src')
2.2.2 文本和链接的提取技巧
提取文本和链接是数据提取中非常常见的操作。可以通过 text 或 strings 属性来获取标签内的文本内容:
text = soup.get_text()
提取链接时,可以结合查找标签和获取属性的操作:
for link in soup.find_all('a'):
href = link.get('href')
text = link.text
print(f"Link text: {text}, URL: {href}")
2.2.3 复杂数据结构的处理
有时候,你可能需要处理包含嵌套标签或者复杂结构的数据。BeautifulSoup的 .contents 属性可以帮助你访问一个标签的直接子节点列表:
first_paragraph = soup.find('p').contents[0]
为了更好地处理复杂数据,可以使用 NavigableString 和 Tag ,它们分别代表HTML文档中的字符串和标签。
from bs4 import NavigableString
for child in soup.find('div').contents:
if isinstance(child, NavigableString):
print(child)
else:
print(child.name)
以上就是使用BeautifulSoup进行基本HTML文档解析和数据提取的方法。BeautifulSoup是一个强大的库,可以用来处理网页数据提取的诸多复杂场景。接下来,我们将进入第二章的下一部分,深入探讨如何使用BeautifulSoup进行更复杂的数据处理和提取。
3. Requests发送HTTP请求
随着网络技术的发展,HTTP协议已经成为Internet上应用最广泛的协议。在Python爬虫开发中,正确、高效地使用HTTP请求是必备技能。本章将深入探讨Requests库,一个简洁易用的HTTP库,它可以帮助开发者轻松发送HTTP/1.1请求,并处理响应。
3.1 Requests库的基础
3.1.1 Requests库的安装与配置
Requests库可以通过pip包管理工具进行安装,安装命令如下:
pip install requests
安装完成后,在Python脚本中导入Requests库的代码如下:
import requests
使用Requests库时,只需创建一个 requests.Session() 对象。此对象会跨请求保持某些参数,如cookies。此外,还可以配置代理、身份验证等高级功能。
3.1.2 发送GET和POST请求的方法
GET和POST是最常见的HTTP请求方法。在Requests库中,这两种请求的发送方法非常简单。
发送GET请求:
response = requests.get('http://example.com')
发送POST请求:
data = {'key': 'value'}
response = requests.post('http://example.com', data=data)
对于复杂的请求体,如JSON格式数据,可以使用json参数直接发送JSON数据:
json_data = {'key': 'value'}
response = requests.post('http://example.com', json=json_data)
3.1.3 请求头部的定制与使用
在实际的网络请求中,经常需要定制请求头部。在Requests中,可以通过headers参数传递一个字典来实现:
headers = {'User-Agent': 'my-app/0.0.1'}
response = requests.get('http://example.com', headers=headers)
定制请求头部可以模拟不同的客户端行为,例如修改User-Agent模拟浏览器或移动设备的请求。
3.2 Requests与HTTPS
3.2.1 HTTPS请求的原理
HTTPS(HTTP Secure)是在HTTP的基础上通过SSL/TLS协议加密的网络协议。它提供身份验证和数据加密,确保了数据传输的安全性。
3.2.2 如何处理HTTPS请求中的SSL证书问题
在开发过程中,可能会遇到SSL证书验证失败的问题。这可能是由于目标服务器的证书不受信任或者证书已过期。在Requests中,可以通过verify参数来控制SSL证书的验证行为:
# 忽略SSL证书验证
response = requests.get('https://example.com', verify=False)
注意: 忽略SSL证书验证将使程序面临中间人攻击等风险,应谨慎使用此方法。
3.2.3 HTTPS请求的加密和安全性
当使用HTTPS协议时,数据在传输过程中会被加密。默认情况下,Requests使用的是urllib3库的加密功能,它支持完整的SSL证书链。
使用HTTPS可以有效保护爬虫和服务器之间的数据交换,防止敏感数据泄露。对于爬虫来说,合理使用HTTPS能够确保数据采集过程中的安全性和合规性。
结语
本章节对Requests库的基础使用方法进行了详细介绍,包括如何安装配置、发送GET和POST请求、定制请求头部以及处理HTTPS请求。掌握这些基础技巧,对于进行高效和安全的网络爬虫开发至关重要。后续章节将会进一步深入探讨如何结合BeautifulSoup进行HTML文档的解析和数据提取,以及如何优化爬虫性能,应对各种复杂的网络环境。
4. 网页数据提取与存储
随着数据时代的到来,互联网上的信息量呈爆炸式增长。有效地从网页中提取所需的数据并进行存储,是进行数据分析和进一步处理的基础。本章节我们将深入探讨如何定位和提取网页内容,以及如何将提取出的数据存储到不同的媒介中。
4.1 网页内容的定位与提取
要从网页中提取信息,首先需要定位到含有目标数据的HTML元素。常用的方法包括使用CSS选择器和XPath。下面将详细介绍这两种技术的应用。
4.1.1 使用CSS选择器定位信息
CSS选择器是定位HTML元素的一种简洁有效的方法。在Python中,我们可以使用BeautifulSoup库来应用CSS选择器。
from bs4 import BeautifulSoup
# 假设已经获取了HTML内容到变量soup中
soup = BeautifulSoup(html_content, 'html.parser')
# 使用CSS选择器提取所有<a>标签的链接
links = soup.select('a[href]')
for link in links:
print(link.get('href'))
逻辑分析:在上述代码中, select() 函数接受一个CSS选择器字符串作为参数,返回一个包含所有匹配元素的列表。通过遍历这个列表,我们可以访问并处理每一个选中的元素。 get() 方法用来获取标签的 href 属性值。
4.1.2 使用XPath定位信息
XPath提供了一种更加灵活的方式来定位HTML文档中的元素。它允许开发者使用路径表达式来选取节点。XPath的表达能力比CSS选择器更强大,尤其在处理复杂的嵌套结构时。
from lxml import etree
# 假设已经获取了HTML内容到变量html_content中
html_content = etree.HTML(html_content)
# 使用XPath提取所有<a>标签的链接
links = html_content.xpath('//a/@href')
for link in links:
print(link)
逻辑分析:在上述代码中, xpath() 函数接受一个XPath表达式作为参数,返回所有匹配的节点值。这里 //a/@href 表示选取所有 <a> 标签的 href 属性。
4.1.3 提取数据的策略和实践
提取数据时,需要根据实际情况制定策略。例如,一些网页可能具有动态加载的内容,这种情况下可能需要使用Selenium等工具模拟浏览器行为来获取完整的页面源代码。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://example.com')
html_content = driver.page_source
# 接下来可以使用BeautifulSoup来解析html_content并提取数据
逻辑分析:使用Selenium时,首先需要指定一个浏览器驱动,然后打开目标网页。 page_source 属性包含当前页面的HTML源代码,之后可以利用BeautifulSoup或lxml等工具进一步解析和提取数据。
4.2 数据存储的方式
从网页中提取的数据需要存储起来以便后续使用。常见的存储方式包括文本文件、数据库系统和云存储。
4.2.1 将数据存储到文本文件
最简单的数据存储方式是将数据写入到文本文件中。这种方式适用于数据量不大或只需要临时存储的场景。
# 假设已经提取到了数据列表data_list
data_list = ['data1', 'data2', 'data3']
# 将数据写入文本文件
with open('data.txt', 'w') as f:
for item in data_list:
f.write(item + '\n')
逻辑分析:使用Python内置的文件操作函数 open() 以写入模式打开一个文件,然后将数据逐个写入文件。每个数据项后面添加换行符 \n ,以保持数据的可读性。
4.2.2 数据存储到数据库系统
对于结构化数据,更常见的方式是存储到数据库系统中。常用的数据库系统包括MySQL、PostgreSQL、MongoDB等。
import sqlite3
# 连接到SQLite数据库
# 数据库文件是test.db,如果文件不存在,会自动在当前目录创建:
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 创建一个表:
cursor.execute('CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
# 插入数据:
cursor.execute('INSERT INTO user (name, age) VALUES (?, ?)', ('Alice', 21))
conn.commit()
# 查询数据:
cursor.execute('SELECT * FROM user WHERE age>?', (18,))
values = cursor.fetchall()
for value in values:
print(value)
# 关闭Cursor和Connection:
cursor.close()
conn.close()
逻辑分析:在上述代码中,首先导入了 sqlite3 模块,并通过 connect() 方法建立与SQLite数据库的连接。然后创建一个表并插入数据。最后执行查询操作, fetchall() 方法会返回结果集中的所有行,每行是一个元组。
4.2.3 将数据存储到云端或本地服务器
随着云服务的发展,将数据存储到云端变得越来越普遍。云存储不仅提供了更大的存储空间,还具有高可用性、安全性和扩展性等优点。
import boto3
# 初始化S3客户端
s3_client = boto3.client('s3')
# 上传文件到指定的S3存储桶
s3_client.upload_file('local_file.txt', 'mybucket', 'remote_file.txt')
逻辑分析:在上述代码中,使用了 boto3 库与AWS S3服务进行交互。 upload_file() 方法可以将本地文件上传到S3存储桶中。该方法需要指定本地文件名、存储桶名称和远程文件名作为参数。
通过本章节的学习,我们不仅掌握了如何定位和提取网页内容,还了解了不同的数据存储方法。读者可以根据实际的项目需求和数据特点,选择最合适的存储方式。在下一章节中,我们将进一步探讨如何应对网站的反爬虫机制,确保爬虫程序的稳定运行。
5. 反爬策略应对
5.1 反爬虫的基本概念
5.1.1 什么是反爬虫机制
反爬虫机制是网站为了防止自动化脚本或者爬虫程序过多地消耗服务器资源,影响网站正常用户的访问体验而设立的一种防护措施。它通过各种技术手段识别出爬虫行为,并采取相应措施进行限制,以保护网站内容不被批量、无序地采集。
常见的反爬措施包括但不限于:
- 检测并限制访问频率(例如IP限制)
- 验证码或行为验证以区分人类用户和爬虫
- 动态网页技术,如JavaScript渲染
- 隐藏真实数据的参数加密、动态加载内容
- 设置robots.txt文件限制爬虫的访问范围
5.1.2 反爬虫的技术手段
了解反爬虫技术手段的细节对于编写高效稳定的爬虫程序至关重要。下面列举一些常见的技术手段:
- IP限制 :如果一个IP短时间内请求过于频繁,服务器可以暂时或永久地拒绝该IP的请求。
- User-Agent限制 :通过检查请求头中的User-Agent字段来识别是不是爬虫发出的请求。
- Cookies限制 :如果爬虫无法处理或模拟Cookies,会导致无法访问某些页面。
- 验证码 :验证码是识别用户身份的常用手段,但爬虫往往无法正确处理复杂的验证码。
- 动态数据加载 :一些数据是通过JavaScript动态加载的,传统的HTTP请求无法获取。
- 会话跟踪 :网站可能会通过会话机制跟踪用户行为,爬虫难以模拟完整的用户会话。
5.2 面对反爬的策略
5.2.1 使用代理IP绕过IP限制
代理IP可以作为爬虫和目标服务器之间的中介,从而帮助爬虫绕过IP限制。当请求被限制时,爬虫可以切换到一个新的代理IP继续请求。
代理IP的使用方法:
- 选择一个可靠的代理IP提供商。
- 在爬虫程序中集成代理IP池。
- 每当检测到IP被封禁时,切换到下一个代理IP继续请求。
示例代码如下:
import requests
proxies = [
'http://10.10.1.10:3128',
'http://123.45.67.89:8080',
# 更多代理IP
]
for proxy in proxies:
try:
response = requests.get('https://www.example.com', proxies={"http": proxy})
if response.status_code == 200:
print('请求成功', proxy)
break
except Exception as e:
print('请求失败', proxy)
# 继续后续操作
5.2.2 设置合理的请求间隔
过于频繁的请求可能会触发反爬机制,因此,合理设置请求间隔是避免被反爬策略识别的有效方法之一。可以通过在连续请求之间加入延时(sleep)来实现。
示例代码片段:
import time
for i in range(10): # 假设要发送10个请求
response = requests.get('https://www.example.com')
# 处理响应
time.sleep(1) # 每个请求间隔1秒
5.2.3 分析和模拟用户行为
为了更有效地模拟人类用户,爬虫程序应当包括对页面进行解析并基于解析结果做出决策的能力。这可能涉及到分析JavaScript代码、模拟用户事件(如点击、滚动)等。
分析用户行为的步骤:
- 网络请求分析 :使用浏览器的开发者工具分析网页加载过程中的网络请求。
- JavaScript执行环境 :模拟JavaScript执行环境,例如使用Selenium或Pyppeteer。
- 模拟用户操作 :模拟点击、输入等用户操作,获取动态加载的数据。
示例代码使用Selenium来模拟点击:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome() # 或使用其他浏览器驱动
driver.get("https://www.example.com")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "someId")) # 等待特定元素出现
)
element.click() # 点击元素
finally:
driver.quit()
通过上述方法,可以有效提高爬虫程序应对反爬机制的能力,从而提高数据采集的效率和稳定性。
6. 法律法规遵守
6.1 网络爬虫的法律边界
6.1.1 网络爬虫相关法律解读
在今天的数字时代,网络爬虫(Web Crawler)在数据采集和信息检索中扮演着重要的角色。然而,网络爬虫的使用也引发了一系列法律问题,尤其是在数据隐私、版权保护以及个人数据保护等方面。了解和遵守相关法律法规不仅是每个网络爬虫开发者和使用者的法律义务,也是道德责任。
在法律框架下,网络爬虫的开发和使用必须尊重以下几个核心原则:
- 版权法 :未经授权的爬取和使用受版权保护的数据可能侵犯版权法。版权法通常规定,复制和分发受版权保护的材料需要原作者的许可。
- 隐私法 :个人数据的收集和处理必须遵循相关的隐私保护法律,如欧盟的通用数据保护条例(GDPR)或美国的加州消费者隐私法(CCPA)。这要求在爬取个人数据时,必须明确告知用户,并获得他们的同意。
- 反爬虫法 :很多网站通过其
robots.txt文件规定了哪些内容可以被爬虫访问。尽管该文件不具有法律约束力,但它表达了网站所有者对爬虫行为的意愿,不遵守可能会被视为恶意行为。
6.1.2 合法爬虫的界定与实践
合法的爬虫行为首先需要遵循的是尊重网站的 robots.txt 协议,这是网站主人与爬虫开发者之间的一种非正式的协议。通过解析该文件,爬虫可以了解哪些页面可以被爬取,哪些应该被禁止。
其次,合法爬虫会遵循以下实践原则:
- 尊重网站内容的版权和使用条款 :在采集数据之前,确认网站是否声明了内容的版权和使用条款,并确保在采集、存储和使用数据过程中遵守这些规定。
- 实施用户身份验证和访问控制 :对于需要登录才能访问的数据,合法的爬虫应该通过合法手段获得访问权限,而不是通过不正当手段如破解密码等。
- 保护个人隐私 :确保在爬取过程中对个人数据进行匿名化或去标识化处理,避免侵犯隐私权。
- 数据的合理使用 :即使数据可以被合法爬取,也要考虑到数据的使用是否合理,是否符合社会道德和公共利益。
6.2 遵守道德与规范
6.2.1 遵守robots.txt协议
robots.txt 是一个放置在网站根目录下的文本文件,用于指示哪些内容可以被搜索引擎爬取。虽然它没有法律约束力,但大多数爬虫工具(包括Google、Bing等搜索引擎的爬虫)都遵守这个规范。违反 robots.txt 可能不会直接导致法律问题,但会遭到网站所有者和网络社区的谴责。
在实际应用中,可以通过爬虫的配置来尊重网站的 robots.txt 协议。例如,Python的Scrapy框架提供了一个内置的中间件,用于读取和遵守这些规则:
ROBOTSTXT_OBEY = True # 这是一个Scrapy设置,告诉爬虫遵守robots.txt协议
6.2.2 尊重网站版权和隐私
当爬取网站数据时,需要特别注意版权和隐私问题。例如,当网站内容是用户生成的,其中可能包括版权受保护的图片、视频、文章等内容。即使内容对公众可见,未经版权持有人的允许,也禁止下载和重新分发。
同时,个人隐私的保护也是一个重要问题。例如,对于包含个人信息的网页,比如社交媒体网站,爬虫需要确保在爬取这些信息时,不仅要遵守法律法规,还要确保信息的安全和用户的隐私权利不被侵犯。这通常意味着需要在爬虫脚本中加入代码,以防止个人信息被收集和存储。
在Python中,可以利用 BeautifulSoup 等库来精确地选择和提取网站中的内容,但必须在合法和道德的框架内进行:
from bs4 import BeautifulSoup
def respect_privacy_and_copyright(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 选择内容时避开可能含有个人隐私信息的标签,如<a>标签的href属性
for link in soup.find_all('a', href=True):
href = link['href']
if not is_public_content(href):
link.unwrap() # 解析后移除该标签,避免隐私和版权问题
# 此处继续提取其他无版权和隐私问题的内容...
# 注意:is_public_content是一个假设函数,用于判断内容是否公开且无版权问题
在上述代码中, is_public_content 函数用于判断内容是否公开且无版权问题。实际应用中,开发者应自定义逻辑确保遵循版权和隐私保护规则。
对于遵守法律法规和道德规范的重要性,是每一个网络爬虫使用者和开发者都应该深思和实践的问题。通过以上所述,我们可以看到,法律与道德的边界为网络爬虫提供了一个操作的框架,确保了技术进步与社会伦理的和谐共进。
7. 异常处理机制
7.1 异常处理的重要性
7.1.1 理解异常处理的作用
在网络爬虫的开发过程中,我们经常会遇到各种预料之外的问题,比如网络请求失败、数据格式错误、解析异常等。异常处理机制是保证爬虫程序稳定运行的关键。通过合理设计的异常处理,我们可以确保爬虫在遇到错误时不会立即崩溃,而是按照预定的逻辑进行处理,或者至少能够记录下错误信息,以便后续的分析和调试。
7.1.2 常见网络爬虫异常分类
网络爬虫在运行过程中可能遇到的异常多种多样,可以大致分为以下几个类别:
- 网络请求异常 :比如超时、网络断开、请求被拒绝等。
- 数据解析异常 :HTML文档结构不符预期,或者解析库无法处理某些数据。
- 数据存储异常 :在将数据写入文件或数据库时可能会遇到写入失败或权限问题。
- 系统资源异常 :如内存不足、磁盘空间不足等。
- 爬虫特定异常 :如违反爬虫策略、被封IP等。
7.2 异常处理的策略
7.2.1 使用try-except捕获异常
在Python中,try-except语句是用来捕获和处理异常的主要手段。通过将潜在的错误代码放在try块中,并用except块来指定可能捕获到的异常类型,可以有效地对异常进行分类处理。
try:
# 尝试执行可能会出错的代码
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
data = response.text
# 解析数据
except requests.exceptions.HTTPError as errh:
print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
print("OOps: Something Else", err)
except Exception as e:
print("An error occurred:", e)
7.2.2 异常日志的记录与分析
记录异常日志是进行错误分析和问题定位的有力工具。通过记录异常发生的环境、类型以及详细信息,可以快速帮助开发者定位问题所在。
import logging
logging.basicConfig(filename='error.log', level=logging.ERROR)
try:
# 尝试执行代码
pass
except Exception as e:
logging.error('Exception in:', e)
日志文件 error.log 将记录所有捕获的异常信息,这对于后续的问题分析和爬虫的持续优化是必不可少的。
7.2.3 爬虫程序的容错机制
为了提高爬虫程序的鲁棒性,我们可以采用重试机制,即在捕获到网络请求类的异常时进行重试,而不是直接终止程序。常见的做法是结合try-except语句和一个循环重试机制。
import time
MAX_RETRIES = 5
for attempt in range(MAX_RETRIES):
try:
# 尝试执行网络请求
response = requests.get(url)
response.raise_for_status()
# 如果请求成功,则中断循环
break
except requests.exceptions.RequestException:
print(f"Attempt {attempt + 1} failed.")
if attempt == MAX_RETRIES - 1:
# 如果重试次数达到上限,记录日志并退出
logging.error("Maximum retries reached.")
time.sleep(2 ** attempt) # 等待时间指数增长,避免瞬时重复请求
通过这种方式,我们可以给予爬虫一定次数的重试机会,避免因为单次网络波动导致爬虫程序彻底停止工作。
在下一章节中,我们将探讨如何为爬虫添加用户代理信息和设置请求间隔,以应对网站可能的反爬策略。
简介:本项目是为Python初学者设计的入门级爬虫练习,旨在教授如何利用Python编写爬虫程序来爬取百度百科的词条和简介。通过本项目,初学者将学会使用Requests和BeautifulSoup库进行网页请求和内容解析,并了解如何保存和循环爬取数据。同时,还将学习到如何处理反爬策略、遵守法律法规以及进行异常处理,从而为进阶的爬虫技术打下基础。
更多推荐




所有评论(0)