当前位置: 首页 > news >正文

使用 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. 进阶技巧
  • 多层解析: 如果页面需要多次请求:

    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 实现分布式爬虫。


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

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

    document.querySelectorAll('h1') // CSS

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

    scrapy shell 'http://example.com'

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'

相关文章:

使用 Scrapy 抓取网页数据

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

C# OpenCV机器视觉:SoftNMS非极大值抑制

嘿,你知道吗?阿强最近可忙啦!他正在处理一个超级棘手的问题呢,就好像在一个混乱的战场里,到处都是乱糟糟的候选框,这些候选框就像一群调皮的小精灵,有的重叠在一起,让阿强头疼不已。…...

kamailio关于via那点事

如果kamailio作为代理服务器,在转到目的路由时 不删除原始的via信息 会造成信息泄露 如果 Kamailio 作为代理服务器(SIP Proxy)在转发 SIP 请求时不删除原始的 Via 信息,这确实可能会造成信息泄露。 📌 为什么不删除 …...

[MFC] 使用控件

介绍如何使用控件,以及如何获取控件中的数值 check Box 添加点击事件,即选中和取消选中触发的事件 第一种方式是按照如下方式第二种方式是直接双击点击进去 void CMFCApplication1Dlg::OnBnClickedCheckSun() {// TODO: 在此添加控件通知处理程序代…...

【探索未来科技】2025年国际学术会议前瞻

【探索未来科技】2025年国际学术会议前瞻 【探索未来科技】2025年国际学术会议前瞻 文章目录 【探索未来科技】2025年国际学术会议前瞻前言1. 第四届电子信息工程、大数据与计算机技术国际学术会议( EIBDCT 2025)代码示例:机器学习中的线性回…...

使用wpa_supplicant和wpa_cli 扫描wifi热点及配网

一:简要说明 交叉编译wpa_supplicant工具后会有wpa_supplicant和wpa_cli两个程序生产,如果知道需要连接的wifi热点及密码的话不需要遍历及查询所有wifi热点的名字及信号强度等信息的话,使用wpa_supplicant即可,否则还需要使用wpa_…...

Sealos的k8s高可用集群搭建

Sealos 介绍](https://sealos.io/zh-Hans/docs/Intro) Sealos 是一个 Go 语言开发的简单干净且轻量的 Kubernetes 集群部署工具,能很好的支持在生产环境中部署高可用的 Kubernetes 集群。 Sealos 特性与优势 支持离线安装,工具与部署资源包分离&#…...

Android和DLT日志系统

1 Linux Android日志系统 1.1 内核logger机制 drivers/staging/android/logger.c static size_t logger_offset( struct logger_log *log, size_t n) { return n & (log->size - 1); } 写的off存在logger_log中(即内核内存buffer)&am…...

【openresty服务器】:源码编译openresty支持ssl,增加service系统服务,开机启动,自己本地签名证书,配置https访问

1,openresty 源码安装,带ssl模块 https://openresty.org/cn/download.html (1)PCRE库 PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx&#xf…...

如何将网站提交百度收录完整SEO教程

百度收录是中文网站获取流量的重要渠道。本文以我的网站,www.mnxz.fun(当然现在没啥流量) 为例,详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…...

【STM32】ADC|多通道ADC采集

本次实现的是ADC实现数字信号与模拟信号的转化,数字信号时不连续的,模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法,使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时,0~ 3.3v(模拟信…...

蓝桥杯算法日记|贪心、双指针

3412 545 2928 2128 贪心学习总结: 1、一般经常用到sort(a,an);【a[n]】排序,可以给整数排,也可以给字符串按照字典序排序 2、每次选最优 双指针 有序数组、字符串、二分查找、数字之和、反转字…...

ArcGIS Pro SDK (二十七)自定义许可

ArcGIS Pro SDK (二十七)自定义许可 环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0 文章目录 ArcGIS Pro SDK (二十七)自定义许可1 在Config.xaml中添加扩展配置2 在Module1.cs中实现接口IExtensionConfig1 在Config.xaml中添加扩展配置 <modules><inse…...

通过客户端Chatbox或OpenwebUI访问识别不到本地ollama中的模型等问题的解决

Chatbox和Open WebUI 等无法获取到 Ollama里的模型&#xff0c;主要是由以下原因导致&#xff1a; Ollama 服务未正确暴露给 Docker 容器或客户端模型未正确下载或名称不匹配网络配置或权限问题 排查以上问题的思路首先排查ollama服务是否启动&#xff0c;然后再看端口号 使…...

速度超越DeepSeek!Le Chat 1100tok/s闪电回答,ChatGPT 4o和DeepSeek R1被秒杀?

2023年&#xff0c;当全球科技界还在ChatGPT引发的AI狂潮中沉浮时&#xff0c;一场来自欧洲的"静默革命"正悄然改变游戏规则。法国人工智能公司Mistral AI推出的聊天机器人Le Chat以"比ChatGPT快10倍"的惊人宣言震动业界&#xff0c;其背后承载的不仅是技术…...

JVM速成=。=

JVM跨平台原理 跨平台&#xff1a;一次编译&#xff0c;到处运行 本质&#xff1a;不同操作系统上运行的JVM不一样&#xff0c;只需要把java程序编译成一份字节码文件&#xff0c;JVM执行不同的字节码文件。 Java是高级语言&#xff0c;提前编译一下&#xff08;变成字节码文件…...

Packer 手动修复安装腾讯云插件

文章目录 Packer [腾讯云插件文档](https://developer.hashicorp.com/packer/integrations/hashicorp/tencentcloud) 提供的版本&#xff1a;v1.2.0&#xff0c;目前 Packer 构建镜像时&#xff0c;不支持现有2种[硬盘类型](https://www.tencentcloud.com/zh/document/product/…...

学习总结三十

下头论文 # P10605 下头论文 题目背景 莲子一直在苦恼关于论文的灵感。她为此花了太多时间&#xff0c;以至于没有时间理会她的伙伴梅莉。 题目描述 一天&#xff0c;莲子发现了一个绝妙的点子&#xff0c;并希望通过实验等过程将其完善。具体来说&#xff0c;她需要依次完成 n…...

开发完的小程序如何分包

好几次了&#xff0c;终于想起来写个笔记记一下 我最开始并不会给小程序分包&#xff0c;然后我就各种搜&#xff0c;发现讲的基本上都是开发之前的小程序分包&#xff0c;可是我都开发完要发布了&#xff0c;提示我说主包太大需要分包&#xff0c;所以我就不会了。。。 好了…...

Flutter PIP 插件 ---- Android

在 Flutter Android 应用中实现画中画功能 画中画(Picture-in-Picture, PiP)模式允许您的应用在一个固定在屏幕角落的小窗口中运行,同时用户可以与其他应用进行交互。本指南将介绍如何在 Flutter Android 应用中实现画中画功能,包括其局限性和解决方案。 项目地址 flutter_p…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...