【Ruby爬虫01】某吃瓜网站图片数据采集
介绍
由于最近在学习Ruby
,写一个爬虫锻炼一下。涉及xml
解析、多线程、xpath
语法等基础知识。
实现代码
使用说明
使用前请先安装如下gem
gem install nokogiri http openssl# nokogiri:一个解析xml和html的库,支持css、xpath语法
# http:一个发送http请求的库
源代码
require 'nokogiri'
require 'openssl'
require 'time'
require 'http'
require 'thread' # 由于网站涉不良内容,网站已编码,自行研究解码方式
BASE_URL = 'l5VKR[9`aI10.P;m*LzIh,]@P17&0^F' # AES-128-CBC解密 ,网站图片有加密,需要解密
def aes_128_cbc_decrypt(encrypted_data, key = 'f5d965df75336270', iv = '97b60394abc2fbe1') aes = OpenSSL::Cipher.new('aes-128-cbc') aes.decrypt aes.key = key aes.iv = iv aes.padding = 0 # 禁用填充 aes.update(encrypted_data) + aes.final
end # 获取页面
def get_page_doc(page_url) begin # 使用HTTP.follow自动跟随重定向 resp = HTTP.follow.get(page_url) # 转换为doc doc = Nokogiri::HTML(resp.body.to_s) rescue Exception => e puts e.message end doc
end # 获取列表页面
def fetch_list_urls(doc) page_list = [] urls = [] infos = [] # 获取页面链接地址 doc.xpath('//*[@id="archive"]/article/a/@href').each do |link| # 添加 urls << BASE_URL + link end # 匹配标题及发布时间 doc.xpath('//*[@class="post-card"]/div[2]/div').each do |title| info = {} if title.content.gsub(/\s+/,'')!='' # 获取标题 t = title.xpath('h2[@class="post-card-title"]/text()')[0].content # 获取发布时间 time_str = title.xpath('div[@class="post-card-info"]/span[2]/@content')[0].content publish_time = Time.parse(time_str).strftime('%Y/%m/%d') info['title'] , info['publish_time']= t ,publish_time infos << info else # 内容为空的都为广告 info['title'], info['publish_time'] = '','' infos << info end end # 转换hash对象 urls.each_with_index do |url, i| page= {'url' => url,'title'=>infos[i]['title'],'publish_time'=> infos[i]['publish_time']} page_list << page end # 返回page_list page_list
end # 获取某一页的图片
def fetch_page(title,page_url) doc = get_page_doc(page_url) # 去除特殊字符,不然创建目录会失败,windows环境 title = title.gsub(/[“”:、\-*<>?\|\/?!!\s]*/,'') # filename = "images/#{title}" filename = File.join(File.dirname($0), "images/#{title}") unless doc.nil? # 创建目录 Dir.mkdir(filename) unless Dir.exist?(filename) # 匹配页面中的图片 urls = doc.xpath('//*[@itemprop="articleBody"]/p/img/@data-xkrkllgl') # 将url添加进队列 work_queue = Queue.new urls.each { |img_url| work_queue << img_url } workers = (1..urls.size).map do |i| Thread.new(i) do begin while (img_url = work_queue.pop(true)) begin p "下载图片:#{img_url.content}" # 读取图片数据,设置超时时间为3s raw_data = HTTP.timeout(3).get(img_url.content).body.to_s sleep 0.1 # 解密保存 raw_data = aes_128_cbc_decrypt(raw_data) File.binwrite("#{filename}/image#{i}.jpg", raw_data) rescue Exception => e p e.message next end end rescue ThreadError end end end workers.map(&:join) end
end def start_crawl page_index = 1 loop do begin url = "#{BASE_URL}category/wpcz/#{page_index}/" # 今日吃瓜页面 p "正在抓取#{page_index}页,地址:#{url}" doc = get_page_doc(url) fetch_list_urls(doc).each do |page| fetch_page(page['title'],page['url']) end # 匹配下一页按钮 next_page_xpath = '//*[@class="page-navigator"]/ol/li[@class="btn btn-primary next"]/a/text()' # 退出抓取的条件 break if doc.xpath(next_page_xpath)[0].content != "下一页" # 抓取下一页 page_index += 1 sleep 0.1 rescue Exception => e p e.message page_index += 1 next end endend # 执行抓取方法
if __FILE__==$0 start_crawl
end
本文由【产品经理不是经理】gzh 同步发布,欢迎关注
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
【Ruby爬虫01】某吃瓜网站图片数据采集
介绍 由于最近在学习Ruby,写一个爬虫锻炼一下。涉及xml解析、多线程、xpath语法等基础知识。 实现代码 使用说明 使用前请先安装如下gem gem install nokogiri http openssl# nokogiri:一个解析xml和html的库,支持css、xpath语法 # htt…...
![](https://img-blog.csdnimg.cn/img_convert/fb1283290a5c9f36f0a1a358e8708d6a.png)
可以免费领取tokens的大模型服务
本文更新时间:2024年6月20日 豆包大模型 “亲爱的客户,模型提供方将在5月15日至8月30日期间,为您提供一次独特的机会,即高达5亿tokens的免费权益。这是我们对您长期支持的感谢,也是对未来合作的期待。” 在8月30日之…...
![](https://img-blog.csdnimg.cn/direct/af1618d1c7424705b4197337c99c7b1e.png)
NSSCTF-Web题目11
目录 [鹤城杯 2021]EasyP 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]numgame 1、题目 2、知识点 3、思路 [鹤城杯 2021]EasyP 1、题目 2、知识点 php代码审计 3、思路 打开题目,出现一段代码,我们对代码进行审计 这里出现了很多不懂的…...
![](https://img-blog.csdnimg.cn/direct/c5c58add589740b09e60d17b84d42631.png)
【数据结构】第十八弹---C语言实现堆排序
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、堆排序 1.1、基本思想 1.2、初步代码实现 1.3、代码优化 1.4、代码测试 总结 1、堆排序 在博主数据结构第十二弹---堆的应用有详细讲解堆…...
![](https://img-blog.csdnimg.cn/direct/6507af77273149edbd66e3abcb940ebf.jpeg#pic_left)
[面试题]Kafka
[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…...
![](https://img-blog.csdnimg.cn/direct/205236e7c4504f51b1bdcd3550e1bb04.png)
centos7 离线安装zip和unzip
解压的时候发现不能解压,报-bash: unzip: command not found 1、访问https://www.rpmfind.net/linux/rpm2html/search.php?queryzip&submitSearch…&systemcentos&arch#/ 2、输入zip和centos搜索,选择el7下载 3、输入unzip和centos搜索&am…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux下lsof命令使用
目录 lsof 命令使用指南基本语法常用选项使用示例 lsof vs netstatlsofnetstat区别示例对比 lsof 命令使用指南 lsof (List Open Files) 是一个用于列出当前系统中打开文件的命令,适用于 Unix 和类 Unix 操作系统。它不仅可以列出常规文件,还可以列出打…...
![](https://img-blog.csdnimg.cn/direct/b1e345b253f84e19a2bbc4fe338adb13.png)
基于ChatGPT的大型语言模型试用心得
近年来,ChatGPT这样的大型语言模型,它如同一颗冉冉升起的新星,迅速在商业、教育、娱乐等多个领域照亮了创新的天空,极大地革新了我们的工作与日常生活。 最近我发现一些国内用户也能自由访问的中文ChatGPT APP。这个平台不仅提供…...
![](https://www.ngui.cc/images/no-images.jpg)
Python 列表添加多个值(四种方法)
Python 列表添加多个值有多种方法,以下是其中几种实现方法: 一、使用extend()方法 Python 中列表对象有一个 extend() 方法,它可以一次性添加另一个列表中的所有元素到当前列表中。 例1: a = [1, 2, 3] b = [4, 5, 6] a.extend(b)...
![](https://img-blog.csdnimg.cn/direct/83bcd2e792694bc5b3bd76b761a3ee8c.png)
VMware RedHat虚拟机磁盘扩容(添加磁盘和扩展磁盘)
前言 自己的电脑上配一个虚拟机还是很有必要的,用起来比双系统方便一点,之前搞了100g的ubuntu没用到,后面重装redhat觉得随便搞个20g就够用了,后面用到之后就遇到磁盘不够用的情况,只能说情况允许的话,磁盘…...
![](https://www.ngui.cc/images/no-images.jpg)
最近,GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价,包括版本间的对比分析、GPT-4o的技术能力以及个人整体感受等
GPT-4o是一款引人瞩目的人工智能技术,它在之前版本的基础上取得了长足的进步。本文将对GPT-4o进行评价,包括版本间的对比分析、GPT-4o的技术能力以及个人整体感受等。 首先,我们来进行GPT-4o与之前版本的对比分析。GPT-4o相较于GPT-3和GPT-2…...
![](https://www.ngui.cc/images/no-images.jpg)
C#面:C#支持多重继承么?
C#不支持多重继承。在C#中,一个类只能直接继承自一个基类。这是由于C#的设计目标之一是避免多重继承可能带来的复杂性和潜在的问题。 然而,C#提供了接口(interface)的概念来实现类似多重继承的功能。一个类可以实现多个接口&…...
![](https://img-blog.csdnimg.cn/direct/ff98f8e3844f4f51b55bd22f85d7c82c.png)
细说MCU修改回调函数调用模式的方法
目录 1、硬件及工程 2、实现方法 (1)修改while(1)中的代码: (2)修改2 (3)修改3 (4)修改4 (5)修改5 3、下载并运行 在本文作者的文章中&a…...
![](https://img-blog.csdnimg.cn/direct/19d474bbff1d40c481e2e795a4ce06e7.png)
Java共享台球室无人系统支持微信小程序+微信公众号
共享台球室无人系统 🎱 创新台球体验 近年来,共享经济如火如荼,从共享单车到共享汽车,无一不改变着我们的生活方式。而如今,这一模式已经渗透到了更多领域,共享台球室便是其中之一。不同于传统的台球室&a…...
![](https://img-blog.csdnimg.cn/direct/8c1b176ff7f54063977902ceedf10b44.png)
如何开发一个海外仓系统?难度在哪,怎么选择高性价解决方案
作为海外仓管理的重要工具,海外仓系统的实际应用价值还是非常高的。为了让大家能更好的理解wms海外仓系统,今天会介绍海外仓系统开发的逻辑架构,以及作为海外仓企业要怎么确定高性价比的数字化管理解决方案。 1、开发海外仓系统要考虑的功能…...
![](https://img-blog.csdnimg.cn/direct/d597df4620214bebb7cb5eee8ec3d368.png)
计算机组成原理(Wrong Question)
目录 一、计算机系统概述 *1.1 计算机发展历程 1.2 计算机系统层次结构 1.3 计算机的性能指标 二、 数据的表示和运算 2.1 数制和编码 2.2 运算方法和运算电路 2.3 浮点数的表示与运算 三、存储系统 3.1 存储器概述 3.2 主存储器 3.3 主存储器与CPU的连接 3.4 外部…...
![](https://img-blog.csdnimg.cn/img_convert/f33eb4d18287807190fae3d3d0f56075.png)
ACL2024 | AI的时空穿越记:大型语言模型共时推理的奇幻之旅!
作者:苏肇辰 标题:Living in the Moment: Can Large Language Models Grasp Co-Temporal Reasoning? 录取:ACL2024 Main 论文链接:https://arxiv.org/abs/2406.09072 代码链接:https://github.com/zhaochen0110/Cotem…...
![](https://img-blog.csdnimg.cn/direct/0c247f7cca004fab96d6ea8c3ce49ebe.png)
从xxl-job源码中学习Netty的使用
1. 启动与Spring实例化 com.xxl.job.core.executor.impl.XxlJobSpringExecutor.java类 继承SmartInitializingSingleton 类,在afterSingletonsInstantiated 实例化后方法中 调用initJobHandlerMethodRepository 把所有的xxljob任务管理起来; private…...
![](https://img-blog.csdnimg.cn/direct/460846995c214070a0fcbf50918471b3.png)
人工智能发展历程了解和Tensorflow基础开发环境构建
目录 人工智能的三次浪潮 开发环境介绍 Anaconda Anaconda的下载和安装 下载说明 安装指导 模块介绍 使用Anaconda Navigator Home界面介绍 Environment界面介绍 使用Jupter Notebook 打开Jupter Notebook 配置默认目录 新建文件 两种输入模式 Conda 虚拟环境 添…...
![](https://www.ngui.cc/images/no-images.jpg)
makefile追加warning日志
在Makefile中,你不能直接“追加”warning日志到构建过程中,但你可以通过几种方式在构建时产生额外的警告或消息。以下是一些常用的方法: 使用echo或printf命令: 在Makefile的规则中,你可以使用echo或printf命令来输出警…...
![](https://img-blog.csdnimg.cn/direct/fcbdbea2ca5e4c68b7469511aadd7cc4.png)
不要直接使用unidefined 而使用void 0
为什么不要使用unidefined 而使用void 0? 在JavaScript中,undefined 和 void 0 都可以用来表示未定义的值,但它们在使用和上下文中有一些微妙的差异,这也是为什么有时可能会推荐使用 void 0 而不是直接使用 undefined。 全局污染ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
注解详解系列 - @Scope:Bean作用域管理
注解简介 在今天的注解详解系列中,我们将探讨Scope注解。Scope是Spring框架中的一个重要注解,用于定义Spring bean的作用域。通过指定bean的作用域,我们可以控制bean的生命周期和创建方式。 注解定义 Scope注解用于指定Spring bean的作用域…...
![](https://img-blog.csdnimg.cn/direct/600775199ecd455891ea23f115c4942e.png)
数学建模基础:数学建模概述
目录 前言 一、数学建模的步骤 二、模型的分类 三、模型评价指标 四、常见的数学建模方法 实际案例:线性回归建模 步骤 1:导入数据 步骤 2:数据预处理 步骤 3:建立线性回归模型 步骤 4:模型验证 步骤 5&…...
![](https://img-blog.csdnimg.cn/img_convert/d8b7063807b73b76cecacd526b79869b.png)
人工智能大模型之开源大语言模型汇总(国内外开源项目模型汇总)
开源大语言模型完整列表 Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 所谓"语言模型",就是只用来处理语言文…...
![](https://www.ngui.cc/images/no-images.jpg)
数据结构之B树
引言 在计算机科学中,数据结构是用于组织和存储数据的关键工具。其中,B树(B-tree)作为一种自平衡的树形数据结构,被广泛应用于数据库和文件系统中,以提高查找、插入、删除和范围查询的效率。本文将深入探讨…...
![](https://www.ngui.cc/images/no-images.jpg)
双色球预测算法(Java),——森林机器学习、时间序列
最近AI很火,老想着利用AI的什么算法,干点什么有意义的事情。其中之一便想到了双色球,然后让AI给我预测,结果基本都是简单使用随机算法列出了几个数字。 额,,,,咋说呢,双…...
![](https://img-blog.csdnimg.cn/direct/f4af8a921faf4333965a1cb68a4e8ae7.png)
【计算机网络篇】数据链路层(11)在数据链路层扩展以太网
文章目录 🍔使用网桥在数据链路层扩展以太网🥚网桥的主要结构和基本工作原理🎈网桥的主要结构🔎网桥转发帧的例子🔎网桥丢弃帧的例子🔎网桥转发广播帧的例子 🥚透明网桥🔎透明网桥的…...
![](https://www.ngui.cc/images/no-images.jpg)
Ubuntu20.04 使用scrapy-splash爬取动态网页
我们要先安装splash服务,使用dock安装,如果dock没有安装,请参考我的上一篇博文: 按照官方文档:https://splash.readthedocs.io/en/stable/install.html 1.下载splash sudo docker pull scrapinghub/splash2.安装scrapy…...
![](https://www.ngui.cc/images/no-images.jpg)
Function:控制继电器上下电,上电后adb登录,copy配置文件
import serial import time import datetime import subprocess import osdef append_to_txt(file_path, content):if os.path.exists(file_path):with open(file_path, a) as file: # 使用 a 模式打开文件进行追加file.write(content \n) # 追加内容,并换行else…...
![](https://img-blog.csdnimg.cn/img_convert/634a4c3c99a82b508803a63e9e6b90fd.jpeg)
香港电讯高可用网络助力企业变革金融计算
客户背景 客户是一家金融行业知名的量化私募对冲基金公司,专注于股票、期权、期货、债券等主要投资市场,在量化私募管理深耕多年,目前资管规模已达数百亿级,在国内多个城市均设有办公地点。 客户需求 由于客户业务倚重量化技术…...
![](/images/no-images.jpg)
郴州网站/网站百度seo关键词优化
ActionContext context ActionContext.getContext(); MapSession session ActionContext.getSession(); ServletActionRequest request ServletActionContext().getRequest(); ServletActionResponse response ServletActionContext().getResponse();...
做外贸建网站/免费建站网站网页
问题及代码: /*。 *Copyright(c)2014,烟台大学计算机学院 *All right reserved, *文件名:test.cpp *作者:liu_feng_zi_ *完成日期:2014年12月9日 *版本号:v1.0 * 问题描述: *输入描述: *程序输…...
怎么做动态网站页面/百度上做优化
类似py2exe软件真的能保护python源码吗 背景 最近写了个工具用于对项目中C/C文件的字符串常量进行自动化加密处理,用python写的,工具效果不错,所以打算在公司内部推广。为了防止代码泄露就考虑不采用直接给源码方式,而python二进制…...
![](/images/no-images.jpg)
网站制作排名/网站收录查询站长工具
安装tensorflow: pip install tensorflow-gpu2.3.0 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install tensorflow 安装最新版tensorflow pip install tensorflow2.9.0 安装指定版本的tensorflow 查看Anaconda环境是否安装成功: conda --ve…...
![](https://images2018.cnblogs.com/blog/787623/201805/787623-20180516163141187-1770874792.png)
合肥制作网站的公司简介/品牌建设
谷歌浏览器安装jetbrains ide support 打开webstorm 新建项目 新建test.html并添加js文件 Edit Configurations--->defaults-->javascript debug-->browser-->选择chrome 运行test.html 参考:https://blog.csdn.net/happybruce8023/article/details/534…...
做艺术的网站/市场宣传推广方案
一、资源下载 安装memcached 之前必需要先安装 libevent 分别在libevent和memcached的官网下载安装包libevent-1.4.14b-stable.tar.gz和memecached-1.4.22.tar.gz 将两个安装包解压到安装文件夹下(安装文件夹由自己决定) 二、安装libevent 1、进入libeve…...