博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ruby:多线程队列(Queue)下载博客文章到本地
阅读量:5097 次
发布时间:2019-06-13

本文共 1903 字,大约阅读时间需要 6 分钟。

Ruby:多线程下载博客文章到本地的完整代码

#encoding:utf-8require 'net/http'require 'thread'require 'open-uri'require 'nokogiri'require 'date'$queue = Queue.new#文章列表页数page_nums = 8page_nums.times do |num|  $queue.push("http://www.cnblogs.com/hongfei/default.html?page="+num.to_s)endthreads = []#获取网页源码def get_html(url)  html = ""  open(url) do |f|    html = f.read  end  return htmlenddef fetch_links(html)  doc = Nokogiri::HTML(html)  #提取文章链接  doc.xpath('//div[@class="postTitle"]/a').each do |link|    href = link['href'].to_s    if href.include?"html"      #add work to the  queue      $queue.push(link['href'])    end  endenddef save_to(save_to,content)  f = File.new("./"+save_to+".html","w+")  f.write(content)  f.close()end#程序开始的时间$total_time_begin = Time.now.to_i#开辟的线程数threadNums = 10threadNums.times do  threads<

多线程部分讲解

$queue = Queue.new#文章列表页数page_nums = 8page_nums.times do |num|  $queue.push("http://www.cnblogs.com/hongfei/default.html?page="+num.to_s)end

首先声明一个Queue队列,然后往队列中添加文章列表页,以便后面可以从这些列表页中提取文章链接,另外queue声明成全局变量($),以便在函数中也可以访问到

我的曾是土木人博客文章列表总共有8页,所以需要实现给page_nums赋值为8

#开辟的线程数threadNums = 10threadNums.times do  threads<

通过Thread.new来创建线程

创建线程后,会进入until $queue.empty?循环,直到任务队列为空(即:没有要采集的网址了)
开辟的线程,每次都会从任务队列(queue)取到一个url,并通过get_html函数获取网页源码
由于任务队列中的url有分页url和文章url两种,所以要进行区分。
如果是分页url(url中含有“?page”),就直接提取文章链接。
如果是文章url,就保存到本地(save_to(),文件名为文章title)
在循环体外,创建线程完毕后,需要将创建的线程执行Thread#join方法,以便让主线程等待,
直到所有的线程执行完毕才结束主线程

 代码执行时间统计

#程序开始的时间$total_time_begin = Time.now.to_i#执行过程#程序结束的时间$total_time_end = Time.now.to_iputs "执行时间:" + ($total_time_end - $total_time_begin).to_s + "秒"

的#now方法可以获取当前时间,然后使用to_i,可以将当前时间转换成从1970年1月1日00:00:00 UTC开始所经过的秒数。

获取网页源码

#获取网页源码def get_html(url)  html = ""  open(url) do |f|    html = f.read  end  return htmlend

ruby中,获取网页的方法用模块和。OpenURI模块最简单,可以直径将指定网页当成普通文件一样进行操作。

执行结果:使用多线程采集130多篇文章,耗时15秒(单线程:47s左右)

推荐阅读:



作       者:()

原文地址:

转载于:https://www.cnblogs.com/hongfei/p/3696392.html

你可能感兴趣的文章
HDU 5510 Bazinga KMP
查看>>
[13年迁移]Firefox下margin-top问题
查看>>
Zookeeper常用命令 (转)
查看>>
Bootstrap栅格学习
查看>>
程序员的数学
查看>>
聚合与组合
查看>>
洛谷 P2089 烤鸡【DFS递归/10重枚举】
查看>>
我眼中的技术地图
查看>>
lc 145. Binary Tree Postorder Traversal
查看>>
在centos上开关tomcat
查看>>
android dialog使用自定义布局 设置窗体大小位置
查看>>
ionic2+ 基础
查看>>
查询消除重复行
查看>>
[leetcode]Minimum Path Sum
查看>>
内存管理 浅析 内存管理/内存优化技巧
查看>>
Aizu - 1378 Secret of Chocolate Poles (DP)
查看>>
csv HTTP简单表服务器
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
Screening technology proved cost effective deal
查看>>
mysql8.0.13下载与安装图文教程
查看>>