1. 环境准备:搭建你的第一个爬虫“工作台”
很多朋友一听到“编程”、“爬虫”这些词,就觉得头大,感觉是程序员才能玩转的东西。其实不然,今天我就带你从零开始,用最直观、最“傻瓜式”的操作,亲手搭建一个能自动抓取网页数据的工具。整个过程就像搭积木,你只需要跟着我的步骤,一步步来,绝对能成。我们这次用的“积木”就是 Python 和 Scrapy 框架,而“工作台”就是 PyCharm 这个超级好用的代码编辑器。
为什么选它们仨?Python 语法简单,接近英语,对新手极其友好;Scrapy 是 Python 里最专业的爬虫框架之一,好比给你一套设计好的乐高套装,你按图纸拼就行,不用自己从零造轮子;PyCharm 则是那个超级智能的工作台,能帮你自动补全代码、检查错误,甚至告诉你哪里可能出问题,大大降低学习门槛。你完全不用担心自己没基础,我当年也是这么一步步摸索过来的,踩过的坑都会在文章里告诉你如何避开。
首先,你得确保电脑上已经安装了 Python。去 Python 官网下载最新版本就行,安装时一定要记得勾选 “Add Python to PATH” 这个选项,这能让你在电脑的任何地方都能轻松调用 Python。安装好后,可以打开电脑的命令提示符(CMD)或者终端(Mac/Linux),输入 python --version 并回车。如果能看到类似 “Python 3.8.1” 这样的版本号信息,恭喜你,第一步成功了!
接下来是安装 PyCharm。它有两个版本:专业版(收费,功能强大)和社区版(免费,对我们初学者完全够用)。我们直接去 JetBrains 官网下载社区版即可。下载后安装过程就是一路“下一步”,没什么特别要注意的。安装完成后打开 PyCharm,你会看到一个清爽的启动界面,我们的爬虫之旅就从这里正式启航。
2. 创建项目与安装Scrapy:打好地基
万事开头难,但开头做好了后面就顺了。打开 PyCharm 后,我们点击 “New Project” 来创建一个全新的项目。这里有个关键点:项目位置(Location) 和 解释器(Interpreter)。
项目位置就是你把这个“爬虫工程”文件夹放在电脑的哪个地方,建议选一个你容易找到的路径,比如 D:\MyScrapyProject。名字可以随意,比如我就喜欢叫 my_first_spider,一目了然。更重要的是下面这个“解释器”设置。PyCharm 很贴心,通常会为你自动创建一个虚拟环境(Virtual Environment)。这是个好东西,我强烈建议你使用它。你可以把它理解为一个独立的、干净的“工作间”,在这个工作间里安装的所有工具包(比如 Scrapy)都只属于当前这个项目,不会和你电脑上其他 Python 项目冲突。这就避免了“装了这个库,那个项目却报错”的经典难题。
创建好项目后,我们就来到了 PyCharm 的主界面。左侧是项目文件树,中间是代码编辑区。现在我们的“工作间”是空的,需要把最重要的工具——Scrapy 框架搬进来。安装过程在 PyCharm 里非常简单,完全不用去记复杂的命令行。
你只需要点击顶部菜单栏的 File -> Settings(或者按快捷键 Ctrl+Alt+S),打开设置窗口。在左侧找到 Project: my_first_spider -> Python Interpreter。点击后,右侧会显示当前项目虚拟环境里已经安装的所有包。点击那个显眼的加号 +,会弹出一个包管理窗口。在顶部的搜索框里输入 “scrapy”,下方就会列出 Scrapy 包。选中它,然后点击左下角的 “Install Package” 按钮。PyCharm 就会自动为你下载并安装 Scrapy 及其所有依赖。你会看到一个进度条,稍等一两分钟,直到出现 “Package ‘scrapy’ installed successfully” 的提示。这就好比去应用商店下载安装一个APP,点一下就行,非常省心。
2.1 验证安装与补充工具包
安装成功后,为了确保万无一失,我们可以再安装两个经常会用到的辅助工具包:wheel 和 pywin32(如果你是 Windows 用户)。安装方法和安装 Scrapy 一模一样,在同一个搜索框里分别搜索并安装即可。wheel 是一种软件分发格式,能让某些包的安装更顺利;pywin32 则提供了一些 Windows 系统接口,有时候处理系统相关任务时会用到。装好之后,你的 “Python Interpreter” 页面应该能看到一长串已安装的包列表,其中包含 scrapy, wheel, pywin32 等,这就表示我们的“地基”已经打得非常牢固了。
为了进一步验证,我们可以打开 PyCharm 底部那个叫 “Terminal”(终端)的标签页。这里相当于一个内置的命令行窗口,而且它已经自动进入了我们项目的虚拟环境。你在里面输入 scrapy version 并回车,如果终端显示出了 Scrapy 的版本号(比如 Scrapy 2.6.2),那么恭喜你,Scrapy 框架已经成功入驻你的工作台,随时可以调用了。这个过程我刚开始学的时候也迷糊过,总觉得命令行很可怕,但其实在 PyCharm 里操作,就像在和电脑进行简单的文字对话,你告诉它“检查一下 scrapy 的版本”,它就会老老实实告诉你答案。
3. 创建Scrapy项目:生成标准“车间”
现在,我们有了工作台(PyCharm)和核心工具(Scrapy),接下来就要用 Scrapy 的命令来创建一个标准的爬虫项目结构。你可以把 Scrapy 项目理解为一个已经规划好区域的“生产车间”,里面有存放原材料的仓库(items.py),有负责核心抓取任务的流水线(spiders/),有对抓取结果进行后期加工的车间(pipelines.py),还有整个车间的总控制台(settings.py)。我们按照这个标准车间来工作,效率会高很多,也不容易出错。
创建这个标准车间,我们需要使用 Scrapy 提供的命令行工具。最方便的方法就是直接在 PyCharm 的终端(Terminal)里操作。确保你的终端当前路径就在你的项目根目录下(比如 D:\MyScrapyProject\my_first_spider)。然后输入以下命令并回车:
scrapy startproject my_spider
这里的 my_spider 是你给这个 Scrapy 项目起的名字,你可以换成任何你喜欢的,比如 bupt_spider。执行这个命令后,Scrapy 会自动生成一整套文件夹和文件。
让我们来看看它都生成了些什么,这很重要:
- my_spider/: 这是项目的主文件夹,名字就是你刚才起的。
- spiders/: 这是“蜘蛛巢穴”,你所有具体的爬虫代码文件(比如抓取新闻的、抓取商品信息的)都会放在这里。每个爬虫就像一只蜘蛛,负责去不同的网上“捕食”信息。
- items.py: 这是“数据模型”文件。你要提前想好,你打算从网上抓取什么信息?是新闻的标题和发布时间,还是商品的价格和图片链接?在这个文件里,你就把这些要抓的“数据项”像定义模板一样先声明好。
- pipelines.py: 这是“数据处理流水线”。蜘蛛抓回来的原始数据,可以在这里进行深加工,比如清洗掉无效数据、保存到数据库、或者导出为 JSON/CSV 文件。
- middlewares.py: 这是“中间件”,相当于车间的“特殊设备”,用于处理更高级的请求和响应,比如设置代理、更换请求头等。初学者可以先不用管它。
- settings.py: 这是“车间总控设置”。在这里你可以开启或关闭某些功能,比如设置爬取速度、是否遵守机器人协议、启用哪个流水线等。
创建成功后,在 PyCharm 左侧的项目文件树里,你会看到这个崭新的 my_spider 文件夹及其内部结构。第一次看到这么多文件可能会有点懵,别担心,我们接下来只会用到其中几个核心文件,而且我会带你一个一个弄明白。
4. 编写第一个爬虫:定义抓取目标与规则
车间建好了,现在我们要制造第一只“蜘蛛”,并派它出去干活。我们的目标是抓取一个简单的公开信息页面作为实战练习。为了贴近原教程并确保可操作性,我们选择一个结构清晰的公开信息页面,例如抓取“中国大学慕课”平台上某个课程列表页的课程名称和链接。这比直接抓取复杂多变的新闻首页要容易得多,非常适合练手。
4.1 设计数据模型(items.py)
首先,打开 my_spider/items.py 文件。这个文件就像我们设计的数据采集表格。我们需要告诉 Scrapy:“我打算抓两种信息,一种是课程名字,一种是课程详情页的网址”。用代码来“声明”这个表格:
import scrapy
class CourseItem(scrapy.Item):
# 定义要爬取的字段,就像定义表格的列名
course_name = scrapy.Field() # 用于存储课程名称
course_link = scrapy.Field() # 用于存储课程链接
这段代码创建了一个名为 CourseItem 的类,它继承自 scrapy.Item。里面的 course_name 和 course_link 就是我们定义的两个“字段”(Field)。你可以把它们想象成 Excel 表格的两个列标题。之后我们的蜘蛛每抓到一门课程,就会生成一个 CourseItem 对象,并把课程名填到 course_name 这个“格子”里,把链接填到 course_link 这个“格子”里。
4.2 创建爬虫核心(spider.py)
接下来是最核心的一步:创建蜘蛛。在 spiders/ 文件夹上右键,选择 New -> Python File,创建一个新文件,命名为 mooc_spider.py。记住,蜘蛛文件一定要放在 spiders/ 这个文件夹里。
在这个新文件里,我们要编写蜘蛛的行为逻辑:从哪里开始爬,如何跟踪链接,如何解析页面并提取我们需要的数据。代码如下,我会逐段解释:
import scrapy
from my_spider.items import CourseItem # 导入我们刚刚定义的数据模型
class MoocSpider(scrapy.Spider):
name = "mooc" # 蜘蛛的名字,启动爬虫时要用到,必须唯一
allowed_domains = ["www.icourse163.org"] # 允许爬取的域名范围,防止爬虫跑到其他网站去
start_urls = ["https://www.icourse163.org/category/computer"] # 起始网址,蜘蛛开始工作的入口
def parse(self, response):
# 这个方法会被自动调用,用于处理从start_urls下载下来的网页响应
# response对象包含了网页的所有内容
courses = response.css('.m-course-list .u-clist .j-link') # 使用CSS选择器定位课程区块
for course in courses:
item = CourseItem() # 为每一门课程创建一个数据项对象
# 使用CSS选择器提取课程名称,extract_first()获取第一个匹配结果
item['course_name'] = course.css('.cnt h3::text').extract_first()
# 提取课程链接,注意拼接完整的URL
item['course_link'] = response.urljoin(course.css('::attr(href)').extract_first())
# 确保提取到的数据不为空再产出
if item['course_name'] and item['course_link']:
yield item # 产出item,它会自动被送到pipelines进行处理
代码解读:
name = "mooc":给这只蜘蛛起名叫“mooc”,之后在命令行用scrapy crawl mooc就能启动它。start_urls:蜘蛛出发的起点,这里我们放了一个计算机课程分类页的链接。parse方法:这是蜘蛛的“大脑”。它接收网页的响应(response),然后像人眼一样去分析网页结构,找出需要的信息。response.css(...):这是用 CSS 选择器 来定位网页元素,非常直观。比如.m-course-list .u-clist .j-link就是在页面中找到所有课程卡片的链接元素。如何知道该写什么选择器?这就需要用到浏览器的“开发者工具”(按 F12 打开),去查看目标元素的 CSS 类名或路径。这是爬虫工程师的必备技能,刚开始可以模仿,多试几次就熟了。yield item:这行代码非常重要。它不是一次性返回所有数据,而是每处理好一门课程,就“生产”一个item并发送出去。这种方式效率高,尤其适合处理大量数据。
4.3 配置数据处理流水线(pipelines.py)
蜘蛛抓取到的 item 数据,会像流水线上的产品一样,被送到 pipelines.py 文件中定义的“流水线”进行加工。我们这里做一个最简单的加工:把所有数据保存到一个 JSON 文件里。
打开 my_spider/pipelines.py 文件,将内容修改如下:
import json
class MyPipeline(object):
def open_spider(self, spider):
# 当蜘蛛启动时,这个方法被调用。我们在这里打开一个文件准备写入。
# 使用 'w' 模式写入,确保每次运行都创建新文件。'a' 模式是追加。
self.file = open('courses_data.json', 'w', encoding='utf-8')
def process_item(self, item, spider):
# 每当蜘蛛产出一个item,这个方法就会被调用一次。
# 将item对象转换为Python字典
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
# 将一行JSON字符串写入文件
self.file.write(line)
return item # 必须返回item,以便其他流水线(如果有)能继续处理它
def close_spider(self, spider):
# 当蜘蛛关闭时,这个方法被调用。我们在这里安全地关闭文件。
self.file.close()
这个流水线类做了三件事:蜘蛛开工时打开文件(open_spider);每收到一个课程数据就把它转成 JSON 格式并写入文件(process_item);蜘蛛完工时关闭文件(close_spider)。ensure_ascii=False 这个参数是为了确保中文能正常显示,而不是被转换成 \uXXXX 这种格式。
4.4 启用流水线与调整设置(settings.py)
最后,我们需要告诉 Scrapy:“请使用我刚刚写好的那个流水线”。打开 my_spider/settings.py 文件,这是一个有很多配置项的大文件。我们需要找到关于 ITEM_PIPELINES 的设置。你可以用 Ctrl+F 搜索 ITEM_PIPELINES。
你会看到类似下面这样被注释掉的代码(前面有 #):
# ITEM_PIPELINES = {
# 'my_spider.pipelines.MyPipeline': 300,
# }
我们需要做两件事:
- 去掉这行配置的注释(删除行首的
#和空格)。 - 确保里面的路径和类名是正确的。
'my_spider.pipelines.MyPipeline'表示my_spider项目下pipelines.py文件里的MyPipeline类。后面的数字300代表优先级,数字越小优先级越高。如果你有多个流水线,可以用这个数字决定执行顺序。
修改后应该是这样:
ITEM_PIPELINES = {
'my_spider.pipelines.MyPipeline': 300,
}
另外,作为一个有道德的爬虫,我们最好遵守目标网站的 robots.txt 协议(这个协议告诉爬虫哪些页面可以抓,哪些不可以)。在 settings.py 里找到 ROBOTSTXT_OBEY 这一项,将其设置为 True。同时,为了避免请求过快对对方服务器造成压力,可以适当降低并发请求数,找到 CONCURRENT_REQUESTS 并设置为一个较小的值,比如 2 或 4。这些设置体现了我们编写友好爬虫的责任心。
5. 运行与调试:见证成果时刻
激动人心的时刻到了!我们如何启动这只辛勤的蜘蛛呢?有两种主流且方便的方法。
方法一:使用PyCharm运行脚本(推荐给纯新手)
在项目根目录(my_spider 外面一层),创建一个新的 Python 文件,比如叫 run_spider.py。里面只需要两行代码:
from scrapy import cmdline
cmdline.execute("scrapy crawl mooc".split())
这段代码的作用就是模拟在命令行输入 scrapy crawl mooc 这个命令。在 PyCharm 中右键点击这个 run_spider.py 文件,选择 Run ‘run_spider’,程序就会开始执行。你会看到终端窗口开始飞速滚动日志,显示蜘蛛正在发送请求、接收响应、解析数据。
方法二:直接在PyCharm终端运行命令(更通用)
打开 PyCharm 的终端(Terminal),确保当前路径在你的 Scrapy 项目目录下(即 my_spider 文件夹所在的目录)。然后直接输入命令:
scrapy crawl mooc
按下回车,效果和方法一完全一样。这是我更常用的方式,因为更直接。
运行过程中,你会看到很多日志输出。如果一切顺利,最后会看到类似 INFO: Closing spider (finished) 的提示,表示爬虫任务完成。此时,在你的项目根目录下,应该会生成一个名为 courses_data.json 的文件。用 PyCharm 或者任何文本编辑器打开它,你就能看到抓取到的、格式规整的课程数据了!每一行都是一个 JSON 对象,包含 course_name 和 course_link。
5.1 常见问题与调试技巧
第一次运行很少能一帆风顺,遇到问题别慌,这才是学习的开始。这里分享几个我踩过的坑和解决办法:
- ImportError: No module named ‘my_spider’:这通常是运行路径不对。确保你的运行命令(或脚本)是在 Scrapy 项目目录(即
scrapy.cfg文件所在的目录)下执行的。 - 爬取不到数据:这是最常见的问题。大概率是 CSS 选择器写错了,或者网站页面结构发生了变化。调试黄金法则:使用
scrapy shell。在终端输入:
这会进入一个交互式环境,并把那个网页下载下来。然后你可以直接在里面测试你的选择器,比如输入scrapy shell 'https://www.icourse163.org/category/computer'response.css('.m-course-list .u-clist .j-link').extract(),看看能否提取到内容。这是一个无比强大的实时调试工具,能帮你快速定位问题所在。 - 被网站屏蔽:如果频繁请求,可能会遇到 403 错误或请求无响应。这时需要在
settings.py中做一些伪装:设置一个常见的用户代理(USER_AGENT),增加下载延迟(DOWNLOAD_DELAY),比如设置为 2,表示每两次请求之间间隔2秒。这些设置都能在settings.py里找到并修改。 - JSON文件内容为空或格式错误:检查
pipelines.py中文件写入的代码逻辑,确保yield item被执行了。也可以在process_item方法里加一句print(item),看看数据是否真的流到了流水线。
当你亲手解决了这些问题,并最终看到那个包含着数据的 JSON 文件时,那种成就感是非常真实的。爬虫技术本质上就是模拟浏览器访问并提取信息的自动化过程。从环境搭建到成功运行,你不仅学会了一套工具的使用,更重要的是理解了“请求-响应-解析-存储”这个核心流程。掌握了这个流程,你再去看其他更复杂的爬虫任务,无非是在这个基础上增加更多的页面分析、更复杂的数据处理、更灵活的请求策略而已。
3385



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



