如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/05/25/sevenlang-ruby/


每学一门语言,思维方式都会发生改变,编程语言亦是如此。

《七周七语言》

编程语言从范型上来划分,主要有过程式语言、面向对象式语言和函数式语言,只有了解这些语言的变化、发展和设计哲学,深入地学习它们,才能够将它们融汇贯通,体会到不同范型中的精华和思想。如今有众多的编程语言,五花八门,《七周七语言》中挑选了7门优秀的语言进行讲解,这些语言包括了以上三种范型,其中有Ruby这样的面向对象的脚本语言、Io这样的原型语言、Haskell这样的纯函数式语言,也有Scala这种融合了函数式编程和面向对象编程的语言,这些语言都有其特别的设计和独门绝技,比如Ruby的简洁、效率和它的元编程特性。

这一系列的博客打算写7篇,每一篇以一门编程语言为主,用它来实际写一些小程序,这些程序是可用但非正式的,一些逻辑不会写的很严谨,主要是为了突出语言的一些用法和特性,我不会列出一段段代码,然后讲解里面涉及的概念,而是直接贴出完整的代码,将一些语法规则以注释形式给出。

本次用Ruby写了一段抓取程序,可以抓取煎蛋上的优质无聊图和妹子图,其中解析html用到了nokogiri模块。这段程序总共只有几十行代码,为了多使用一些语言上的特性,我还加了一些没必要的代码,如果再精简一下的话,这段程序可以非常简短,实在是不得不佩服ruby的简洁和效率。

不多说了,直接上代码吧!

#encoding: utf-8

require 'net/http'
require 'open-uri'
require 'nokogiri' # 用于解析html的模块
# sudo apt-get install libxslt-dev libxml2-dev
# sudo gem install nokogiri
require 'pathname' class JanDanSpider
attr_accessor :base_uri, :cur_page # 定义属性访问器 def initialize(pagesize)
@base_uri = 'http://jandan.net/pic' # @表示实例变量、@@表示类变量、$表示全局变量
@dir = '/media/Develop/MyCode/SevenLang/ruby/pic'
@pagesize = Integer(pagesize) # 整型转换
end def crawl()
Dir.mkdir @dir unless File.directory? @dir # 表判断的方法结尾都有个?
totalpage = crawlpage(0)
puts "pagesize #{totalpage}" # ""字符会引发字符串替换,''则不会
(1..@pagesize-1).each do |i| # 遍历元组
crawlpage(totalpage - i)
end
puts 'complete!'
end def crawlpage(page)
url = page==0 ? @base_uri : @base_uri+'/page-'+page.to_s # to_s是必要的
puts "crawl-page: #{url}" fpage = open(url)
html = fpage.read
doc = Nokogiri::HTML(html)
doc.css('ol.commentlist li').each { |comment|
match = /comment-(\d+)/.match(comment['id'])
if match
id = match[1]
oo = Integer(comment.css('#cos_support'+'-'+id)[0].content);
xx = Integer(comment.css('#cos_unsupport'+'-'+id)[0].content);
xx = 1 if xx==0
if(oo>xx && (oo>200 || oo/xx >10) )
src = comment.css('p img')[0]["src"]
puts "crawl: oo #{oo} xx #{xx} src #{src}"
save_pic(src)
end
end
}
if page==0
cur_page = doc.css(".current-comment-page")[0].content
page = Integer(/\d+/.match(cur_page).to_s)
end
puts "page #{page} done!"
page # ruby中每条语句都有返回值,函数内最后一条语句的返回值会被return
end def save_pic(url)
urlpath = Pathname.new(url)
filename = urlpath.basename.to_s
dirpath = Pathname.new(@dir)
filepath = dirpath.join(filename).to_s
open(url) { |fin|
open(filepath,"wb") { |fout|
while buf = fin.read(4096) do
fout.write buf
end
}
} unless File.exists? filepath # 仅当文件不存在时进行抓取
puts 'done!'
end end if ARGV.length == 1
spider = JanDanSpider.new($*[0]) # 可从 ARGV 或 $* 读取命令行参数
spider.crawl()
else
puts 'please input pagesize' #tip: puts, 转义+换行符 print, 转义 p, 换行
end

七周七语言之用ruby做点什么的更多相关文章

  1. Seven xxx in Seven Weeks ebooks | 七周七 xxx 系列图书 电子书| share 分享 | free of charge 免费!

    Seven xxx  in Seven Weeks ebooks |  七周七 xxx 系列图书  电子书| share  分享 | free of charge  免费! Seven Languag ...

  2. 七周七语言之Ruby

    1.安装 Ubuntu 14.04 sudo apt-get install ruby version 1.9.1 2.命令行运行: irb 3.文挡查看:man RDoc 4.猜数字 2.2.7程序 ...

  3. 七周七语言之用Io编写领域特定语言

    如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/06/05/sevenlang-io/. Io 语言 ...

  4. 七周七语言之使用prolog解决爱因斯坦斑马难题

    如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/06/28/sevenlang-prolog/. 目 ...

  5. 七周七语言——Prolog(二)

    1  递归 首先来看一个知识库: father(zeb,john_boy_sr). father(john_boy_sr,john_boy_jr). ancestor(X,Y):-father(X,Y ...

  6. 第七周C语言代码

    #ifndef NMN_LIST_H #define NMN_LIST_H   #include <stdio.h>   struct list_head {     struct lis ...

  7. 程序设计入门-C语言基础知识-翁恺-第七周:指针与字符串-详细笔记(七)

    目录 第七周:指针与字符串 7.1 指针初步 7.2 字符类型 7.3 字符串 7.3 课后练习 第七周:指针与字符串 7.1 指针初步 sizeof 是一个运算符,给出某个类型或变量在内存中所占据的 ...

  8. C语言程序设计I—第七周教学

    第七周教学总结(14/10-20/10) 教学内容 第二章 用C语言编写程序 2.5 生成乘方表和阶乘表 课前准备 在蓝墨云班课发布资源: PTA:2018秋第七周作业 分享码:FE065DC5D8C ...

  9. C语言程序设计II—第七周教学

    第七周教学总结(8/4-14/4) 教学内容 本周的教学内容为:8.3 冒泡排序,知识点:指针与数组.重点难点:指针.数组与地址的关系:数组名作为函数参数.要求学生能够使用数组名作为函数参数进行熟练编 ...

随机推荐

  1. 【原创】CRM 2015/2016,SSRS 生成PDF文件,幷以附件的形式发送邮件

    主要步骤如下: 生成一条邮件记录 生成一条ActivityParty记录 生成PDF文件,并以Base64添加到ActivityMimeAttachment 中去 打开发送邮件窗口,以便编辑及发送邮件 ...

  2. redis未授权弱口令检测脚本(redis未授权访问漏洞,利用redis写webshell)

    以下如有雷同,不胜荣幸 * --- 示例代码!!!!!----*/ #! /usr/bin/env python # _*_  coding:utf-8 _*_ import socket impor ...

  3. 利用wireshark抓取TCP的整个过程分析。

    原文地址:https://www.cnblogs.com/NickQ/p/9226579.html 最近,已经很久都没有更新博客了.看看时间,想想自己做了哪些事情,突然发现自己真的是太贪心,到头来却一 ...

  4. Linux了解一下

    VMware与CentOS系统安装 1, 下载CentOS系统ISO镜像: 国内镜像源 https://opsx.alibaba.com/mirror#阿里云官方镜像站 iso下载地址(此DVD映像包 ...

  5. C语言进阶——基本数据类型01

    刚开始人们还没有数据类型这个概念,但是人们经常要使用到固定内存大小的内存,这个时候那时的程序员就要记录一段信息在内存中的起始位置和终止位置,很不方便,演变到后来就出现了数据类型这个概念 什莫是数据类型 ...

  6. 20155239《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    实验内容及步骤 使用JDK编译.运行简单的java程序 2.使用IDEA编辑.编译.运行.调试Java程序 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 先建立一个文件夹命名为Co ...

  7. 2016-2017-2 20155302 实验四 Android 开发基础

    2016-2017-2 20155302 实验四 Android 开发基础 实验内容 1.下载和安装Android Studio 2.学会使用Android Studio进行简单的Android开发 ...

  8. 20155321 《Java程序设计》实验五 网络编程与安全

    实验内容 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现中缀表达式转后缀表达式的功能 MyBC.java 结对 ...

  9. 简单的Slony-I设置实例 II

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL集群方案相关索引页     回到顶级页面:PostgreSQL索引页 接前面例子, 简单的Slony-I设置实例 这次我 ...

  10. Drupal学习(19) 使用jQuery

    本节学习如果在Drupal里交互使用jQuery. jQuery在Drupal是内置支持的.存在根目录的misc目录中. 当调用drupal_add_js方法,会自动加载jQuery. 在Drupal ...