ruby mechanize抓取网页的小练习

利用这个周末做了个小练习,用的mechanize 抓取了人人网的一些网页。

rails各种环境都配置好以后,rails new test -d mysql创建了一个用mysql数据库的工程

然后为本项目创建一个mysql用户和一个数据库,配置项目里的database.yml数据库文件

由于初次接触mechanize,所以都是在实验的同时写的代码,关键部分的代码网上的有相关的实例,本人也是秉着练练手的目的做的,代码的直接就放在model里了,运行的时候在rails c里执行的,感觉这样比较方便,就没写task任务。刚刚开始练习,至于多线程,进程中断,遍历树广度优先和深度优先等均没考虑。

其实本不打算去人人网做实验,是冲着qq空间去的,但是mechanize在我这个目的下的缺点就暴露出来了,当然他也有他的专长。由于qq空间的页面大多是js生成的,而mechanize去抓取页面的时候不去运行js,所以导致了无法抓取有效信息,且登陆需要使用cookie才能登陆,由于目前还不清楚如何实现,mechanize适合抓取链接。

通过好友和最近访客抓取人人网的用户信息,目前还存在一个比较麻烦的问题,每访问100个用户就需要输入一次验证码,网上有人提供了一个可行方案,验证码跟cookie存在联系,通过cookie找到验证码库,这个功能没做实验。

运行前需要安装mechanize,在Gemfile中加入gem ‘mechanize’,gem install mechanize,bundle install,这样就装上了。

下面是部分代码

require'rubygems'

require'mechanize'

def self.save_user_renren

email='自己账号' #账号密码

password='密码值'

@agent=Mechanize.new

@agent.user_agent_alias='Windows Mozilla'

page=@agent.get('http://www.renren.com')

@agent.open_timeout=10

page.encoding='utf-8'

#填表登陆人人,登陆后的页面存放到login_page

form=page.forms.first

form.field_with(:name=>'email').value=email

form.field_with(:type=>'password').value=password

login_page=form.click_button #表单登陆方法


first_user = User.create_first_user(848764357)  #创建第一个用户,我是存到了id_list表了

 (1..5).each do |depth|  #按深度来进行遍历

   other_user(depth)

end

end


def self.other_user(depth)  #目前只存储了用户的遍历深度和用户的对应网址信息的一个数字字符串

           IdList.where(user_depth:depth).each do |id_user|

            user_page=@agent.get("http://www.renren.com/#{id_user.renren_user_id}/profile")

user_page.links_with(:href=>/\/profile$/).each do |link|

depth=id_user.user_depth+1

User.save_user_id(link.href[22,9].to_i,depth)

end

end

end

def self.create_first_user(user_id)

IdList.create(id:1,renren_user_id:user_id,user_depth:0)

end

def self.save_user_id(user_id,depth)

current_id=IdList.find_by(renren_user_id:user_id)

IdList.create(renren_user_id:user_id,user_depth:depth)unlesscurrent_id.present?

end

由于是实验,所以只存了一个用户对应人人网的唯一标示--数字字符串和深度,由于存在每访问一百个用户后需要输入验证码,且每位用户最多只取页面显示的10到20多个好友,本人只有三个好友,所以深度到4时已有3000多,深度到5将近四五万,还是因为验证码问题,所以我只抓到2万个id

后来去分析的网页,根据id拼的路由,为用户创建了基本信息,还是因为验证码,只抓了一千个用户信息,不知是网络原因还是进程出问题,有时会卡住,还出现一些脏数据。

出现的一个报错信息Net::HTTP::Persistent::Error: too many connection resets (due to Net::ReadTimeout - Net::ReadTimeout) after 200 requests on 46030880, last used 120.489427646 seconds ago

page.save('page.html')这样就可以将抓到的网页代码存到page.html中了,若要存为日志型的,Logger.new('page.html').info(page)

页面分析及存在的各种问题,以后都做了相应实验后更新。

(本人新手,欢迎指出不足之处和改进意见)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容