【Ruby爬虫01】某吃瓜网站图片数据采集

2024-06-16 22:36

本文主要是介绍【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 同步发布,欢迎关注

这篇关于【Ruby爬虫01】某吃瓜网站图片数据采集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067744

相关文章

nginx部署https网站的实现步骤(亲测)

《nginx部署https网站的实现步骤(亲测)》本文详细介绍了使用Nginx在保持与http服务兼容的情况下部署HTTPS,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录步骤 1:安装 Nginx步骤 2:获取 SSL 证书步骤 3:手动配置 Nginx步骤 4:测

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑