1. 项目概述与核心价值
最近在整理技术笔记,翻到了几年前刚学Python爬虫时做的一个综合练习项目,当时为了练手,一口气爬了豆瓣电影Top250和王者荣耀全英雄信息,还煞有介事地写了份实验报告。现在回头看,这个项目虽然技术栈不新,但作为爬虫入门到实战的过渡案例,其涵盖的知识点非常经典,从基础请求、数据解析到反爬应对、数据存储,几乎把新手期该踩的坑都踩了一遍。今天就把这个老项目翻出来,结合现在的技术环境重新梳理一遍,分享给正在学习爬虫的朋友。无论你是想了解如何从豆瓣获取电影榜单,还是想批量抓取王者荣耀的英雄资料来做个数据分析,这篇内容都能给你提供一套可直接复现的完整方案。
这个项目的核心价值在于“综合性”。它不像单一教程只讲一个网站,而是通过两个风格迥异的目标(豆瓣-静态页面、王者荣耀-动态数据接口),让你在实践中对比不同场景下的爬虫策略。你会遇到简单的HTML解析,也会碰到需要分析XHR请求的API接口;会用到requests和BeautifulSoup这样的基础库,也可能需要思考如何应对频率限制。最终,你将得到两份结构化的数据:一份是包含电影排名、名称、评分、评价人数的豆瓣榜单;另一份是包含英雄名称、定位、技能、属性等详细资料的王者荣耀英雄库。这些数据无论是用于个人学习、课程作业,还是作为更复杂数据分析项目的数据源,都很有意义。
2. 项目整体设计与思路拆解
2.1 目标分析与技术选型
这个项目包含两个独立但可类比的部分:爬取豆瓣电影Top250和爬取王者荣耀全英雄信息。虽然目标不同,但爬虫的核心流程是一致的:发起请求 -> 获取响应 -> 解析数据 -> 存储数据。我们的设计思路就是围绕这个流程,为每个目标选择合适的工具和方法。
对于豆瓣电影Top250:这是一个经典的静态网页爬取案例。榜单页面(https://movie.douban.com/top250)是分页的,每页25条,共10页。页面结构清晰,数据直接嵌入在HTML中。因此,技术栈非常直接:
- 请求库:
requests。足够简单高效,用于发送HTTP GET请求获取网页源代码。 - 解析库:
BeautifulSoup。因为页面是标准的HTML,使用BeautifulSoup配合CSS选择器或查找方法可以非常直观地定位和提取所需数据。 - 核心挑战:相对简单,主要是构造分页URL和编写稳定的数据提取规则。可能需要处理一下豆瓣轻微的访问频率控制。
对于王者荣耀全英雄信息:情况则复杂一些。王者荣耀的官方网站或相关数据站,其英雄列表和详情页的数据很可能通过JavaScript动态加载,直接请求HTML可能拿不到英雄数据。因此,我们需要换一种思路:
- 请求分析:使用浏览器开发者工具的“网络”(Network)选项卡,特别是筛选XHR/Fetch请求,寻找真正返回英雄数据的API接口。这比解析渲染后的HTML更直接、更稳定。
- 请求库:依然是
requests,但可能需要更复杂的请求参数,如headers(特别是User-Agent、Referer)来模拟浏览器。 - 解析库:由于API通常返回JSON格式的数据,我们不再需要
BeautifulSoup,而是使用Python内置的json库来解析,这比解析HTML简单得多。 - 核心挑战:找到正确的数据接口,并构造合法的请求头以通过服务器的简单校验。
数据存储:两者可以统一。我们将提取的数据转化为Python的字典或列表,然后使用pandas库方便地转换为DataFrame并保存为CSV或Excel文件,便于后续查看和分析。也可以使用json模块直接保存为JSON文件。
整体架构流程图(文字描述):
- 豆瓣爬虫:循环生成10个分页URL ->
requests.get()->BeautifulSoup()解析 -> 提取单页25部电影信息 -> 存入列表 -> 保存为文件。 - 王者爬虫:分析找到英雄列表API ->
requests.get()带请求头 ->json.loads()解析 -> 获取所有英雄ID/名称 -> 循环拼接英雄详情API -> 获取每个英雄详细信息 -> 存入列表 -> 保存为文件。
2.2 环境准备与工具清单
工欲善其事,必先利其器。以下是完成本项目需要准备的软件和Python库。我的开发环境是Windows 11 + Python 3.9,但以下步骤在各平台大同小异。
1. 基础环境安装
- Python 3.7+:这是必须的。可以去Python官网下载安装包。安装时务必勾选“Add Python to PATH”。
- 代码编辑器/IDE:推荐使用VSCode或PyCharm Community Edition。VSCode轻量灵活,PyCharm对Python支持更专业。我个人习惯用VSCode,配置好Python插件后体验很好。
- 浏览器开发者工具:这是爬虫工程师的“眼睛”。Chrome或Edge的F12开发者工具是关键,我们主要用它的“元素”(Elements)查看页面结构,用“网络”(Network)分析数据请求。
2. Python库安装打开你的终端(CMD、PowerShell或终端),使用pip命令安装以下库。建议先创建一个虚拟环境,但为了简化,我们直接进行全局安装。
# 安装HTTP请求库 pip install requests # 安装HTML/XML解析库 pip install beautifulsoup4 # 安装数据处理库,用于最后保存数据 pip install pandas # lxml是一个高效的解析器,BeautifulSoup可以使用它来加速,建议安装 pip install lxml安装完成后,可以在Python交互环境中测试一下:
import requests, bs4, pandas as pd print(“所有库已就绪!”)3. 辅助工具与意识培养
- 请求头(Headers)生成:有时候需要复制浏览器中的完整请求头。在开发者工具的“网络”选项卡中,点击任意一个请求,在右侧“标头”(Headers)部分找到“请求标头”,可以直接复制
User-Agent、Cookie等。一个小技巧:requests库的session对象可以保持一些头部信息。 - 延时设置:出于道德和对目标网站服务器的尊重,爬取时应在请求间添加随机延时,避免高频访问。可以使用
time.sleep()。 - 异常处理:网络请求不稳定,解析规则可能因页面微调而失效。务必使用
try...except包裹核心代码,并记录日志。
注意:爬虫行为应始终遵守网站的
robots.txt协议(通常在网站根目录,如https://www.douban.com/robots.txt),并控制访问频率。本项目仅用于学习交流,切勿用于商业用途或对服务器造成压力。
3. 核心细节解析与实操要点
3.1 豆瓣电影Top250爬取:静态页面解析实战
豆瓣Top250页面是学习爬虫的“Hello World”级项目,但它能教会你处理分页、CSS选择器使用和数据结构化。
第一步:页面结构与URL规律分析打开https://movie.douban.com/top250,查看页面源码(右键-查看网页源代码)。你会发现电影信息都在<div class=”item”>…</div>这个容器里。翻到第二页,URL变成了https://movie.douban.com/top250?start=25&filter=。规律很明显:start参数控制起始条目,每页25条。因此,第i页(从0开始)的URL就是f”https://movie.douban.com/top250?start={i*25}&filter=”。
第二步:使用BeautifulSoup解析与数据提取我们需要从每个.item中提取:电影排名、名称、评分、评价人数、引言等。这里用CSS选择器是最清晰的方式。
from bs4 import BeautifulSoup import requests def parse_douban_page(html): “””解析一页豆瓣HTML,返回电影信息列表””” soup = BeautifulSoup(html, ‘lxml’) movie_list = [] # 找到所有电影项目 items = soup.select(‘div.item’) for item in items: # 排名(在class=”pic”的em标签里) rank = item.select_one(‘em’).text # 标题(在class=”title”的第一个span里,注意可能有中文名和英文名) title = item.select_one(‘span.title’).text # 评分(在class=”rating_num”的span里) rating = item.select_one(‘span.rating_num’).text # 评价人数(在class=”star”的span里,最后一个span) # 需要一些字符串处理来提取数字 star_span = item.select_one(‘div.star’) if star_span: # 获取star下的所有文本,然后分割 star_text = star_span.get_text(strip=True) # 通常格式如”9.7 2000000人评价”,我们提取数字部分 import re rating_num_match = re.search(r‘(\d+)人评价’, star_text) rating_num = rating_num_match.group(1) if rating_num_match else ‘0’ else: rating_num = ‘0’ # 引言/短评(在class=”quote”的span里,可能没有) quote_elem = item.select_one(‘span.inq’) quote = quote_elem.text if quote_elem else ‘’ movie_list.append({ ‘排名’: rank, ‘标题’: title, ‘评分’: rating, ‘评价人数’: rating_num, ‘引言’: quote }) return movie_list关键点与避坑指南:
- 选择器稳定性:豆瓣的页面结构相对稳定,但并非一成不变。如果某天代码跑不通了,首先检查CSS类名是否变化。使用
select_one比find结合复杂的属性更易读。 - 文本清理:
get_text(strip=True)可以移除多余空白。对于评价人数这种嵌套在文本中的数字,正则表达式re是一个强大的工具。 - 缺失项处理:像
quote(引言)不是每部电影都有,所以要用if quote_elem:进行判断,避免AttributeError。 - 编码问题:豆瓣使用UTF-8编码,
requests会自动处理,一般没问题。如果遇到乱码,可以检查response.encoding并手动设置。
3.2 王者荣耀英雄信息爬取:动态接口分析与JSON处理
王者荣耀的数据通常通过后台接口获取,这要求我们从“爬页面”转向“爬接口”。
第一步:寻找数据接口
- 打开一个王者荣耀英雄资料网站(例如王者荣耀官网或一些第三方资料站)。打开浏览器开发者工具(F12),切换到“网络”(Network)选项卡。
- 刷新页面,在请求列表中筛选“XHR”或“Fetch”。
- 仔细查看这些请求的URL和响应预览(Preview)。寻找包含
herolist、hero、list等关键词,且响应体是JSON格式的请求。这个过程可能需要一些耐心和猜测。- 举例:我通过分析,发现某个数据接口的URL模式类似于
https://pvp.qq.com/web201605/js/herolist.json(注意:此URL为示例,实际接口可能已变更,请以你实际分析为准)。这个接口直接返回了一个包含所有英雄基本信息的JSON数组。 - 另一个常见模式:可能有一个列表接口返回英雄ID,然后详情接口模式为
https://…/hero/{hero_id}.json。
- 举例:我通过分析,发现某个数据接口的URL模式类似于
第二步:分析接口请求与参数找到接口后,查看它的“标头”(Headers),特别是Request Headers。你需要关注:
User-Agent:告诉服务器你是什么浏览器。这是最基本的反爬措施,必须携带一个常见的浏览器UA。Referer:表示请求来自哪个页面。对于有些接口,缺少正确的Referer会被拒绝。Cookie:可能需要登录态才能获取数据,但公开的英雄信息接口通常不需要。
第三步:编写爬取代码假设我们找到了英雄列表接口herolist.json,它返回每个英雄的ename(英雄ID)、cname(英雄名)等。
import requests import json import time import random def fetch_hero_list(): “””获取英雄列表””” url = ‘https://pvp.qq.com/web201605/js/herolist.json’ # 示例URL,需替换 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’, ‘Referer’: ‘https://pvp.qq.com/web201605/’ # 示例Referer } try: resp = requests.get(url, headers=headers, timeout=10) resp.raise_for_status() # 检查请求是否成功 # 接口返回的可能是JSONP格式(如`herolistJsonCallback([…])`),需要处理 # 如果是纯JSON,直接解析 hero_list = resp.json() return hero_list except requests.exceptions.RequestException as e: print(f“请求英雄列表失败: {e}”) return [] except json.JSONDecodeError: # 尝试处理JSONP text = resp.text # 简单去除JSONP包装,实际情况可能更复杂 if text.startswith(‘herolistJsonCallback’): json_str = text[text.find(‘[‘): text.rfind(‘]’)+1] return json.loads(json_str) return [] def fetch_hero_detail(hero_id, hero_name): “””根据英雄ID获取英雄详情””” # 详情页接口需要根据实际分析得到 detail_url = f‘https://pvp.qq.com/web201605/js/herodetail/{hero_id}.json’ # 示例 headers = {…} # 同上,可能需要不同的Referer try: resp = requests.get(detail_url, headers=headers, timeout=10) resp.raise_for_status() detail_data = resp.json() # 提取我们需要的信息 return { ‘英雄ID’: hero_id, ‘英雄名称’: hero_name, ‘定位’: ‘、’.join(detail_data.get(‘occupation’, [])), # 可能是个列表 ‘生存能力’: detail_data.get(‘survival’, ‘’), ‘攻击伤害’: detail_data.get(‘attack’, ‘’), ‘技能效果’: detail_data.get(‘skill’, ‘’), ‘上手难度’: detail_data.get(‘difficulty’, ‘’), ‘技能介绍’: process_skills(detail_data.get(‘skills’, [])), # 自定义处理函数 } except Exception as e: print(f“获取英雄 {hero_name}({hero_id}) 详情失败: {e}”) return None finally: # 礼貌性延时,避免请求过快 time.sleep(random.uniform(0.5, 1.5))关键点与避坑指南:
- 接口寻找是关键:这是动态网站爬虫最难也最重要的一步。多试试不同的筛选条件(JS、XHR),关注返回数据量大的请求。如果官网接口难找,可以搜索“王者荣耀 英雄数据 API”,有些社区或开发者会整理公开接口,但要注意其可用性和合法性。
- 处理JSONP:有些老式接口会使用JSONP(即用JavaScript函数包裹JSON数据)。你需要从响应文本中剥离掉函数名和括号,提取出纯JSON字符串。正则表达式或简单的字符串切片可以解决。
- 请求头模拟:务必带上合理的
User-Agent和Referer。可以直接从浏览器开发者工具里复制。 - 异常处理与延时:网络请求和JSON解析都可能出错,必须用
try…except捕获。在循环请求详情页时,time.sleep(random.uniform(a, b))是必备的,既能防止IP被封,也是对服务器的尊重。 - 数据字段不统一:不同接口返回的字段名和结构可能不同。你需要仔细查看JSON响应,适配你的解析代码。
detail_data.get(‘key’, default)的方式可以避免KeyError。
4. 实操过程与核心环节实现
4.1 豆瓣爬虫完整实现与数据存储
将上面的解析函数整合进一个完整的爬虫流程,并加入分页循环和存储功能。
import requests from bs4 import BeautifulSoup import pandas as pd import time import random def crawl_douban_top250(): “””爬取豆瓣Top250所有电影””” base_url = “https://movie.douban.com/top250” all_movies = [] headers = { ‘User-Agent’: ‘Mozilla/5.0 … Safari/537.36’ } for page in range(0, 10): # 0-9页 start = page * 25 url = f“{base_url}?start={start}&filter=” print(f“正在爬取第 {page+1} 页: {url}”) try: resp = requests.get(url, headers=headers, timeout=15) resp.raise_for_status() # 豆瓣有时会用一些简单的反爬,检查一下状态码和内容 if resp.status_code != 200: print(f“第 {page+1} 页请求异常,状态码: {resp.status_code}”) break # 检查页面是否包含关键元素,防止被重定向到登录页等 if “登录豆瓣” in resp.text: print(“可能触发了反爬,需要检查Cookie或访问频率。”) break movies = parse_douban_page(resp.text) # 使用前面定义的解析函数 all_movies.extend(movies) print(f“第 {page+1} 页爬取完成,共 {len(movies)} 部电影。”) except requests.exceptions.RequestException as e: print(f“爬取第 {page+1} 页时发生网络错误: {e}”) # 可以在这里加入重试逻辑 break except Exception as e: print(f“解析第 {page+1} 页时发生未知错误: {e}”) break # 随机延时,模拟人类浏览 time.sleep(random.uniform(1, 3)) # 存储数据 if all_movies: df = pd.DataFrame(all_movies) # 调整列顺序 df = df[[‘排名’, ‘标题’, ‘评分’, ‘评价人数’, ‘引言’]] # 保存为CSV df.to_csv(‘douban_top250.csv’, index=False, encoding=‘utf_8_sig’) # utf_8_sig解决Excel打开乱码 # 保存为Excel # df.to_excel(‘douban_top250.xlsx’, index=False) print(f“所有数据爬取完成!共 {len(all_movies)} 条记录,已保存至 douban_top250.csv”) return df else: print(“未爬取到任何数据。”) return None if __name__ == ‘__main__’: crawl_douban_top250()存储格式说明:这里选择了CSV格式,因为它通用、轻量,可以用Excel、文本编辑器或pandas直接打开。encoding=‘utf_8_sig’是为了让生成的CSV文件在Windows系统下的Excel中打开时,中文字符能正常显示,不会变成乱码。如果你需要更复杂的格式(如多个工作表),可以使用to_excel方法。
4.2 王者荣耀爬虫完整实现与数据聚合
王者荣耀的爬虫需要先获取列表,再遍历列表获取详情,是一个典型的两步爬取。
import requests import json import pandas as pd import time import random def crawl_king_of_glory(): “””爬取王者荣耀全英雄信息””” print(“开始爬取王者荣耀英雄列表…”) hero_list = fetch_hero_list() # 使用前面定义的函数 if not hero_list: print(“获取英雄列表失败,程序退出。”) return print(f“共发现 {len(hero_list)} 个英雄。”) all_hero_details = [] for idx, hero in enumerate(hero_list): hero_id = hero.get(‘ename’) hero_name = hero.get(‘cname’) if not hero_id: continue print(f“[{idx+1}/{len(hero_list)}] 正在爬取英雄: {hero_name} (ID: {hero_id})”) detail = fetch_hero_detail(hero_id, hero_name) # 使用前面定义的函数 if detail: all_hero_details.append(detail) else: print(f“英雄 {hero_name} 详情爬取失败,已跳过。”) # 进度提示与延时 if (idx + 1) % 5 == 0: print(f“已处理 {idx+1} 个英雄…”) # 存储数据 if all_hero_details: df = pd.DataFrame(all_hero_details) # 你可以根据需要调整列的顺序 output_columns = [‘英雄ID’, ‘英雄名称’, ‘定位’, ‘生存能力’, ‘攻击伤害’, ‘技能效果’, ‘上手难度’, ‘技能介绍’] # 确保DataFrame包含这些列,不存在的列会被忽略或填充NaN df = df.reindex(columns=output_columns) df.to_csv(‘king_of_glory_heroes.csv’, index=False, encoding=‘utf_8_sig’) print(f“英雄详情爬取完成!共 {len(all_hero_details)} 条记录,已保存至 king_of_glory_heroes.csv”) return df else: print(“未成功爬取到任何英雄详情。”) return None # 辅助函数:处理技能列表,将其转换为可读的字符串 def process_skills(skills_list): if not skills_list: return ‘’ skill_texts = [] for skill in skills_list: name = skill.get(‘name’, ‘未知技能’) desc = skill.get(‘description’, ‘无描述’) # 简单格式化,可以更复杂 skill_texts.append(f“{name}: {desc[:50]}…” if len(desc) > 50 else f“{name}: {desc}”) return ‘ | ‘.join(skill_texts) if __name__ == ‘__main__’: crawl_king_of_glory()数据聚合要点:这个脚本的核心是crawl_king_of_glory函数。它先获取总列表,然后遍历每个英雄ID去获取详情。在循环中加入了进度打印和随机延时,使得运行过程更友好,也降低了被封风险。process_skills是一个示例函数,展示了如何将嵌套的JSON技能数据(通常是列表套字典)扁平化成一段易于存储和阅读的文本。在实际操作中,你可能需要根据接口返回的实际数据结构来调整这个函数。
5. 常见问题与排查技巧实录
爬虫代码很少能一次写对,永远跑通。在实际操作中,你会遇到各种各样的问题。下面是我在运行这两个爬虫时遇到过的一些典型问题及解决方法,希望能帮你少走弯路。
5.1 请求被拒绝或返回异常数据
- 问题现象:
requests.get()返回的状态码是403、404,或者返回的HTML内容很短,包含“访问过于频繁”、“请验证”等字样。 - 可能原因与排查:
- 缺少或错误的请求头:这是最常见的原因。服务器通过
User-Agent识别爬虫。解决:务必添加一个常见的浏览器User-Agent。对于某些网站(如豆瓣),可能还需要Referer、Accept-Language等。直接从浏览器开发者工具里复制整个Request Headers有时很有效。 - IP被暂时限制:短时间内发送过多请求。解决:这是必须遵守的规则。在循环请求中务必加入
time.sleep(random.uniform(2, 5))这样的随机延时。对于豆瓣这类网站,间隔2-5秒是比较安全的。可以考虑使用random来让间隔时间不规律。 - 需要Cookie或登录态:有些页面(如豆瓣查看更多时)可能需要登录后的Cookie。解决:先手动在浏览器登录,然后从开发者工具中复制
Cookie字段添加到请求头。注意Cookie会过期。更复杂的情况需要模拟登录流程(涉及session、post请求和表单处理),这属于中级爬虫内容。 - 目标URL已变更或接口失效:特别是对于王者荣耀的接口,腾讯可能会调整API地址。解决:重新使用开发者工具分析网络请求,找到新的数据接口URL。这是动态爬虫的常态。
- 缺少或错误的请求头:这是最常见的原因。服务器通过
5.2 解析失败,提取不到数据
- 问题现象:
soup.select()返回空列表,或者resp.json()抛出JSONDecodeError。 - 可能原因与排查:
- 页面结构已更新:网站的HTML结构或CSS类名变了。解决:重新检查页面元素。使用
soup.prettify()打印一部分HTML出来,或者用浏览器的“检查”功能,重新确认目标数据所在的标签和其属性。不要写死解析逻辑,考虑使用更通用的选择方式(如通过多个标签层级定位)。 - 数据是JavaScript动态加载的:你以为爬的是HTML,但数据是JS后来渲染的。解决:这是王者荣耀爬虫部分的核心。必须去“网络”选项卡找真正的数据接口(XHR/Fetch),而不是解析初始的HTML文档。
- JSONP格式问题:接口返回的是JSONP,不是纯JSON。解决:如前面代码所示,需要先截取响应文本中
(和)之间的部分,或者用正则提取JSON字符串。 - 编码问题:虽然不多见,但有些页面可能不是UTF-8。解决:检查
resp.encoding,如果不对,可以手动设置,例如resp.encoding = ‘gbk’。
- 页面结构已更新:网站的HTML结构或CSS类名变了。解决:重新检查页面元素。使用
5.3 数据存储乱码或格式错误
- 问题现象:CSV文件用Excel打开中文是乱码,或者用文本编辑器打开发现格式不对。
- 解决:
- Excel乱码:这是Windows下Excel的“老毛病”。在调用
to_csv时,指定encoding=‘utf_8_sig’。这个编码会在文件开头添加一个BOM(字节顺序标记),Excel就能正确识别UTF-8了。 - 字段包含逗号或换行符:CSV默认用逗号分隔,如果数据本身有逗号,会导致列错位。解决:
to_csv方法默认会用双引号包裹包含特殊字符的字段。确保你的数据是干净的,或者考虑使用sep=‘\t’(制表符分隔)保存为TSV文件。 - 想保存更多格式:除了CSV,
pandas可以轻松保存为Excel(.xlsx)、JSON(.json)甚至数据库。选择最适合你后续处理需求的格式。
- Excel乱码:这是Windows下Excel的“老毛病”。在调用
5.4 脚本运行不稳定,中途崩溃
- 问题现象:爬到一半因为网络超时、解析错误等原因停止。
- 解决:健壮性编程。
- 全面使用try-except:将网络请求、数据解析、文件操作等可能出错的代码块都用
try…except包裹,并在except中记录错误日志(打印到屏幕或写入文件),而不是让整个程序崩溃。 - 设置超时:
requests.get(url, timeout=10),避免因为某个请求卡住而无限等待。 - 加入重试机制:对于网络请求失败(如超时、连接错误),可以设计一个重试循环(例如重试3次)。可以使用
tenacity库,也可以自己写一个简单的循环。 - 分段保存:如果爬取数据量很大,不要等到全部爬完再保存。可以每爬取10个或20个条目就追加写入一次文件。这样即使程序中途出错,也已经保存了部分成果。
- 全面使用try-except:将网络请求、数据解析、文件操作等可能出错的代码块都用
5.5 关于“实验报告”的额外建议
既然标题提到了“实验报告”,如果你需要将这个过程整理成一份报告,除了代码和结果,还应该包含以下部分:
- 实验目的:掌握静态网页和动态接口两种数据爬取方法。
- 实验环境:列出你的Python版本、第三方库及版本号(
pip freeze可以查看)。 - 实验原理与分析:阐述
requests、BeautifulSoup、开发者工具分析网络请求的工作原理。 - 实验步骤:将上面的代码实现过程分步骤描述。
- 实验结果与分析:展示爬取到的数据片段(用表格形式),分析数据质量,讨论遇到的问题和解决方案。
- 实验总结:总结两种爬虫方式的异同、各自的适用场景以及本次实践的收获。
最后,爬虫技术是一把双刃剑。在学习和练习过程中,请始终牢记:
- 尊重
robots.txt:查看目标网站的robots.txt文件,了解哪些目录是允许爬取的。 - 控制访问频率:这是最重要的道德和法律底线。不要对目标服务器造成负担。
- 明确数据用途:爬取的数据仅用于个人学习、研究或公益目的,切勿用于商业用途或侵犯他人权益。
- 遵守网站条款:有些网站明确禁止爬虫行为。