使用 Scrapy 抓取网页数据

1. Scrapy 简介

Scrapy 是一个流行的 Python 爬虫框架,提供了强大的工具和灵活的扩展机制,用于高效抓取和处理网页数据。它支持异步 I/O,速度快且资源消耗低,非常适合大规模爬取任务。


2. 安装 Scrapy

确保你的 Python 环境版本在 3.7 或以上。

使用 pip 安装:

pip install scrapy

验证安装:

scrapy version


3. 创建 Scrapy 项目

创建一个新的 Scrapy 项目:

scrapy startproject myproject

目录结构:

myproject/scrapy.cfgmyproject/__init__.pyitems.pymiddlewares.pypipelines.pysettings.pyspiders/__init__.py

4. 编写第一个爬虫

进入项目目录并生成爬虫:

scrapy genspider example example.com

生成的文件 spiders/example.py

import scrapyclass ExampleSpider(scrapy.Spider):name = 'example'allowed_domains = ['example.com']start_urls = ['http://example.com']def parse(self, response):self.log('Visited: ' + response.url)

运行爬虫:

scrapy crawl example


5. 提取数据:XPath 与 CSS 选择器

Scrapy 支持 XPath 和 CSS 选择器用于解析 HTML。以下是两种选择器的简单对比:

XPath 示例:

titles = response.xpath('//h1/text()').getall()

CSS 示例:

titles = response.css('h1::text').getall()

常用方法:

  • get(): 获取单个匹配的内容。
  • getall(): 获取所有匹配的内容。
  • extract_first(): 等价于 .get()
  • extract(): 等价于 .getall()

6. 保存数据

Scrapy 支持将数据导出为 JSON、CSV、XML 等格式。

在终端中导出数据:

scrapy crawl example -o output.json

将数据存储到管道: 编辑 pipelines.py 文件:

class MyProjectPipeline:

    def process_item(self, item, spider):

        with open('output.txt', 'a') as f:

            f.write(str(item) + '\n')

        return item

settings.py 中启用管道:

ITEM_PIPELINES = { 'myproject.pipelines.MyProjectPipeline': 300, }


7. 处理动态加载的页面

许多现代网站使用 JavaScript 动态渲染内容,Scrapy 默认无法处理这种情况。可以结合以下工具:

Scrapy-Splash:

  • 安装:

    pip install scrapy-splash

  • 配置: 在 settings.py 中添加:
    SPLASH_URL = 'http://localhost:8050'
    DOWNLOADER_MIDDLEWARES = {'scrapy_splash.SplashCookiesMiddleware': 723,'scrapy_splash.SplashMiddleware': 725,'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    
  • 示例代码:
    from scrapy_splash import SplashRequestclass ExampleSpider(scrapy.Spider):name = 'example'start_urls = ['http://example.com']def start_requests(self):for url in self.start_urls:yield SplashRequest(url, self.parse, args={'wait': 3})def parse(self, response):self.log(response.text)
    

Playwright:

  • 安装:

    pip install scrapy-playwright

  • 示例代码:
    class ExampleSpider(scrapy.Spider):name = 'example'def start_requests(self):yield scrapy.Request(url='http://example.com',meta={'playwright': True})def parse(self, response):self.log(response.text)
    

    8. 反爬策略与解决方法
  • 设置 User-Agent:settings.py 中添加:

    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'

  • 处理 Cookies: Scrapy 支持自动管理 Cookies,也可以手动设置:

    yield scrapy.Request(url, cookies={'key': 'value'})

  • 请求头伪装:

    headers = {

        'User-Agent': 'Your User-Agent',

        'Referer': 'http://example.com'

    }

    yield scrapy.Request(url, headers=headers)

  • 降低爬取速度:

    DOWNLOAD_DELAY = 2


9. 进阶技巧


10. 调试与测试

11. 总结

Scrapy 是一个非常强大的爬虫框架,适合从简单的静态页面到复杂的动态加载内容的抓取需求。通过不断优化爬虫的结构和策略,可以更高效地完成数据采集任务。

  • 多层解析: 如果页面需要多次请求:

    def parse(self, response):links = response.xpath('//a/@href').getall()for link in links:yield response.follow(link, self.parse_detail)def parse_detail(self, response):self.log(response.url)
    

  • 使用代理:

    PROXY = 'http://your_proxy'

    yield scrapy.Request(url, meta={'proxy': PROXY})

  • 分布式爬取: 使用 Scrapy + Redis 实现分布式爬虫。

  • 调试 XPath 或 CSS: 在浏览器开发者工具的 Console 中测试:

    // XPath document.querySelectorAll('h1') // CSS

    $x('//h1/text()')

  • Scrapy Shell: 启动交互式调试:

    scrapy shell 'http://example.com'

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

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

相关文章

如何训练Stable Diffusion 模型

训练Stable Diffusion模型是一个复杂且资源密集的过程,通常需要大量的计算资源(如GPU或TPU)和时间。Stable Diffusion是一种基于扩散模型的生成式AI,能够根据文本提示生成高质量的图像。它的训练过程涉及多个步骤,包括…

Kafka常用集群配置参数

Broker log.dirs 这是非常重要的参数,指定了 Broker 需要使用的若干个文件目录路径。比如/home/kafka1,/home/kafka2,/home/kafka3这样 log.dirs /home/kafka1,/home/kafka2,/home/kafka3如果有条件的话你最好保证这些目录挂载到不同的物理磁盘上。 1、可以提升…

两分钟掌握 TDengine 全部写入方式

1. 背景 TDengine 写入过程会涉及很多概念,这些概念目前你是不是还一团乱,参数绑定写入、无模式写入、websocket 写入、RESTFUL 写入 、各种连接器写入等等一堆的写入,都是做什么的,不明白,这里花两分钟时间给你彻底整…

使用 Docker 在 Ubuntu 下部署 Cloudflared Tunnel 服务器

在现代互联网中,安全和隐私是至关重要的。Cloudflared Tunnel 是 Cloudflare 提供的一种安全隧道解决方案,可以帮助你安全地将本地服务暴露到互联网,而无需暴露你的服务器 IP 地址。通过 Docker 部署 Cloudflared Tunnel,不仅简化…

快速理解24种设计模式

简单工厂模式 建立产品接口类,规定好要实现方法。 建立工厂类,根据传入的参数,实例化所需的类,实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例,并提供一个访问他它的全局…

数据可视化echarts学习笔记

目录,介绍 知识储备 一端操作,多端联动的效果(开启了多个网页,操作一端,多个网页的效果会跟着改变) cmd命令控制面板返回上一级或上上级 在当前目录打开文件: cd 文件名 在Windows命令提示符&am…

OpenCV相机标定与3D重建(30)过滤二值图像中的小斑点函数filterSpeckles()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在视差图中过滤掉小的噪声斑点(speckles)。 cv::filterSpeckles 是 OpenCV 库中的一个函数,用于过滤图像或视…

C语言期末复习笔记(中)

目录 五、选择控制结构 1.算法中的概念及描述方法 2.关系运算符和逻辑表达式 3.条件运算符和条件表达式 4.两种多分支if 5.switch语句 6.逻辑运算符和逻辑表达式 六、循环控制结构 1.控制循环的方式 2.控制非法输入 3.选择三种循环的一般原则 4.猜数游戏 5.嵌套循环…

android jetpack compose Model对象更新变量 UI不更新、不刷新问题

以前是搞老本行Android原生开发的,因为工作原因,一直在用vue小程序;因为一些工作需要,又需要用到Android原生开发,建了个项目,打开源码一看,天塌了!!!我以前的…

Python的Pandas--Series的创建和实现

1.Series函数的格式: pandas.Series(data,index,dtype,name,copy) data:一组数据(ndarray类型、list、dict等类)或标量值 index:数据索引标签。如果不指定,默认为整数,从0开始 dtype&#x…

python通过正则匹配SQL

pattern r"(?:[^;]|(?:\\.|[^])*);" sql_list [match.group().strip() for match in re.finditer(pattern, execute_sql) if match.group().strip()]for sql in sql_list:print(sql)(?:[^;]|(?:\\.|[^])*); 匹配 连续的非分号内容 或 单引号包裹的字符串&#…

利用Gurobi追溯模型不可行原因的四种方案及详细案例

文章目录 1. 引言2. 追溯不可行集的四种方法2.1 通过约束增减进行判断2.2 通过computeIIS函数获得冲突集2.3 利用 feasRelaxS() 或 feasRelax() 函数辅助排查2.4 利用 IIS Force 属性1. 引言 模型不可行是一个让工程师头疼的问题,对于复杂模型而言,导致模型不可行的原因可能…

算法工程化工程师

算法工程化工程师是一种结合算法研究与工程开发能力的技术职位,主要职责是将算法从理论研究到实际落地,应用到各种工业或商业场景中。以下是关于这个职位的一些核心内容: 核心职责: 算法实现与优化: 将数学模型或算法…

MySQL和HBase的对比

Mysql :关系型数据库,主要面向 OLTP ,支持事务,支持二级索引,支持 sql ,支持主从、 Group Replication 架构模型(此处以 Innodb 为例,不涉及别的存储引擎)。 HBase &am…

mybatis-plus自动填充时间的配置类实现

mybatis-plus自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis…

【软件工程】十万字知识点梳理 | 期末复习专用

原创文章,禁止转载。 文章目录 图CRC卡片用例图类图状态图活动图泳道图软件质量因素自顶向下集成自底向上集成人员与工作量之间的关系时序图关键路径软件结构基本路径测试判定表数据流图(DFD)体系结构设计问题数据字典挣值分析等价划分程序流程图PAD | N-S燃尽图甘特图对象模…

STM32完全学习——FLASH上FATFS文件管理系统

一、需要移植的接口 我们通过看官网的手册,可以看到我们只要完成下面函数的实现,就可以完成移植。我们这里只移植前5个函数,获取时间的函数我们不在这里移植。 二、移植接口函数 DSTATUS disk_status (BYTE pdrv /* Physical drive nmuber…

安卓帧率获取

背景 性能优化,经常用到一些指标,诸如帧率、功耗等。对于普通app来讲, 之前一直使用gfxinfo指令获取丢帧率。但是这个指令无法获取游戏的帧率,查阅资料,发现SurfaceFlinger可以获取游戏帧率。 帧率获取原理 获取当前f…

Redis - Token JWT 概念解析及双token实现分布式session存储实战

Token 定义:令牌,访问资源接口(API)时所需要的资源凭证 一、Access Token 定义:访问资源接口(API)时所需要的资源凭证,存储在客户端 组成 组成部分说明uid用户唯一的身份标识time…

软体机器人研究报告:设计方法、材料与驱动、感知与控制

软体机器人因其出色的可变形性和高适应性受到了广泛关注,这些特性使其在医疗、救援、探测等复杂场景中展现出独特的优势和巨大的应用潜力。研究人员对软体机器人的设计方法、材料与驱动技术、感知与控制策略等方面进行深入研究,取得了一系列成果。 本文汇…