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

news2024/11/27 12:59:39

文章目录

  • 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 scrapy

class 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 scrapy

from ..items import DoubanTop250Item

class 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 logging

logger = logging.getLogger(__name__)

class DoubanTop250DownloaderMiddleware(object):
    """
    随机选择代理 IP 并将其添加到请求的 meta 中
    """
    def __init__(self, proxies):
        self.proxies = proxies

    @classmethod
    def from_crawler(cls, crawler):
        if not crawler.settings.getbool('PROXY_ENABLED'):
            raise NotConfigured
        proxies = 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.coloradmin.cn/o/1625539.html

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

相关文章

快速入门Web开发(中)后端开发(有重点)

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 CSDN 图片导入做的不是很好,因此如果有没有…

Oracle 数据迁移同步优化(三)

简述 CloudCanal 最近再次对其 Oracle 源端数据同步进行了一系列优化,这些优化基于用户在真实场景中的反馈,具备很强的生产级别参考意义。 本文将简要介绍这些优化项,希望带给读者一些收获。 增量事件 SCN 乱序问题MISSING_SCN 事件干扰新…

信息系统项目管理师0069:数据运维(5信息系统工程—5.2数据工程—5.2.3数据运维)

点击查看专栏目录 文章目录 5.2.3数据运维1.数据存储2.数据备份3.数据容灾4.数据质量评价与控制记忆要点总结5.2.3数据运维 数据开发利用的前提是通过合适的方式将数据保存到存储介质上,并能保证有效的访问,还要通过数据备份和容灾手段,保证数据的高可用性。数据质量管理是在…

让直播和视频通话更精彩的实时换脸神器: 亲妈都未必认识

DeepFacelive:让直播和视频通话更精彩的实时换脸神器! 你是否想在直播或视频通话时,给观众带来惊喜和欢乐?你是否想尝试一下换脸的乐趣,展现出不同的自己?如果你的答案是肯定的,那么你一定不能错…

什么是云手机?云手机有什么用?

过去,我们手中的手机是我们生活、工作、娱乐的得力助手,但随着时代的变迁和技术的发展,我们需要的不仅仅是一部手机,而是一个更强大、更灵活的工具。在这个时候,云手机横空出世,成为了我们手机使用的新选择…

性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法

文章目录 一、前言二、加密接口1、什么是SM22、被测接口加密逻辑 三、准备工作四、JMeter 扩展实现步骤1:准备开发环境步骤2:了解实现方法步骤3:runTest 方法步骤4:getDefaultParameters 方法步骤5:setupTest 方法 五、…

MATLAB 向量

MATLAB 向量 向量是一维数字数组。MATLAB允许创建两种类型的向量 行向量 列向量 行向量 行向量通过将元素集括在方括号中并使用空格或逗号定界元素来创建。 示例 r [7 8 9 10 11] MATLAB将执行上述语句并返回以下结果- r 7 8 9 10 11 列向量 列向量 通过将元素集括在方…

GPU深度学习环境搭建:Win10+CUDA 11.7+Pytorch1.13.1+Anaconda3+python3.10.9

1. 查看显卡驱动及对应cuda版本关系 1.1 显卡驱动和cuda版本信息查看方法 在命令行中输入【nvidia-smi】可以当前显卡驱动版本和cuda版本。 根据显示,显卡驱动版本为:Driver Version: 516.59,CUDA 的版本为:CUDA Version 11.7。 此处我们可以根据下面的表1 显卡驱动和c…

Android Studio实现内容丰富的安卓校园超市

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 项目代号168 1.开发环境 后端用springboot框架,安卓的用android studio开发 android stuido3.6 jdk1.8 idea mysql tomcat 2.功能介绍 安卓端: 1.注册…

# 从浅入深 学习 SpringCloud 微服务架构(六)Feign(2)

从浅入深 学习 SpringCloud 微服务架构(六)Feign(2) 一、feign 的配置: 1、从 Spring Cloud Edgware 开始,Feign 支持使用属性自定义 Feign。 对于一个指定名称的 FeignClient(例如该 Feign …

迅雷不限速破解方法

背景:现在迅雷和百度云的下载速度真的太恶心了,所以总有大佬可以采用厉害的方法进行破解,在网上看了一圈,很多都是骗人或者是无效的,找了一个靠谱的方法,亲测速度能达到10M以上,非常给力。 以下…

linux部署nacos

1.预备环境准备 Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用: 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。64 bit JDK …

私有化部署 Llama3 大模型, 支持 API 访问

私有化部署 Llama3 大模型, 支持 API 访问 视频 https://www.bilibili.com/video/BV1wD421n75p/ 前言 原文 https://ducafecat.com/blog/llama3-model-api-local 通过 ollama 本地运行 Llama3 大模型其实对我们开发来说很有意义,你可以私有化放服务上了。 然后通…

五、yolov8 tensorRT c++部署及接口封装(保姆级教程附源码)

采用 CTensorRT来部署深度学习模型有以下几个优点: 高性能推理:TensorRT是一个高性能的深度学习推理(Inference)优化器,专门为NVIDIA GPU硬件平台设计,能够提供低延迟、高吞吐量的模型推理性能。这意味着在…

12 c++版本的坦克大战

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

深度学习基础之《TensorFlow框架(13)—二进制数据》

一、CIFAR-10二进制数据集介绍 1、CIFAR-10数据集 CIFAR-10数据集由10个类别的60000个32x32彩色图像组成&#xff0c;每个类别有6000个图像。有50000个训练图像和10000个测试图像 2、数据集分为五个训练批次和一个测试批次&#xff0c;每个批次有10000个图像 3、data_batch_…

强化SSH服务安全的最佳实践

SSH&#xff08;Secure Shell&#xff09;作为一种广泛应用于Linux和其他类Unix系统中的强大工具&#xff0c;为管理员提供了安全的远程登录和命令执行功能。在现今高度互联的网络环境中&#xff0c;确保SSH服务的安全性显得尤为重要。本文将详细阐述一系列SSH服务的最佳实践&a…

探索文本向量化的新高峰:合合信息acge_text_embedding 模型

前言 文本向量化是将文本数据转换为数值向量的过程。由于计算机只能处理数值数据&#xff0c;文本数据需要被转换成数值形式才能被算法和模型处理。这种向量化的过程使得文本数据能够被机器学习、深度学习等算法有效地处理。文本向量化的方法有多种&#xff0c;其中常见的有以…

输入influx但是无法进入influxdb

问题描述&#xff1a; 博主想通过DockerJmeterInfluxDBGrafana搭建性能测试可视化平台&#xff0c;但是按照别的教程输入influx却无法进入inluxdb&#xff0c;输入输出如下&#xff1a; NAME:influx - Influx ClientUSAGE:influx [command]HINT: If you are looking for the I…

多种方法论的融合,可以把FMEA做得更好——FMEA软件

免费试用FMEA软件-免费版-SunFMEA FMEA&#xff0c;即故障模式与影响分析&#xff0c;是一种预防性质量工具&#xff0c;用于识别产品或过程中潜在的故障模式&#xff0c;评估其对系统的影响&#xff0c;并优先处理那些可能导致严重后果的故障。在实际应用中&#xff0c;单一的…