Scrapy 入门教程(RUNOOB.COM)

本文详细介绍Scrapy爬虫框架的运作流程与实践步骤,包括项目创建、目标定义、爬虫制作与数据存储。通过具体案例,教授如何抓取网站数据、解析网页结构并保存所需信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

  • Scrapy Engine(引擎):
    负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
    Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
    Downloader(下载器):负责下载Scrapy
    Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy
    Engine(引擎),由引擎交给Spider来处理,
    Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器).
    Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
    Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。 Spider
    Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

Scrapy的运作流程

代码写好,程序开始运行…
1 引擎:Hi!Spider, 你要处理哪一个网站?
2 Spider:老大要我处理xxxx.com
3 引擎:你把第一个需要处理的URL给我吧。
4 Spider:给你,第一个URL是xxxxxxx.com
5 引擎:Hi!调度器,我这有request请求你帮我排序入队一下。
6 调度器:好的,正在处理你等一下。
7 引擎:Hi!调度器,把你处理好的request请求给我。
8 调度器:给你,这是我处理好的request
9 引擎:Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求
10 下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)
11 引擎:Hi!Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的)
12 Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。
13 引擎:Hi !管道 我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。
14 管道调度器:好的,现在就做!

制作 Scrapy 爬虫 一共需要4步:

1.新建项目 (scrapy startproject xxx):新建一个新的爬虫项目
2.明确目标 (编写items.py):明确你想要抓取的目标
3.制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
4.存储内容 (pipelines.py):设计管道存储爬取内容

入门案例

学习目标

创建一个Scrapy项目
定义提取的结构化数据(Item)
编写爬取网站的 Spider 并提取出结构化数据(Item)
编写 Item Pipelines 来存储提取到的Item(即结构化数据)

一. 新建项目(scrapy startproject)

在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中,运行下列命令:
scrapy startproject mySpider
其中, mySpider 为项目名称,可以看到将会创建一个 mySpider 文件夹,目录结构大致如下:
下面来简单介绍一下各个主要文件的作用:

mySpider/
    scrapy.cfg
    mySpider/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

这些文件分别是:
scrapy.cfg: 项目的配置文件。
mySpider/: 项目的Python模块,将会从这里引用代码。
mySpider/items.py: 项目的目标文件。
mySpider/pipelines.py: 项目的管道文件。
mySpider/settings.py: 项目的设置文件。
mySpider/spiders/: 存储爬虫代码目录。

二、明确目标(mySpider/items.py)

我们打算抓取 http://www.itcast.cn/channel/teacher.shtml 网站里的所有讲师的姓名、职称和个人信息。
1.打开 mySpider 目录下的 items.py
2.Item 定义结构化数据字段,用来保存爬取到的数据,有点像 Python 中的 dict,但是提供了一些额外的保护减少错误。
3.可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个 Item(可以理解成类似于 ORM 的映射关系)。
接下来,创建一个 ItcastItem 类,和构建 item 模型(model)。

import scrapy

class ItcastItem(scrapy.Item):
   name = scrapy.Field()
   title = scrapy.Field()
   info = scrapy.Field()

三、制作爬虫 (spiders/itcastSpider.py)

爬虫功能要分两步:

1. 爬数据

在当前目录下输入命令,将在mySpider/spider目录下创建一个名为itcast的爬虫,并指定爬取域的范围:

scrapy genspider itcast "itcast.cn"

打开 mySpider/spider目录里的 itcast.py,默认增加了下列代码:

import scrapy

class ItcastSpider(scrapy.Spider):
    name = "itcast"
    allowed_domains = ["itcast.cn"]
    start_urls = (
        'http://www.itcast.cn/',
    )

    def parse(self, response):
        pass

其实也可以由我们自行创建itcast.py并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦
要建立一个Spider, 你必须用scrapy.Spider类创建一个子类,并确定了三个强制的属性 和 一个方法。
name = “” :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。
allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
负责解析返回的网页数据(response.body),提取结构化数据(生成item)
生成需要下一页的URL请求。
将start_urls的值修改为需要爬取的第一个url

start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)

修改parse()方法

def parse(self, response):
    filename = "teacher.html"
    open(filename, 'w').write(response.body)

然后运行一下看看,在mySpider目录下执行:

scrapy crawl itcast

是的,就是 itcast,看上面代码,它是 ItcastSpider 类的 name 属性,也就是使用 scrapy genspider命令的唯一爬虫名。
运行之后,如果打印的日志出现 [scrapy] INFO: Spider closed (finished),代表执行完成。 之后当前文件夹中就出现了一个 teacher.html 文件,里面就是我们刚刚要爬取的网页的全部源代码信息。
注意: Python2.x默认编码环境是ASCII,当和取回的数据编码格式不一致时,可能会造成乱码;我们可以指定保存内容的编码格式,一般情况下,我们可以在代码最上方添加

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

这三行代码是 Python2.x 里解决中文编码的万能钥匙,经过这么多年的吐槽后 Python3 学乖了,默认编码是Unicode了…(祝大家早日拥抱Python3)

2. 取数据

爬取整个网页完毕,接下来的就是的取过程了,首先观察页面源码:

<div class="li_txt">
    <h3>  xxx  </h3>
    <h4> xxxxx </h4>
    <p> xxxxxxxx </p>

是不是一目了然?直接上 XPath 开始提取数据吧。
xpath 方法,我们只需要输入的 xpath 规则就可以定位到相应 html 标签节点,详细内容可以查看 xpath 教程。
不会 xpath 语法没关系,Chrome 给我们提供了一键获取 xpath 地址的方法(右键->检查->copy->copy xpath),如下图:
在这里插入图片描述
这里给出一些 XPath 表达式的例子及对应的含义:
/html/head/title: 选择HTML文档中 标签内的 元素<br/> /html/head/title/text(): 选择上面提到的 <title> 元素的文字<br/> //td: 选择所有的 <td> 元素<br/> //div[@class=“mine”]: 选择所有具有 class=“mine” 属性的 div 元素<br/> 举例我们读取网站 <a href="http://www.itcast.cn/">http://www.itcast.cn/</a> 的网站标题,修改 <a href="http://itcast.py">itcast.py</a> 文件代码如下:</td>

# -*- coding: utf-8 -*-
import scrapy

# 以下三行是在 Python2.x版本中解决乱码问题,Python3.x 版本的可以去掉
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

class Opp2Spider(scrapy.Spider):
    name = 'itcast'
    allowed_domains = ['itcast.com']
    start_urls = ['http://www.itcast.cn/']

    def parse(self, response):
        # 获取网站标题
        context = response.xpath('/html/head/title/text()')   
       
        # 提取网站标题
        title = context.extract_first()  
        print(title) 
        pass

执行以下命令:

$ scrapy crawl itcast
...
...
传智播客官网-好口碑IT培训机构,一样的教育,不一样的品质
...
...

我们之前在 mySpider/items.py 里定义了一个 ItcastItem 类。 这里引入进来:

from mySpider.items import ItcastItem

然后将我们得到的数据封装到一个 ItcastItem 对象中,可以保存每个老师的属性:

from mySpider.items import ItcastItem

def parse(self, response):
    #open("teacher.html","wb").write(response.body).close()

    # 存放老师信息的集合
    items = []

    for each in response.xpath("//div[@class='li_txt']"):
        # 将我们得到的数据封装到一个 `ItcastItem` 对象
        item = ItcastItem()
        #extract()方法返回的都是unicode字符串
        name = each.xpath("h3/text()").extract()
        title = each.xpath("h4/text()").extract()
        info = each.xpath("p/text()").extract()

        #xpath返回的是包含一个元素的列表
        item['name'] = name[0]
        item['title'] = title[0]
        item['info'] = info[0]

        items.append(item)

    # 直接返回最后数据
    return items

我们暂时先不处理管道,后面会详细介绍。

保存数据
scrapy保存信息的最简单的方法主要有四种,-o 输出指定格式的文件,命令如下:

scrapy crawl itcast -o teachers.json

json lines格式,默认为Unicode编码

scrapy crawl itcast -o teachers.jsonl

csv 逗号表达式,可用Excel打开

scrapy crawl itcast -o teachers.csv

xml格式

scrapy crawl itcast -o teachers.xml
嗯,用户想要找从Python入门到全栈开发的免费学习网站。我先看看参考内容里的信息有没有合适的资源。 第一个参考内容提到腾讯课堂的星越教育课程,但看起来是付费的,可能不符合用户的免费需求。第二个和第五个参考内容提到了优快云博客里的资源,里面有很多免费视频,比如B站的千锋教育和黑马程序员的教程链接,这些应该都是免费的。第三个和第六个参考内容推荐了官方文档、w3school、菜鸟教程,这些网站都是经典的学习资源,完全免费。还有ProgramCreek和LearnPython这样的英文网站,可能适合有一定英语基础的学习者。 另外,第五个参考内容里提到百度网盘的资料,但链接可能需要提取密码,用户可能需要注册或关注才能获取,不过也是免费资源。Udacity的免费课程和Google的Python课程也是不错的选项,尤其是Google的课程质量应该很高。 需要确认的是这些资源是否都还在线,比如B站的视频链接是否有效。用户可能需要自行访问确认,但大部分应该是可用的。总结的时候应该分门别类,比如视频教程、文档网站、实战项目等,让用户方便选择。要确保涵盖从基础到全栈的不同阶段,包括Web开发、爬虫、数据库等内容。需要注意用户要的是全栈,所以后端和前端的内容都要包含。比如Django框架、数据库持久化部分,这些在参考内容里有提到,可以整合进去。 还要注意时效性,虽然参考内容发布时间在2024到2025年之间,但大部分资源比如官方文档和B站教程通常长期有效。可能建议用户优先选择中文资源,如果英语好可以看英文网站。同时提醒用户实践的重要性,结合项目来学习。最后整理成一个结构清晰的回答,列出每个资源类型和对应的链接,方便用户使用。 以下是针对Python从入门到全栈开发的免费学习资源推荐,结合权威性与时效性,覆盖基础语法、Web开发、数据库、爬虫等全栈方向:   一、系统化视频教程(免费) 1. B站千锋教育Python教程      ○ 特点:700集零基础课程,涵盖基础语法、Web开发、爬虫、数据分析、AI基础。      ○ 链接:B站700集教程 2. B站黑马程序员Python教程      ○ 特点:600集系统课程,基于Linux环境,包含基础语法、面向对象、游戏开发。      ○ 链接:B站600集教程 3. Udacity Python入门课(英文)           ○ 特点:免费入门课程,结合搜索引擎与网络爬虫项目,适合动手实践。      ○ 链接:Intro to Computer Science   二、官方文档与中文社区 1. Python官方中文文档      ○ 特点:最权威的语法参考,覆盖基础语法、标准库及进阶指南。      ○ 链接:Python中文文档 2. 菜鸟教程 & W3School           ○ 特点:新手友好,提供Python语法、实例及操作步骤详解。      ○ 链接:          ● 菜鸟教程Python          ● W3School Python   三、实战项目与案例 1. ProgramCreek Python代码实例      ○ 特点(英文):海量模块实例(如 datetime 、 requests ),直接搜索函数名称即可查看用法。      ○ 链接:Python Code Examples 2. Github开源项目           ○ 推荐:搜索关键词“Python全栈项目”,如Django博客系统、电商平台。      ○ 学习方式:阅读代码 → 复现功能 → 参与Issue讨论。   四、专项技能提升 1. Web开发(Django/Flask)      ○ 资源推荐:          ● B站Django教程:全栈开发教程          ● Flask官方文档:Flask中文指南 2. 数据库与数据持久化      ○ 免费课:B站搜索“MySQL+Python”或“SQLAlchemy教程”,如SQLAlchemy ORM教程。 3. 爬虫开发(Scrapy/Requests)           ○ B站爬虫框架Scrapy实战:Scrapy框架教程   五、综合学习平台 1. LearnPython(英文)      ○ 特点:交互式学习,涵盖初级到高级语法,附带在线代码编辑器。      ○ 链接:LearnPython 2. Google Python Class           ○ 特点:Google官方课程,包含文本与视频教程,适合快速上手。      ○ 链接:Google Python课程   六、国内免费资源包 1. 优快云博主共享资料      ○ 内容:Python零基础入门、爬虫开发、Web全栈资料包(需百度网盘提取)。      ○ 获取方式:访问此链接 按指引领取。   学习建议 1. 路线:先掌握基础语法(变量、循环、函数)→ 学习数据库与Web框架 → 实战项目 → 深入爬虫/数据分析。 2. 实践:每学完一个知识点,用代码实现小功能(如爬取天气、搭建个人博客)。 3. 社区:加入Python技术群或Stack Overflow,遇到问题及时提问。 希望这些资源能助你从入门到全栈!
06-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值