Scrapy爬虫框架入门(豆瓣电影Top 250)

文章目录

  • Scrapy 官网
  • Scrapy 文档
  • Github
  • Scrapy 简介
  • 项目结构
  • 爬虫实现
    • XPath 教程
    • 创建 Scrapy 项目
    • 配置用户代理
    • 网页 dom 元素
  • IP 代理池
    • IP代理池作用
    • 配置IP代理池
    • 申请IP代理池

Scrapy 官网

  • https://scrapy.org/

Scrapy 文档

  • https://docs.scrapy.org/en/latest/

Github

  • https://github.com/scrapy/scrapy/

Scrapy 简介

Scrapy 是一个强大的 Python 网络爬虫框架,用于从网站上抓取数据并进行处理。它提供了一套高效的工具和机制,让开发者能够轻松地创建、管理和扩展爬虫程序。

  • 基于异步的框架: Scrapy 使用 Twisted 库作为其底层网络引擎,利用异步的方式实现了高效的网络请求和数据处理,能够同时处理多个请求,提高了爬取效率。

  • 选择器: Scrapy 提供了类似于 jQuery 的 CSS 选择器和 XPath 选择器,使得开发者能够方便地从 HTML 页面中提取所需的数据。

  • 管道(Pipeline): Scrapy 的管道机制允许你定义一系列的操作来处理从网页中提取的数据,比如清洗、验证、存储到数据库等。

  • 中间件(Middleware): 中间件可以在请求和响应的处理过程中进行拦截和处理,提供了灵活的扩展和定制能力。

  • 扩展性: Scrapy 提供了丰富的扩展接口,可以方便地添加自定义的功能和插件,满足不同场景的需求。

  • 自动限速: Scrapy 自带了自动限速功能,可以避免对目标网站造成过大的压力,遵守网站的爬取规则。

  • 内置调度器和去重: Scrapy 内置了调度器和去重器,能够有效地管理爬取过程中的请求队列和已经爬取的页面,确保数据的完整性和避免重复爬取。

项目结构

  • scrapy.cfg: 这是 Scrapy 项目的配置文件,用于指定项目的设置和配置信息,比如项目名称、爬虫模块等。它是一个INI格式的文本文件。

  • items.py: 这个文件定义了项目中用到的数据模型(Item)。数据模型用于定义要从网页中提取的字段,以及它们的类型和处理方式。它通常是一个类,继承自 Scrapy 的 Item 类。

  • middlewares.py: 这个文件定义了项目中使用的中间件。中间件是在 Scrapy 请求和响应处理过程中拦截和处理的组件,用于修改请求或响应,实现自定义的功能。例如,可以在中间件中添加代理、设置 User-Agent 等。

  • pipelines.py: 这个文件定义了项目中使用的管道(Pipeline)。管道用于处理从爬虫中提取的数据,可以执行一系列的操作,比如数据清洗、验证、存储到数据库等。它通常是一个类,继承自 Scrapy 的 Pipeline 类。

  • settings.py: 这个文件包含了项目的设置和配置信息,比如爬虫的 User-Agent、下载延迟、管道设置等。你可以在这里修改 Scrapy 的默认配置,以适应你的项目需求。

    • USER_AGENT:设置用户代理字符串,用于模拟不同浏览器或设备发送请求。
    • ROBOTSTXT_OBEY:设置是否遵守 robots.txt 规则。robots.txt 是一个文件,指示爬虫应该访问哪些页面。
    • CONCURRENT_REQUESTS 和 CONCURRENT_REQUESTS_PER_DOMAIN:CONCURRENT_REQUESTS 设置同时发送的请求数量,而 CONCURRENT_REQUESTS_PER_DOMAIN 则限制对单个域名发送的并发请求数量。
    • DOWNLOAD_DELAY:设置下载延迟,即发送两个请求之间的等待时间,以防止过于频繁地请求网站。
    • COOKIES_ENABLED:设置是否启用 Cookies,用于保持登录状态或在网站间共享信息。
    • ITEM_PIPELINES:设置数据管道的组件,用于处理爬取到的数据,如存储到数据库、写入文件等。
    • AUTOTHROTTLE_ENABLED 和 AUTOTHROTTLE_START_DELAY:AUTOTHROTTLE_ENABLED 开启自动限速功能,AUTOTHROTTLE_START_DELAY 设置初始下载延迟。
  • spiders/: 这个目录包含了项目中的爬虫模块。每个爬虫通常是一个单独的 Python 文件,用于定义爬取规则、处理响应和提取数据。你可以在这里创建和管理多个爬虫。

  • init.py: 这个文件是 Python 包的初始化文件,用于标识该目录是一个 Python 包。

爬虫实现

免责声明: 本示例仅供技术交流学习,请遵守爬虫相关法律法规。

XPath 教程

  • https://www.runoob.com/xpath/xpath-tutorial.html

XPath(XML Path Language)是一种用于在 XML 文档中定位节点的语言。它提供了一种简洁而强大的方式来选择 XML 文档中的特定部分,从而使得数据提取和文档导航变得更加容易和灵活。XPath 在 XML 文档中的应用非常广泛,同时也可以用于 HTML 文档的解析。

创建 Scrapy 项目

# 安装 Scrapy 库
pip3 install scrapy
# 创建 Scrapy 项目
scrapy startproject douban_top250
# 进入项目目录
cd douban_top250
# 创建 douban_movies.py 爬虫
scrapy genspider douban_movies movie.douban.com

在这里插入图片描述

配置用户代理

  • https://movie.douban.com/top250

在这里插入图片描述
在这里插入图片描述

网页 dom 元素

在这里插入图片描述

  • 编辑生成的 douban_top250/items.py
import scrapyclass DoubanTop250Item(scrapy.Item):rank = scrapy.Field()pic = scrapy.Field()title = scrapy.Field()rating = scrapy.Field()link = scrapy.Field()
  • 编辑生成的 douban_top250/spiders/douban_movies.py
import scrapyfrom ..items import DoubanTop250Itemclass DoubanMoviesSpider(scrapy.Spider):name = "douban_movies"allowed_domains = ["movie.douban.com"]start_urls = ["https://movie.douban.com/top250"]def parse(self, response):# 解析电影列表movies = response.xpath('//ol[@class="grid_view"]/li')for movie in movies:item = DoubanTop250Item()item['rank'] = movie.xpath('.//div[@class="pic"]/em/text()').get()item['pic'] = movie.xpath('.//div[@class="pic"]/a/img/@src').get()item['title'] = movie.xpath('.//div[@class="hd"]/a/span/text()').get()item['rating'] = movie.xpath('.//div[@class="star"]/span[2]/text()').get()item['link'] = movie.xpath('.//div[@class="hd"]/a/@href').get()yield item# 获取下一页的链接next_url = response.xpath('//span[@class="next"]/a/@href').extract()if next_url:next_url = 'https://movie.douban.com/top250' + next_url[0]yield scrapy.Request(next_url)
  • 运行爬虫并将结果保存到文件
# 输出到 douban_movies.csv 文件
scrapy crawl douban_movies -o douban_movies.csv
# 输出到 douban_movies.csv 文件,日志输出到 douban_movies.log 文件
scrapy crawl douban_movies -o douban_movies.csv -s LOG_FILE=douban_movies.log
# 输出到 douban_movies.jsonl 文件
scrapy crawl douban_movies -o douban_movies.jsonl
  • douban_movies.csv

在这里插入图片描述

注意: 为了避免被封禁或者影响网站性能,建议设置合理的下载延迟和 User-Agent,并遵守网站的爬取规则。

IP 代理池

IP代理池作用

  1. 隐私保护:代理IP池可以隐藏用户的真实IP地址,确保用户在互联网上的匿名性。这对于一些需要保护个人隐私的用户或组织来说尤为重要。

  2. 访问限制:代理IP池可以模拟不同的IP地址,使用户可以绕过一些地理位置或访问限制。例如,在某些地区限制访问的情况下,通过代理IP池可以实现对被封锁内容的访问。

  3. 反爬虫:代理IP池可以防止网站对爬虫的屏蔽和限制。通过轮换使用不同的代理IP,可以规避被识别为爬虫的风险,确保爬取数据的稳定性和持续性。

配置IP代理池

  • 编辑生成的 douban_top250/settings.py
# 暂时不使用IP代理池,请将值设置为 False
PROXY_ENABLED = True# 设置代理 IP 池
PROXIES = ['http://19.89.12.8','http://19.89.12.9',# 添加更多代理 IP
]# 启用随机代理IP中间件
DOWNLOADER_MIDDLEWARES = {"douban_top250.middlewares.DoubanTop250DownloaderMiddleware": 543,
}
  • 编辑生成的 douban_top250/middlewares.py
import random
from scrapy.exceptions import NotConfigured
import logginglogger = logging.getLogger(__name__)class DoubanTop250DownloaderMiddleware(object):"""随机选择代理 IP 并将其添加到请求的 meta 中"""def __init__(self, proxies):self.proxies = proxies@classmethoddef from_crawler(cls, crawler):if not crawler.settings.getbool('PROXY_ENABLED'):raise NotConfiguredproxies = crawler.settings.getlist('PROXIES')logger.info("proxys: %s", proxies)return cls(proxies)def process_request(self, request, spider):# 从代理 IP 池中随机选择一个代理 IP 并添加到请求的 meta 中proxie = random.choice(self.proxies)logger.info("proxy: %s", proxie)request.meta['proxy'] = proxie

申请IP代理池

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在windows上安装MySQL数据库全过程

1.首先在MySQL的官网找到其安装包 在下图中点击MySQL Community(gpl) 找到MySQL Community Server 选择版本进行安装包的下载 2.安装包(Windows (x86, 64-bit), MSI Installer)安装步骤 继续点击下一步 继续进行下一步,直到出现此界面&#…

Vue3+vite优化基础架构(1)--- 使用unplugin-vue-components

Vue3vite优化基础架构(1)--- 使用unplugin-vue-components 说明安装unplugin-vue-componentsvite.config.js中使用unplugin-vue-components/vite 说明 这里记录下自己在Vue3vite的项目使用unplugin-vue-components/vite来自定义组件自动全局引入svg雪碧…

【八股】Spring Boot

SpringBoot是如何实现自动装配的? 首先,SpringBoot的核心注解SpringBootApplication里面包含了三个注解,SpringBootConfigurationEnableAutoConfigurationComponentScan,其中EnableAutoConfiguration是实现自动装配的注解&#x…

用自然语言连接系统的认知,用Function Calling 连接大模型和业务

前言 本篇文章,我们重点介绍Function Calling的机制和应用,在其原理上,也讲解了为什么会有plugin、GPTs出现等等。 核心要点: 1.大模型应用的一切,是自然语言连接系统的认知 2.在Function Calling的应用中&#xff0…

重要文件怕丢失怎么办?汇帮数据备份软件帮你解决文件丢失的烦恼 帮你实现文件实时备份的好方法

随着数字时代的来临,电脑文件已成为我们日常生活和工作中不可或缺的一部分。然而,无论是个人用户还是企业用户,都可能面临数据丢失的风险,如硬盘故障、病毒攻击、误删除等。为了确保数据安全,实现电脑文件的实时备份变…

等保合规:保护企业网络安全的必要性与优势

前言 无论是多部网络安全法律法规的出台,还是最近的“滴滴被安全审查”事件,我们听得最多的一个词,就是“等保。” 只要你接触安全类工作,听得最多的一个词,一定是“等保。” 那么,到底什么是“等保”呢…

Redis网络相关的结构体 和 reactor模式

目录 1. epoll的封装 结构体aeApiStae 创建epoll fd的封装 epoll_ctl的封装 epoll_wait的封装 2. 结构体aeFileEvent、aeFiredEvent、aeTimeEvent 结构体aeFileEvent 结构体aeFiredEvent 结构体aeTimeEvent 3. struct aeEventLoop aeEventLoop相关的函数 1. 创建eve…

Rust HTTP 客户端:易于使用、功能强大 | 开源日报 No.228

seanmonstar/reqwest Stars: 8.9k License: Apache-2.0 reqwest 是一个易于使用且功能强大的 Rust HTTP 客户端。 异步和阻塞客户端支持普通数据、JSON、urlencoded 和 multipart 数据格式可定制的重定向策略支持 HTTP 代理和系统原生 TLS 或 rustls 的 HTTPSCookie 存储功能…

JVM学习笔记(五)内存模型

目录 1、原子性 1.1 问题分析 1.2 解决方法 2、可见性 2.1 退不出的循环 2.2 解决办法 3、有序性 3.1 诡异的结果 3.2 解决办法 3.3 有序性理解 3.4 happens-before 4、CAS与原子类 4.1 CAS 4.2 乐观锁与悲观锁 4.3 原子操作类 5、synchronized 优化 5.1 轻量…

17(第十六章,数据管理组织与角色期望)

目录 概述 基本概念 首席数据官 个人角色 执行官角色 业务角色 IT角色 混合角色 组织架构模式 概述 本章书上的重点内容其实不多,了解的地方例如数据管理组织的结构包括分散、网络、混合、联邦、集中等运营模式。 之前也提过的RACI(谁负责&am…

AWTK MODBUS Client channel 模型

名称:modbus_client_channel 功能:通过 modbus 协议访问远程 slave 设备上的数据,需要配合 modbus_client模型一起使用。用于将 modbus client 中的 channel 包装成view_model或者view_model_array 一般来说不需要,直接使用modbus…

CentOS 系统的优缺点

CentOS (社区企业操作系统的缩写)是一个基于红帽企业 Linux (RHEL)的免费开源发行版, 旨在为服务器和工作站提供稳定、可靠和安全的平台。 不应将其与CentOS Stream 混淆,后者是即将发布的 RHEL 版本的上游开发平台。 CentOS Li…

C++初阶之入门

零、什么是C C是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。 C缺点之一,是相对许多语言复杂,而且难学难精。许多人说学…

一般神经网络的微分与网络参数的初始化

(文章的主要内容来自电科的顾亦奇老师的 Mathematical Foundation of Deep Learning, 有部分个人理解) 一般深度神经网络的微分 上周讨论的前向和反向传播算法可以推广到任意深度神经网络的微分。 对于一般的网络来说,可能无法逐层分割,但仍然可以用流…

抖音小店运营过程中,每天必须要做的7件事情!少一件都不行!

大家好,我是电商小V 最近很多新手小伙伴刚做店,操作抖音小店每天需要做的事情都是哪些呢?感觉自己一天很忙,但是也没有忙出来结果,思绪很乱,关于这个问题咱们今天就来详细的说一下,给你们梳理总…

02 贪吃蛇

前言 呵呵 这是不知道 在哪里看到的 别人做的一个贪吃蛇 因此 也把我 之前的 贪吃蛇 移植上来了 当然 这个不过是为了 简单的入门了解, 呵呵 然后 c版本的贪吃蛇 需要先移植成 c 版本, 然后 再根据 单片机相关 设计调整 比如 led 点阵的输出, 比如 c99 语法的一些不兼容…

12 c++版本的坦克大战

前言 呵呵 这大概是 大学里面的 c 贪吃蛇了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 坦克大战 #include<iostream> #include<windows.h> #include<conio.h> #include<ctime> #include…

Python编程的终极十大工具

Python一直以来都是程序员们的首选编程语言之一&#xff0c;其灵活性和功能强大的库使其成为解决各种问题的理想选择。在本文中&#xff0c;我们将介绍Python编程的终极十大工具&#xff0c;这些工具可以帮助您在各种领域取得成功&#xff0c;无论您是初学者还是经验丰富的开发…

【C++】C++的内存管理

目录 内存分布 动态内存管理 C语言的动态内存管理 C的动态内存管理 对内置类型操作 对自定义类型操作 new[]和delete[] 开空间的细节 探讨匹配问题 定位new表达式 内存分布 栈&#xff1a;存放非静态局部变量&#xff0c;函数参数&#xff0c;返回值等。栈是向下增长…

Vim学习笔记01~04

第01章&#xff1a; 遁入空门&#xff0c;模式当道 1.什么是vim Vim是一个高效的文本编辑工具&#xff0c;并且可以在编程开发过程中发挥越来越重要的作用。 事实上&#xff0c;有不少编程高手使用他们来进行代码的开发&#xff0c;并且对此赞不绝口。 2.本系列目的 但是让…