【愚公系列】《Python网络爬虫从入门到精通》051-Scrapy 的基本应用

举报
愚公搬代码 发表于 2025/05/20 20:38:28 2025/05/20
【摘要】 🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"挖山不止"的毅力为开发者们搬开知识道路上的重重阻碍!💎【行业认证·权威头衔】✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家✔ 开发者社区...

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟

📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!

👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"挖山不止"的毅力为开发者们搬开知识道路上的重重阻碍!

💎【行业认证·权威头衔】
✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家
✔ 开发者社区全满贯:CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主
✔ 技术生态共建先锋:横跨鸿蒙、云计算、AI等前沿领域的技术布道者

🏆【荣誉殿堂】
🎖 连续三年蝉联"华为云十佳博主"(2022-2024)
🎖 双冠加冕CSDN"年度博客之星TOP2"(2022&2023)
🎖 十余个技术社区年度杰出贡献奖得主

📚【知识宝库】
覆盖全栈技术矩阵:
◾ 编程语言:.NET/Java/Python/Go/Node…
◾ 移动生态:HarmonyOS/iOS/Android/小程序
◾ 前沿领域:物联网/网络安全/大数据/AI/元宇宙
◾ 游戏开发:Unity3D引擎深度解析
每日更新硬核教程+实战案例,助你打通技术任督二脉!

💌【特别邀请】
正在构建技术人脉圈的你:
👍 如果这篇推文让你收获满满,点击"在看"传递技术火炬
💬 在评论区留下你最想学习的技术方向
⭐ 点击"收藏"建立你的私人知识库
🔔 关注公众号获取独家技术内参
✨与其仰望大神,不如成为大神!关注"愚公搬代码",让坚持的力量带你穿越技术迷雾,见证从量变到质变的奇迹!✨ |

🚀前言

今天,我们将进一步深入 Scrapy 的基本应用,带你掌握如何高效地使用 Scrapy 完成实际的数据抓取任务。

Scrapy 不仅是一个强大的爬虫框架,它还提供了灵活的 API 和工具,使得我们能够轻松处理各种复杂的网页抓取场景。本篇文章将通过实例讲解 Scrapy 的基本应用,帮助你熟练掌握它的核心功能,为你后续的爬虫开发打下坚实的基础。

在本篇文章中,我们将会学习到:

  1. Scrapy 爬虫的基本使用:如何编写一个简单的爬虫,并启动抓取任务。
  2. 定义 Scrapy 项目中的 Item 和 Pipeline:帮助你结构化抓取的数据,并将其存储到指定的格式中。
  3. 使用 Scrapy 处理请求和响应:如何有效地发起请求、获取响应,并解析网页内容。
  4. 模拟常见的爬虫需求:如处理分页、提取数据、模拟用户行为等。

通过这篇文章的学习,你将能够熟练掌握 Scrapy 的基础操作,快速开始使用 Scrapy 进行高效的数据抓取工作。如果你还在为如何使用 Scrapy 搭建有效的爬虫而困惑,那么今天的内容将为你提供清晰的解决方案。

🚀一、Scrapy 的基本应用

🔎1.创建Scrapy项目

  1. 项目创建步骤

    • 在任意路径下创建保存项目的文件夹(如 F:\PycharmProjects)。
    • 在文件夹内打开命令行窗口,输入命令:
      scrapy startproject scrapyDemo
      
  2. 项目目录结构
    使用PyCharm打开项目后,目录结构如下:
    image.png

🔎2.创建爬虫

  1. 爬虫文件要求

    • 文件需放置在 spiders 文件夹中。
    • 爬虫类需继承 scrapy.Spider,并实现以下核心方法:
      • start_requests():初始化网络请求。
      • parse():解析响应结果。
  2. Scrapy.Spider类属性与方法

    属性/方法 说明
    name 爬虫唯一标识,建议使用网站名称。
    allowed_domains 允许爬取的域名列表(需启用OffsiteMiddleware)。
    start_urls 初始URL列表,未指定特定URL时默认从此列表爬取。
    custom_settings 覆盖全局配置的字典(需在类中定义)。
    start_requests() 生成网络请求,默认使用start_urls发起GET请求,可重写为POST请求。
    parse() 默认响应处理方法,返回包含RequestItem的可迭代对象。
    closed() 爬虫关闭时调用,用于资源释放或收尾操作。
  3. 示例代码
    爬取网页并保存HTML文件

    import scrapy
    
    class QuotesSpider(scrapy.Spider):
        name = "quotes"
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/'
        ]
    
        def start_requests(self):
            for url in self.urls:
                yield scrapy.Request(url=url, callback=self.parse)
    
        def parse(self, response):
            page = response.url.split("/")[-2]
            filename = f'quotes-{page}.html'
            with open(filename, 'wb') as f:
                f.write(response.body)
            self.log(f'Saved file {filename}')
    

    运行命令:

    scrapy crawl quotes
    

image.png

  1. POST请求实现

    import scrapy
    import json
    
    class QuotesSpider(scrapy.Spider):
        name = "quotes"
        data = {'1': '能力是有限的,而努力是无限的。', '2': '星光不问赶路人,时光不负有心人。'}
    
        def start_requests(self):
             # return [scrapy.FormRequest(
             #     url='http://httpbin.org/post',
             #     formdata=self.data,
             #     callback=self.parse
             # )]
            yield scrapy.FormRequest(
                url='http://httpbin.org/post',
                formdata=self.data,
                callback=self.parse
            )
    
        def parse(self, response):
            response_dict = json.loads(response.text)
            print(response_dict)
    
  2. 程序内启动爬虫

    from scrapy.crawler import CrawlerProcess
    from scrapy.utils.project import get_project_settings
    
    if __name__ == '__main__':
        process = CrawlerProcess(get_project_settings())
        process.crawl('quotes')
        process.start()
    

🔎3.获取数据

  1. CSS选择器

    # 提取<title>标签内容
    response.css('title::text').extract_first()  # 返回第一个匹配结果
    response.css('title::text')[0].extract()  # 返回第一个匹配结果
    
  2. XPath选择器

    # 提取<title>标签内容
    response.xpath('//title/text()').extract_first()
    

    案例分析:

    import scrapy  # 导入框架
    import twisted
    
    
    class QuotesSpider(scrapy.Spider):
        name = "quotes"  # 定义爬虫名称
    
        def start_requests(self):
            # 设置爬取目标的地址
            urls = [
                'http://quotes.toscrape.com/page/1/',
                'http://quotes.toscrape.com/page/2/',
            ]
            # 获取所有地址,有几个地址发送几次请求
            for url in urls:
                # 发送网络请求
                yield scrapy.Request(url=url, callback=self.parse)
    
        # 响应信息
        def parse(self, response):
            # 获取所有信息
            for quote in response.xpath(".//*[@class='quote']"):
                # 获取名人名言文字信息
                text = quote.xpath(".//*[@class='text']/text()").extract_first()
                # 获取作者
                author = quote.xpath(".//*[@class='author']/text()").extract_first()
                # 获取标签
                tags = quote.xpath(".//*[@class='tag']/text()").extract()
                # 以字典形式输出信息
                print(dict(text=text, author=author, tags=tags))
    
    
    # 导入CrawlerProcess类
    from scrapy.crawler import CrawlerProcess
    # 导入获取项目设置信息
    from scrapy.utils.project import get_project_settings
    
    
    # 程序入口
    if __name__=='__main__':
        # 创建CrawlerProcess类对象并传入项目设置信息参数
        process = CrawlerProcess(get_project_settings())
        # 设置需要启动的爬虫名称
        process.crawl('quotes')
        # 启动爬虫
        process.start()
    

    image.png

  3. 翻页提取

import scrapy  # 导入框架
import twisted


class QuotesSpider(scrapy.Spider):
    name = "quotes"  # 定义爬虫名称

    def start_requests(self):
        # 设置爬取目标的地址
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        # 获取所有地址,有几个地址发送几次请求
        for url in urls:
            # 发送网络请求
            yield scrapy.Request(url=url, callback=self.parse)

    # 响应信息
    def parse(self, response):
        # div.quote
        # 获取所有信息
        for quote in response.xpath(".//*[@class='quote']"):
            # 获取作者
            author = quote.xpath(".//*[@class='author']/text()").extract_first()
            print(author)  # 输出作者名称

        # 实现翻页
        for href in response.css('li.next a::attr(href)'):
            yield response.follow(href, self.parse)


# 导入CrawlerProcess类
from scrapy.crawler import CrawlerProcess
# 导入获取项目设置信息
from scrapy.utils.project import get_project_settings


# 程序入口
if __name__=='__main__':
    # 创建CrawlerProcess类对象并传入项目设置信息参数
    process = CrawlerProcess(get_project_settings())
    # 设置需要启动的爬虫名称
    process.crawl('quotes')
    # 启动爬虫
    process.start()

image.png

  1. 结构化数据

    items.py定义:

    import scrapy
    
    class ScrapydemoItem(scrapy.Item):
        text = scrapy.Field()
        author = scrapy.Field()
        tags = scrapy.Field()
    

    爬虫代码:

    import scrapy  # 导入框架
    from scrapyDemo.items import ScrapydemoItem # 导入ScrapydemoItem类
    
    
    class QuotesSpider(scrapy.Spider):
        name = "quotes"  # 定义爬虫名称
    
        def start_requests(self):
            # 设置爬取目标的地址
            urls = [
                'http://quotes.toscrape.com/page/1/',
                'http://quotes.toscrape.com/page/2/',
            ]
            # 获取所有地址,有几个地址发送几次请求
            for url in urls:
                # 发送网络请求
                yield scrapy.Request(url=url, callback=self.parse)
    
        # 响应信息
        def parse(self, response):
            # 获取所有信息
            for quote in response.xpath(".//*[@class='quote']"):
                # 获取名人名言文字信息
                text = quote.xpath(".//*[@class='text']/text()").extract_first()
                # 获取作者
                author = quote.xpath(".//*[@class='author']/text()").extract_first()
                # 获取标签
                tags = quote.xpath(".//*[@class='tag']/text()").extract()
                # 创建Item对象
                item = ScrapydemoItem(text=text, author=author, tags=tags)
                yield item  # 输出信息
    
    
    # 导入CrawlerProcess类
    from scrapy.crawler import CrawlerProcess
    # 导入获取项目设置信息
    from scrapy.utils.project import get_project_settings
    
    
    # 程序入口
    if __name__=='__main__':
        # 创建CrawlerProcess类对象并传入项目设置信息参数
        process = CrawlerProcess(get_project_settings())
        # 设置需要启动的爬虫名称
        process.crawl('quotes')
        # 启动爬虫
        process.start()
    

🔎4.数据保存为多种格式

  1. 命令行保存

    scrapy crawl quotes -o test.json    # JSON格式
    scrapy crawl quotes -o test.csv     # CSV格式
    scrapy crawl quotes -o test.xml     # XML格式
    
  2. 代码内保存

    from scrapy import cmdline
    cmdline.execute('scrapy crawl quotes -o test.json'.split())
    

注意事项

  • 若运行时报错 SyntaxError: invalid syntax,需修改 Python37\Lib\site-packages\twisted\conch\manhole.py 中的 async 为其他名称(如 async_)。
  • 使用正则表达式提取数据时,可通过 response.xpath().re() 调用。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。