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

Python之webmagic爬虫优点与使用

一、webmagic的优点

  1. 它更偏向于java的语法,对于熟悉java的工程师来说学习成本较低。

  1. 提供多种选择器,如css选择器、xpath、正则等。

  1. 有一个模块pipeline:可通过简单地配置,可以将爬虫抽取到的信息,持久化到文件、数据库等。

4.模块化的结构,可轻松扩展。

5.提供多线程和分布式支持。

(缺点:不支持JS页面抓取)

二、webmagic的构成

Downloader:负责请求url获取访问的数据(html页面、json等)。

PageProcessor:解析Downloader获取的数据。

Pipeline:PageProcessor解析出的数据由Pipeline来进行保存或者说叫持久化。

Scheduler:调度器通常负责url去重,或者保存url队列,PageProcessor解析出的url可以加入Scheduler队列,用于下一次的爬取。

三、webmagic的核心方法

addUrl:

    public Spider addurl(String... urls) {for (String url : urls) {addRequest(new Request(url));}signalNewUr1();return this;}

scheduler.push(request, this):把需要爬取的url加入到Scheduler队列。

    private void addRequest(Request request) {if (site.getDomain() == null && request != null && request.getUrl() != null) {site.setDomain(UrlUtils.getDomain(request.getUrl()));}Jscheduler.push(request, this); }

initComponent:初始化downloader、pipelines、threadPool线程池,webmagic默认down是HttpClientDownloader、默认pipeline是ConsolePipeline

protected void initComponent() {if(downloader == null){this.downloader = new HttpClientDownloader();}if (pipelines.isEmpty()) {pipelines.add(new ConsolePipeline());}downloader.setThread(threadNum);if(threadPool==null || threadPool.isShutdown()){if (executorService != null && !executorService.isShutdown()){threadPool = new CountableThreadPool(threadNum, executorService);} else {threadPool = new CountableThreadPool(threadNum);}}if (startRequests != null){for(Request request:startRequests){addRequest(request);}startRequests.clear();}startTime=new Date();}

四、webmagic的使用

导入依赖:

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version>
<!--            <scope>test</scope>--></dependency><!--webmagic--><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.7.4</version></dependency><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.7.4</version></dependency>

实现PageProcessor

抽取元素Selectable

WebMagic里主要使用了三种抽取技术:XPath、正则表达式和CSS选择器。另外,对于JSON格式的内容,可使用JsonPath进行解析。.

1. XPath:语法教程
// Xpath解析
page.putField("div2",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a"));
2.使用CSS选择器(主要使用方式):
// 解析返回的数据page,并且把解析的结果放到ResultItems中
page.putField("div",page.getHtml().css("ul.fr li a.link-login").all());
3.使用正则表达式(难度较大):
// 使用正则表达式
page.putField("div3",page.getHtml().css("div#shortcut-2014 a").regex(".*我的.*").all());
抽取部分API:
获得结果API:
测试:
// 处理结果的apipage.putField("div3",page.getHtml().css("div#shortcut-2014 a").regex(".*我的.*").all());page.putField("div4",page.getHtml().css("div#shortcut-2014 a").regex(".*我的.*").get());page.putField("div5",page.getHtml().css("div#shortcut-2014 a").regex(".*我的.*").toString());page.putField("div6",page.getHtml().css("div#shortcut-2014 a").regex(".*我的.*").match());

使用Pipeline

1输出到控制台或文件

public static void main(String[] args) {Spider.create(new GithubRepoPageProcessor())//从"https://github.com/code4craft"开始抓.addUrl("https://github.com/code4craft")//输出到文件.addPipeline(new FilePipeline("D:\\webmagic\\"))//开启5个线程抓取.thread(5)//启动爬虫.run();
}

2.输出到数据库

2.1定义一个类,实现Pipeline接口
@Component
public class MybatisPipeline implements Pipeline {@Autowiredprivate JobInfoService jobInfoService;@Overridepublic void process(ResultItems resultItems, Task task) {// 获取封装好的招聘详情对象JobInfo jobInfo = resultItems.get("jobInfo");// 判断数据是否不为空if (jobInfo != null){// 如果不为空,则将其保存到数据库当中jobInfoService.save(jobInfo);}}
}
2.2在PageProcessor中 引入定制的 Pipeline,并且在Spider添加进去
//将自定义的 PipeLine注入到Process中@Autowiredprivate MybatisPipeline mybatisPipeline;// 开启定时任务(initialDelay: 初始化的任务开启时间(项目启动多久后开启这个任务),fixedDelay:间隔多久再次开启)@Scheduled(initialDelay = 1000, fixedDelay = 100 * 1000) // 单位毫秒 1000毫秒 = 1秒public void process() {Spider.create(new JobProcessor()).addUrl(url)// 设置Scheduler和布隆过滤器.setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(100000))).thread(10) //10个线程进行爬取// 添加Pipeline.addPipeline(mybatisPipeline).run();}

相关文章:

Python之webmagic爬虫优点与使用

一、webmagic的优点它更偏向于java的语法&#xff0c;对于熟悉java的工程师来说学习成本较低。提供多种选择器&#xff0c;如css选择器、xpath、正则等。有一个模块pipeline&#xff1a;可通过简单地配置&#xff0c;可以将爬虫抽取到的信息&#xff0c;持久化到文件、数据库等…...

代码随想录动态规划 || 121 122

Day42121. 买卖股票的最佳时机力扣题目链接给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返…...

C++STL库中不可或缺的部分—string(模拟实现)

前文大家好&#xff0c;本篇文章主要是讲解一下string一些常用接口的模拟实现。众所周知&#xff0c;在日常生活中&#xff0c;字符串无处不在&#xff0c;如just do it,中国,一坤年等&#xff0c;想要在计算机上将这些字符展现出来就需要用到string类&#xff0c;而对我们C程序…...

MySQL复合查询

文章目录基本查询回顾多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询unionunion all基本查询回顾 查询的员工部门表结构&#xff1a; mysql> show tables; ----------------- | Tables_in_scott | ----------------- | dept …...

PCIe 资料收集2

文章目录感官认识PCIe的存储空间PCIe 在 linux 下的驱动PCIe 验证1.PCIe 传递裸数据2.PCIe 转其他设备PCIe转其他总线RS232USB从用户空间理解PCIe感官认识 总线协议接口 视频介绍PCIe 视频介绍及PCIe文字介绍 PCIe上可以接各种控制器硬盘控制器硬盘声卡控制器音响咪头/耳机显…...

Linux网络编程(使用VScode远程登录ubuntu)

文章目录 前言一、SSH插件的安装1.SSH简单介绍2.SSH插件安装和配置步骤二、安装C/C++插件总结前言 本篇文章将带大家进行网络编程的准备工作,使用vscode进行远程登录ubuntu。为什么要使用vscode进行远程登录ubantu呢?因为有些小伙伴的电脑可能性能不够开启虚拟机后会导致电脑…...

如何提高项目估算精准度?关键看5大影响因子

如何让项目估算工作更加精准&#xff0c;我们需要重点关注5大调整因子。 1、功能点调整因子 首先需要对功能点因子进行调整&#xff0c;区分不同类型的系统特征值。 因为不同的系统&#xff0c;对项目开发的影响程度不同&#xff0c;一般我们把系统特征值分为14种类型&#xff…...

论文阅读笔记《Nctr: Neighborhood Consensus Transformer for Feature Matching》

核心思想 本文提出一种融合邻域一致性的Transfomer结构来实现特征点的匹配&#xff08;NCTR&#xff09;。整个的实现流程和思想与SuperGlue相似&#xff0c;改进点在于考虑到了邻域一致性。邻域一致性在许多的传统图像匹配和图匹配任务中都有应用&#xff0c;他基于一个很重要…...

上位机系统Ubuntu 20.04与下位机arduino UNO通讯

目录一、安装arduino IDE1.1安装方法1.1.1终端里命令下载&#xff08;不推荐&#xff09;1.1.2官网下载&#xff08;不推荐&#xff09;1.1.3论坛下载&#xff08;不推荐&#xff09;1.1.4系统应用商店&#xff08;推荐&#xff01;&#xff09;1.2配置项目文件位置1.3测试IDE功…...

hive面试题

1、什么是Hive Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能&#xff08;HQL&#xff09; 2、Hive的意义&#xff08;最初研发的原因&#xff09; 避免了去写MapReduce&#xff0c;提供快速开发的…...

【CUDA】《CUDA编程:基础与实践》CUDA加速的关键因素

CUDA事件计时 CUDA提供了一种基于CUDA事件(CUDA event)的计时方式&#xff0c;可用来给一段CUDA代码(可能包含主机代码和设备代码)计时。 对计时器的封装&#xff1a; class CUDATimeCost { public:void start() {elapsed_time_ 0.0;// 初始化cudaEventcheckCudaRuntime(cud…...

数据结构【Golang实现】(四)——双向循环链表

目录0. 定义节点1. IsEmpty()2. Length()3. AddFromHead()4. AddFromTail()5. Insert()6. DeleteHead()7. DeleteTail()8. Remove()9. RemoveByValue()10. Contain()11. Traverse()0. 定义节点 type DLNode struct {Data anyPrev, Next *DLNode }// DoublyLoopLinkedLis…...

【Redis】高可用架构之哨兵模式 - Sentinel

Redis 高可用架构之哨兵模式 - Sentinel1. 前言2. Redis Sentinel 哨兵集群搭建2.1 一主两从2.2 三个哨兵3. Redis Sentinel 原理剖析3.1 什么哨兵模式3.2 哨兵机制的主要任务3.2.1 监控&#xff08;1&#xff09;每1s发送一次 PING 命令&#xff08;2&#xff09;PING 命令的回…...

图片的美白与美化

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…...

面试官:关于CPU你了解多少?

CPU是如何执行程序的&#xff1f; 程序执行的基本过程 第一步&#xff0c;CPU 读取「程序计数器」的值&#xff0c;这个值是指令的内存地址&#xff0c;然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址&#xff0c;接着通知内存设备准备数据&#xff0c;数据准…...

UI自动化测试-Selenium的使用

文章目录 1. 环境搭建1.1 入门示例1.2 元素操作常用方法1.3 浏览器操作常用方法1.4 获取元素信息常用方法1.5 鼠标操作常用方法1.6 键盘操作常用方法1.7 下拉选择框操作2. 元素定位2.1 id定位2.2 name定位2.3 class_name定位2.4 tag_name定位2.5 link_text定位2.6 partail_link…...

嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置

文章目录前言USART的相关寄存器介绍状态寄存器&#xff1a;USARTX->SR具体位代表的含义实际代码数据寄存器 USARTX->DR波特率寄存器 USARTX->BRR控制寄存器 (USART_CR)控制寄存器1&#xff08;USART_CR1&#xff09;控制寄存器2&#xff08;USART_CR2&#xff09;GPIO…...

Android setContentView流程分析(一)

对于做Android App的小伙伴来说setContentView这个方法再熟悉不过了&#xff0c;那么有多少小伙伴知道它的调用到底做了多少事情呢&#xff1f;下面就让我们来看看它背后的故事吧&#xff1f; setContentView()方法将分为两节来讲&#xff1a;   第一节&#xff1a;如何获取De…...

doris数据库操作数字遇到的问题

关于doris数据库Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景。…...

3.13文件的IO操作

一.文件1.定义文件一般指的是存储在硬盘上的普通文件形如:txt.jpg.mp4,rar等这些文件在计算机中,文件可能是一个广义的概念,不仅可以包含普通文件,还可以包含目录(也就是文件夹.把目录称为目录文件)在操作系统中,还会用文件来描述一些其他的硬件设备或者软件资源比如网卡,显示器…...

无根仪式:当AI时代的时间加速膨胀

我给我的AI代理编程&#xff0c;让它在每晚我睡觉时执行研究任务。并非因为它实用。我只是不想浪费我的token。而且&#xff0c;这么做感觉是对的。 周六早上&#xff0c;它带回了一份关于“声音主权”的报告——这个理念是&#xff0c;每一个曾经凝聚在一起的社群&#xff0c;…...

【无人机控制】倾转旋翼 四旋翼无人机轨迹跟踪的 LMPC(线性模型预测控制)附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

学长亲荐!千笔AI,碾压级的一键生成论文工具

你是否曾在论文写作中感到力不从心&#xff1f;选题无头绪、文献难查找、框架混乱、查重率高、格式反复出错……这些困扰是否让你焦头烂额&#xff1f;别再让论文成为你的“学术噩梦”&#xff0c;现在&#xff0c;是时候尝试一款真正能帮你高效突破写作瓶颈的AI工具——千笔AI…...

毕设程序java车辆维修服务管理平台 汽车售后智能运维管理系统 智慧汽修服务一体化平台

毕设程序java车辆维修服务管理平台j82chj8g &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在现代都市生活中&#xff0c;汽车已成为家庭必备的交通工具&#xff0c;随之而来的车…...

华为OD机考双机位C卷 - 挑选字符串 (Java)

挑选字符串 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录(Java)点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(Java题解) 题目描述 给定 [a-z],26个英文字母小写字符串组成的字符串 A 和 B,其中 A 可…...

金融级MySQL迁移实践:ComStar系统平滑替换的技术路径复盘

金融级MySQL迁移实践&#xff1a;ComStar系统平滑替换的技术路径复盘 在当前信创政策与安全合规双重驱动下&#xff0c;金仓数据库&#xff08;KingbaseES&#xff09;因其对MySQL生态的深度适配能力&#xff0c;正被证券、银行等金融机构纳入核心交易系统的替换评估范围。尤其…...

深度解析检索增强三核心:普通RAG、GraphRAG与NL2SQL

在大模型应用落地过程中&#xff0c;“幻觉”“知识过时”“无法对接业务数据”是三大核心痛点——大模型虽具备强大的自然语言理解与生成能力&#xff0c;但自身知识库固定&#xff08;无法实时更新&#xff09;、缺乏逻辑推理能力&#xff08;尤其多跳关系&#xff09;、无法…...

ERP为跨境电商卖家身打造的全链路解决方案的庖丁解牛

跨境电商卖家面临的核心挑战是**“全球卖、本地化运营、合规化经营、精细化核算”**。单一工具&#xff08;如打单软件、库存表格&#xff09;已无法支撑复杂业务。 全链路 ERP 解决方案的本质&#xff0c;是将选品、采购、刊登、订单、仓储、物流、财务、客服、合规九大环节&a…...

352. Java IO API - Java 文件操作:java.io.File 与 java.nio.file 功能对比 - 4

352. Java IO API - 逐步迁移到 java.nio.file API - 4 如果望充分利用 java.nio.file 包提供的强大功能&#xff0c;可以通过 File.toPath() 方法将旧代码逐步迁移到新的 Path 接口。但如果不想使用这种方法&#xff0c;或者需要对文件 I/O 代码进行重写&#xff0c;将不得不重…...

UI-TARS-desktop效果展示:用自然语言操控电脑的惊艳案例

UI-TARS-desktop效果展示&#xff1a;用自然语言操控电脑的惊艳案例 想象一下&#xff0c;你正忙于一个项目&#xff0c;需要同时打开多个软件、搜索资料、整理文件&#xff0c;还要处理邮件。传统操作意味着你要在键盘和鼠标之间来回切换&#xff0c;点击无数个菜单和按钮。但…...