`
Hooopo
  • 浏览: 329893 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

网页抓取

    博客分类:
  • Ruby
阅读更多
Firebug + Httpanalyzer + Hpricot + retry...
必要时再用Iconv,net/htttp

貌似这个组合很强大了。。
分享到:
评论
23 楼 Hooopo 2011-10-04  
http://chunyemen.org/archives/557
22 楼 Hooopo 2011-08-09  
最近发现很多网站返回charset是gb2312,结果里面还有gb2312字符集之外的编码。。。好可恶。
看到gb2312都当gb18030处理。。然后这个世界安静了。
也可以string.encode("UTF-8", :undef => :replace, :replace => "?", :invalid => :replace)
不过这样会丢失一些字符。但是至少不会异常。
21 楼 Hooopo 2011-07-20  
str.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => "?")

处理invalid byte sequence in UTF-8 error in ruby1.9.2
20 楼 marshluca 2010-05-08  
我也推荐一个:selectorgadget,这个东西很强大。
19 楼 Hooopo 2010-04-22  
fix hpricot or nokogiri stack level too deep systemstackerror  bug
http://dalibornasevic.com/posts/5-ruby-stack-level-too-deep-systemstackerror
18 楼 Hooopo 2010-04-19  
替换  o等。。


def html_unescape(s)
        return s unless s
        s.gsub(/&(\w+|#[0-9]+);/) { |match|
          number = case match
                   when /&(\w+);/
                     Hpricot::NamedCharacters[$1]
                   when /&#([0-9]+);/
                     $1.to_i
                   end

          number ? ([number].pack('U') rescue match) : match
        }
      end
17 楼 Hooopo 2010-04-19  
Hooopo 写道
遇到一个奇怪的字符。。
>> a.each_byte do |b|
?> p b
>> end
194
160
=> " "
>> a.unpack("U*")
=> [160]
>> 

终于找到他了。。这个字符就是nbsp....ri阿
Hpricot里有这么一个东东:
>> Hpricot::NamedCharacters
=> {"yacute"=>253, "Chi"=>935, "image"=>8465, "nbsp"=>160, "there4"=>8756, "euml"=>235, "piv"=>982, "ne"=>8800, "ograve"=>242, "zwj"=>8205, "THORN"=>222, "Atilde"=>195, "igrave"=>236, "sub"=>8834, "raquo"=>187, "hearts"=>9829, "cedil"=>184, "ni"=>8715, "asymp"=>8776, "rArr"=>8658, "aring"=>229, "Uacute"=>218, "perp"=>8869, "empty"=>8709, "ndash"=>8211, "acirc"=>226, "ordf"=>170, "ccedil"=>231, "sbquo"=>8218, "sube"=>8838, "zwnj"=>8204, "uuml"=>252, "Kappa"=>922, "lArr"=>8656, "macr"=>175, "phi"=>966, "beta"=>946, "exist"=>8707, "ucirc"=>251, "sdot"=>8901, "Sigma"=>931, "alpha"=>945, "pound"=>163, "Yacute"=>221, "sum"=>8721, "ge"=>8805, "scaron"=>353, "Psi"=>936, "AElig"=>198, "ordm"=>186, "crarr"=>8629, "Oslash"=>216, "Igrave"=>204, "real"=>8476, "clubs"=>9827, "oline"=>8254, "sup"=>8835, "Beta"=>914, "delta"=>948, "nsub"=>8836, "iuml"=>239, "theta"=>952, "nu"=>957, "frac12"=>189, "Auml"=>196, "alefsym"=>8501, "Ecirc"=>202, "amp"=>38, "frac14"=>188, "circ"=>710, "sect"=>167, "Omicron"=>927, "eta"=>951, "Nu"=>925, "Scaron"=>352, "Icirc"=>206, "Ccedil"=>199, "Prime"=>8243, "hArr"=>8660, "emsp"=>8195, "oacute"=>243, "rceil"=>8969, "iacute"=>237, "oslash"=>248, "iquest"=>191, "diams"=>9830, "epsilon"=>949, "larr"=>8592, "apos"=>39, "micro"=>181, "Ouml"=>214, "yen"=>165, "dagger"=>8224, "not"=>172, "Egrave"=>200, "cent"=>162, "frasl"=>8260, "rsquo"=>8217, "omicron"=>959, "uml"=>168, "eth"=>240, "curren"=>164, "Aring"=>197, "copy"=>169, "Epsilon"=>917, "spades"=>9824, "tilde"=>732, "Oacute"=>211, "para"=>182, "minus"=>8722, "trade"=>8482, "Iacute"=>205, "lang"=>9001, "otilde"=>245, "gt"=>62, "aelig"=>230, "pi"=>960, "rsaquo"=>8250, "Acirc"=>194, "ouml"=>246, "kappa"=>954, "Rho"=>929, "lambda"=>955, "darr"=>8595, "shy"=>173, "notin"=>8713, "chi"=>967, "ETH"=>208, "Tau"=>932, "szlig"=>223, "Pi"=>928, "Gamma"=>915, "cup"=>8746, "euro"=>8364, "uArr"=>8657, "agrave"=>224, "prod"=>8719, "egrave"=>232, "Alpha"=>913, "rfloor"=>8971, "Upsilon"=>933, "rarr"=>8594, "Otilde"=>213, "lfloor"=>8970, "Uuml"=>220, "brvbar"=>166, "ocirc"=>244, "bull"=>8226, "Lambda"=>923, "mu"=>956, "Zeta"=>918, "Dagger"=>8225, "Theta"=>920, "Agrave"=>192, "ecirc"=>234, "weierp"=>8472, "upsilon"=>965, "equiv"=>8801, "lrm"=>8206, "Mu"=>924, "hellip"=>8230, "rang"=>9002, "icirc"=>238, "le"=>8804, "quot"=>34, "oplus"=>8853, "zeta"=>950, "OElig"=>338, "Phi"=>934, "rlm"=>8207, "Omega"=>937, "permil"=>8240, "upsih"=>978, "ugrave"=>249, "thinsp"=>8201, "frac34"=>190, "thorn"=>254, "psi"=>968, "auml"=>228, "ensp"=>8194, "times"=>215, "prop"=>8733, "otimes"=>8855, "supe"=>8839, "part"=>8706, "aacute"=>225, "iota"=>953, "iexcl"=>161, "lceil"=>8968, "deg"=>176, "reg"=>174, "loz"=>9674, "cap"=>8745, "cong"=>8773, "and"=>8743, "nabla"=>8711, "harr"=>8596, "Yuml"=>376, "lsquo"=>8216, "lsaquo"=>8249, "sigmaf"=>962, "gamma"=>947, "eacute"=>233, "Eta"=>919, "isin"=>8712, "acute"=>180, "Iota"=>921, "rdquo"=>8221, "ang"=>8736, "mdash"=>8212, "sigma"=>963, "fnof"=>402, "atilde"=>227, "Ucirc"=>219, "Euml"=>203, "forall"=>8704, "Iuml"=>207, "Ugrave"=>217, "Ograve"=>210, "divide"=>247, "infin"=>8734, "lt"=>60, "ntilde"=>241, "oelig"=>339, "lowast"=>8727, "ldquo"=>8220, "Delta"=>916, "int"=>8747, "Ocirc"=>212, "or"=>8744, "sup1"=>185, "Aacute"=>193, "Eacute"=>201, "xi"=>958, "sup2"=>178, "plusmn"=>177, "rho"=>961, "yuml"=>255, "tau"=>964, "sup3"=>179, "laquo"=>171, "sim"=>8764, "bdquo"=>8222, "thetasym"=>977, "prime"=>8242, "uarr"=>8593, "uacute"=>250, "dArr"=>8659, "middot"=>183, "Xi"=>926, "omega"=>969, "Ntilde"=>209, "radic"=>8730}
>> Hpricot::NamedCharacters["nbsp"]
=> 160


同时Nokogiri里也有一个:
>> p Nokogiri::HTML::NamedCharacters["nbsp"]
160

16 楼 kaka2008 2010-04-15  
hooopo,你贴一个open-url抓取网页的完整代码出来,我看看
15 楼 Hooopo 2010-04-15  
获取charset
meta = ["Content-Type", "Content-type", "content-type"].map{|c| doc.at("meta[@http-equiv='#{c}']")}.compact.first
      
content_type = meta["content"]  if meta.is_a?(Hpricot::Elem)
charset = content_type[/charset=([\w-]+)/i, 1]
14 楼 Hooopo 2010-04-12  
13 楼 Hooopo 2010-04-12  
>> a.is_binary_data?
=> true


这是啥东东阿??
12 楼 Hooopo 2010-04-12  
遇到一个奇怪的字符。。
>> a.each_byte do |b|
?> p b
>> end
194
160
=> " "
>> a.unpack("U*")
=> [160]
>> 
11 楼 Hooopo 2010-04-09  
Segmentation fault occurs when a empty stream is passed

描述:http://github.com/hpricot/hpricot/issues#issue/6

解决办法很简单。。。避免传空流:
不用open("http://...")换成open("http://..").read

10 楼 kaka2008 2010-04-09  
目前open-uri就够我用了,哈哈
9 楼 Hooopo 2010-04-07  
Hooopo 写道
写了一个带异常处理的open...

def safe_open(url, retries = 5, sleeep = 0.42, headers = {})
    begin
      open(url, headers).read
    rescue StandardError,Timeout::Error, SystemCallError, Errno::ECONNREFUSED #有些异常不是标准异常
      puts $!
      retries -= 1

      if retries > 0
        sleep sleeep and retry
      else
        #TODO Logging..
        #TODO 多次爬取失败后记录到日志
      end

    end
  end

要先 require 'timeout'
8 楼 Hooopo 2010-04-07  
fix hpricot_scan.so: undefined method `downcase' for nil:NilClass error:

http://github.com/hpricot/hpricot/issues#issue/8

1.下载hgwr's hpricot(git://github.com/hgwr/hpricot.git)
git clone git://github.com/hgwr/hpricot.git
2.卸载以前的hpricot
sudo gem uninstall hpricot
3.build gemspec
cd hpricot_path
sudo gem build hpricot.gemspec
sudo gem install hpricot-0.8.gem
7 楼 Hooopo 2010-04-03  
这个gem也可以用来处理编码
http://www.iteye.com/topic/565606#1435314
6 楼 Hooopo 2010-04-03  
编码处理。。

  def force_utf8(html)
    doc = Hpricot.parse(html)
    begin
      content_type = doc.search("meta[@http-equiv='Content-Type'||'Content-type'||'content-type']").attr("content")
      charset = content_type[/charset=([\w-]+)/i, 1]
    rescue
      puts $!
      charset = "gbk"
    end

    if charset.downcase != "utf-8"
      html = Iconv.conv("UTF-8//IGNORE", "#{charset}//IGNORE", html).sub(/charset=[\w-]+/im, "charset=utf-8")
    end

    return html

  end
5 楼 Hooopo 2010-04-03  
写了一个带异常处理的open...

def safe_open(url, retries = 5, sleeep = 0.42, headers = {})
    begin
      open(url, headers).read
    rescue StandardError,Timeout::Error, SystemCallError, Errno::ECONNREFUSED #有些异常不是标准异常
      puts $!
      retries -= 1

      if retries > 0
        sleep sleeep and retry
      else
        #TODO Logging..
        #TODO 多次爬取失败后记录到日志
      end

    end
  end
4 楼 Hooopo 2010-03-17  
呃呃呃,目前hp已经够我用的了。。有问题再换nokogirl..

相关推荐

    淘宝网页抓取与统计分析软件

    淘宝网页抓取分析器说明 启动方法—— 将DLL和EXE解压到同一个文件夹,直接运行Exe,打开软件。(运行环境:Windows,DotNet3.5以上环境) 功能说明—— 本软件功能强大,相对于其它网页抓取或爬虫软件的优点,不仅...

    网页抓取工具metastudio

    MetaSeeker是一个Web网页抓取/数据抽取/页面信息提取工具包,能够按照用户的指导,从Web页面上筛选出需要的信息,并输出含有语义结构的提取结果文件(XML文件),众所周知,Web页面显示的信息是给人阅读的,对于机器...

    c# 网页抓取分析 表格图形生成

    c# 网页抓取分析 表格图形生成 数据挖掘

    网页抓取软件(-------)

    网页抓取软件 网页抓取软件 网页抓取软件

    asp.net 网页抓取技术

    asp.net 网页抓取技术 实现对别的网页title等的抓取

    java进行网页抓取

    java程序,能进行简单的网页抓取,及数据抓取,里面还有火车采集器的内容

    Snoopy_PHP网页抓取工具

    Snoopy_PHP网页抓取工具 snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。

    java网页抓取数据

    java网页抓取数据

    网页抓取代码

    百度的网页抓取代码,可以实现一般网页的抓取,标签都适用。

    其他类别WebSpider蓝蜘蛛网页抓取 v5.1

    WebSpider蓝蜘蛛网页抓取工具5.1可以抓取互联网、wap网站上的任何网页,包括需要登录后才能访问的页面。对抓取到页面内容进行解析,得到结构化的信息,比如:新闻标题、作者、来源、正文等。支持列表页的自动翻页...

    网页抓取小工具

    学习网站制作,首先要看看别人怎么制作的网站,抓取别人网站上的资源,请用这个工具,简单方便,适合大家

    C++实现网页抓取

    最简单的C++实现网页抓取的代码。很容易看懂。容易移植到spider中

    fiddler最新网页抓取神器

    免费网页抓取神器最新版本,网页源码抓取准确,万能追踪定位

    其他类别WebSpider蓝蜘蛛网页抓取 v5.1-webspider.rar

    WebSpider蓝蜘蛛网页抓取v5.1_webspider.rar是一款功能强大的网页抓取工具,适用于毕业设计、课程设计等项目。它基于JSP和Java技术开发,为用户提供了一个简单易用的界面,帮助用户快速地从互联网上获取所需的信息。...

    搜索引擎系统中网页抓取模块研究

    由蜘蛛程序实现的网页抓取模块是搜索引擎系 统提供服务的基础,从资源的角度决定了整个系统的成败。鉴于此,介绍搜索引擎系统 的基本工作原理,分析网页抓取模块的工作流程,研究开源网络蜘蛛Heritrix 的几个关 键...

    Java网页抓取数据

    Java网页抓取数据

    网页抓取查询电话号码

    通过网页抓取来查询电话号码 winform程序

    C++网页抓取源码及例子亲测可用

    包含源代码及测试URL,抓取url.txt中的URL的内容,保存成txt

    WebSpider 网页抓取 v5.1

    网页抓取工具5.1可以抓取互联网、wap网站上的任何网页,包括需要登录后才能访问的页面。对抓取到页面内容进行解析,得到结构化的信息,比如:新闻标题、作者、来源、正文等。支持列表页的自动翻页抓取,支持正文页多...

    网页抓取DEMO-可以运行的一个java项目

    网页抓取的简单demo,可以运行的一个项目,适合对网页抓取感兴趣的初学者,介绍了如何抓取到网页的页面

Global site tag (gtag.js) - Google Analytics