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 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代理池

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Opencv_2_ 图像色彩空间转换

ColorInvert.h 内容如下&#xff1a; #pragma once #include <opencv.hpp> using namespace std; #include <opencv.hpp> using namespace cv; using namespace std; class ColorInvert{ public : void colorSpaceInvert(Mat&image); }; ColorInvert.cpp…

构建云原生湖仓:Apache Iceberg与Amoro的结合实践

随着大数据技术的快速发展&#xff0c;企业对数据的处理和分析需求日益增长。传统的数据仓库已逐渐无法满足现代业务对数据多样性和实时性的要求&#xff0c;这促使了数据湖和数据仓库的融合&#xff0c;即湖仓一体架构的诞生。在云原生技术的推动下&#xff0c;构建云原生湖仓…

数据库服务类--Redis--未授权访问终端Getshell

免责声明:本文仅做技术交流与学习. 目录 前提条件: windows上开启redis服务: Linux上创建&开启redis服务: 操作: 1-连接靶机redis 2-写入webshell 3-访问后门 redis--->webshell Redis未授权访问漏洞复现与利用 - 知乎 (zhihu.com) 前提条件: 端口开放(6379) 目录…

[LeetCode]—— 226——翻转二叉树

1.题目 . - 力扣&#xff08;LeetCode&#xff09; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a…

标题Selenium IDE 常见错误笔记

Selenium IDE 常见错误笔记 错误1&#xff1a;Failed:Exceeded waiting time for new window to appear 2000ms 这个错误通常出现在第一次运行时&#xff0c;有两个原因&#xff1a; Firefox阻止了弹出式窗口&#xff0c;在浏览器设置里允许这个操作即可。 有些网站设置了反…

modelsim波形高度异常,值为X

一、问题 波形高度异常&#xff0c;忽高忽低&#xff0c;正常波形高电平和低电平是统一高度的 timescale 1ns/1nsmodule key_test_tb();//parameter define parameter CLK_PERIOD 20; parameter CNT_MAX 25d25; //仅用于仿真,对应 500nsreg sys_clk; //周期 20ns reg d; wir…

Spark 中的分桶分化

Spark 中的分桶分化 Bucketing是 Spark 和 Hive 中用于优化任务性能的一种技术。在分桶桶&#xff08;集群列&#xff09;中确定数据分区并防止数据混洗。根据一个或多个分桶列的值&#xff0c;将数据分配给预定义数量的桶。 分桶有两个主要好处&#xff1a; 改进的查询性能&…

【存储】cosbench对象存储测试工具

目录 简略说明 原理 用法 详细说明 简介 用法 一 安装 二 简单验证 三 编写配置文件 四 提交配置文件下IO 五 测试结果查看 结果概览 查看详情 每秒钟的io情况查看 工作负载配置 参数配置&#xff08;controller和driver&#xff09; 查看错误的方法和错误记录 查看错误的方法 …

[BT]BUUCTF刷题第20天(4.22)

第20天 Web [GWCTF 2019]我有一个数据库 打开网站发现乱码信息&#xff08;查看其他题解发现显示的是&#xff1a;我有一个数据库&#xff0c;但里面什么也没有~ 不信你找&#xff09; 但也不是明显信息&#xff0c;通过dirsearch扫描得到robots.txt&#xff0c;然后在里面得…

123.Mit6.S081-实验1-Xv6 and Unix utilities

今天我们来进行Mit6.S081实验一的内容。 实验任务 一、启动xv6(难度&#xff1a;Easy) 获取实验室的xv6源代码并切换到util分支。 $ git clone git://g.csail.mit.edu/xv6-labs-2020 Cloning into xv6-labs-2020... ... $ cd xv6-labs-2020 $ git checkout util Branch util …

xshell的基本命令

1. 创建虚拟环境: conda create -n 虚拟环境名称 python3.7 2. 激活进入虚拟环境 conda activate 虚拟环境名称 3. 退出虚拟环境 conda deactivate 4. 查看所有虚拟环境 conda env list 5. 卸载环境 conda remove -n 虚拟环境名称 --all 6. 执行py文件: python3.py文…

微软刚开源就删库的WizardLM-2:MT-Bench 榜单评测超越GPT-4,7B追平Qwen1.5-32B

前言 微软最近发布的WizardLM-2大型语言模型因其先进的技术规格和短暂的开源后突然撤回&#xff0c;引起了科技界的广泛关注。WizardLM-2包括三个不同规模的模型&#xff0c;分别是8x22B、70B和7B&#xff0c;均展现了在多语言处理、复杂对话、推理和代理任务上的卓越能力。 H…

如何用PHP语言实现远程语音播报

如何用PHP语言实现远程语音播报呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现语音播报。通过发送文本信息&#xff0c;来实现远程语音播报、语音提醒、语音警报等。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称1…

IDEA代码重构

重构 重构的目的&#xff1a; 提高代码的可读性、可维护性、可扩展性和性能。 重命名元素 重命名类 当我们进行重命名操作的时候可以看到第六行存在一个R(rename)&#xff0c;点击后就会弹出所偶有引用&#xff0c;这样可以避免我们在修改后存在遗漏引用处未修改。 我们可以通过…

操作系统安全:Windows与Linux的安全标识符,身份鉴别和访问控制

「作者简介」&#xff1a;2022年北京冬奥会中国代表队&#xff0c;CSDN Top100&#xff0c;学习更多干货&#xff0c;请关注专栏《网络安全自学教程》 操作系统有4个安全目标&#xff0c;也就是说想要保证操作系统的安全&#xff0c;就必须实现这4个需求&#xff1a; 标识系统…

YoloV9改进策略:下采样改进|自研下采样模块(独家改进)|疯狂涨点|附结构图

文章目录 摘要自研下采样模块及其变种第一种改进方法 YoloV9官方测试结果改进方法测试结果总结 摘要 本文介绍我自研的下采样模块。本次改进的下采样模块是一种通用的改进方法&#xff0c;你可以用分类任务的主干网络中&#xff0c;也可以用在分割和超分的任务中。已经有粉丝用…

单细胞+RIP-seq项目文章| Cell ReportshnRNPU蛋白在小鼠精原干细胞池建立的关键作用

精原干细胞&#xff08;SSCs&#xff09;是负责精子发生的干细胞&#xff0c;具有自我更新和分化产生功能性精子的能力。SSCs的持续再生对于维持雄性生育力至关重要。然而&#xff0c;SSC池的发育起源尚不清楚。在哺乳动物中&#xff0c;SSCs源自名为 prospermatogonia&#xf…

端口被占用的解决方案汇总

端口被占用的解决方案汇总 【一】windows系统端口被占用【二】Linux系统端口被占用【三】Linux的ps命令查找&#xff08;1&#xff09;ps命令常用的方式有三种&#xff08;2&#xff09;ps -ef |grep 8080 【一】windows系统端口被占用 &#xff08;1&#xff09;键盘上按住Wi…

Ubuntu-18.04本地化部署Rustdesk服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、配置防火墙二、安装三大件1.下载三大件2.安装三大件 三、安装客户端1.下载客户端1.Windows2.Linux 四、配置客户端连接服务器五、总结 前言 如果你是想数据…

JS-47-Node.js06-fs模块-读写文件

Node.js内置的fs模块就是文件系统模块&#xff0c;负责读写文件。 和所有其它JavaScript模块不同的是&#xff0c;fs模块同时提供了异步和同步的方法。 一、回顾&#xff1a;异步方法VS同步方法 1-1、异步方法 因为JavaScript的单线程模型&#xff0c;执行IO操作时&#xff…