澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

天气查询,使用Ruby程序实现web信息抓取的教程

支付三个天气查询的工具根本由两步构成,一是数码的得到,二是数码的来得。

天气查询,使用Ruby程序实现web信息抓取的教程。网址不再单纯迎合人类读者。大多站点现在支撑部分 API,这几个 API 使Computer程序能够获取音讯。显示器抓取 —— 将 HTML 页面深入深入分析为更便于精通的表单的省时本领 — 如故很方便。但运用 API 简化 Web 数据提取的火候在迅速扩张。依据 ProgrammableWeb 的消息,在本文发布时,已存在 10,000 多少个网址 API — 在过去的 十六个月首追加了 3,000 个。(ProgrammableWeb 本人提供了一个API,可从其目录中寻找和寻找 API、mashup、成员概要文件和别的数据。)

       近来干活中必要定时爬取不一样城市天天的热度。其实就是经过编程的方法去抓取分化网址网页举行深入分析筛选的长河。.NET提供了不菲类去做客并获取远程网页的多寡,比方WebClient类和HttpWebRequest类。那一个类对于利用HTTP去拜望远端的网页同一时候下载下来是很有用的,但在对于所下载下来的HTML的深入分析工夫方面,则显得意义很弱了。推荐一个开源的机件HTML Agility Pack(卡塔尔(قطر‎,它的规划目的是尽量简化对HTML文书档案的读和写。那些包本人是运用了DOM文书档案对象模型去深入分析HTML的。在此顺便记录一下多年来征集的爬取历史和近期天气的网址备用:

为了演示浏览器和API的使用,大家将会研讨推特的网址。方今,从月活顾客数维度来看,Facebook是世界上最大的对峙网络之焕发青春,因而其顾客数据丰裕有价值。

 少年老成、数据得到

正文首先介绍现代的 Web 抓取并将它与 API 方法进行相比。然后经过 Ruby 示例,显示如何行使 API 从局部盛行的 Web 属性中提取构造化音信。您须要着力通晓 Ruby 语言、具象状态传输 (REST卡塔尔(英语:State of Qatar),以致 JavaScript 对象表示法 (JSON卡塔尔(英语:State of Qatar) 和 XML 概念。
抓取与 API

  • 帮忙历史气象查询的粤语网址:            

  • 左近网址:  (最近2-3年数据)

  • 网站:   (最近18年数据)
  • 那些网址帮助的光阴越来越长:
  • 中华天气网:,

1 网站

天气查询,使用Ruby程序实现web信息抓取的教程。图1所示为Packt出版社的Instagram页面。

当你查看该页的源代码时,可以找到最开始的几篇日记,然而前边的日志独有在浏览器滚动时才会经过AJAX加载。此外,照片墙(TWTTiguan.US卡塔尔还提供了叁个活动端分界面,正如第1章所述,这种格局的分界面经常更便于抓取。该页面在移动端的呈现情势如图9.6所示。

图片 1

图1

图片 2

图2

当大家与活动端网址开展互相,并应用浏览器工具查看时,会发掘该分界面使用了和事情发生前相仿的构造来处理AJAX事件,因而该方法无法简化抓取。就算那一个AJAX事件能够被逆向工程,然则不相同类别的推特(Twitter卡塔尔页面使用了不一样的AJAX调用,并且根据本人的往返阅世,推特平常会修正这么些调用的布局,所以抓取那么些页面要求不停维护。由此,如第5章所述,除非品质非常珍视,否则最棒使用浏览器渲染引擎试行JavaScript事件,然后访谈生成的HTML页面。

上面的代码片段使用Selenium自动化登入Twitter(推特(Twitter卡塔尔国卡塔尔国,并跳转到给定页面包车型大巴UQashqaiL。

from selenium import webdriver
def get_driver():
 try:
 return webdriver.PhantomJS()
 except:
 return webdriver.Firefox()
def facebook(username, password, url):
 driver = get_driver()
 driver.get('https://facebook.com')
 driver.find_element_by_id.send_keys
 driver.find_element_by_id.send_keys
 driver.find_element_by_id('loginbutton').submit()
 driver.implicitly_wait
 # wait until the search box is available,
 # which means it has successfully logged in
 search = driver.find_element_by_name
 # now logged in so can go to the page of interest
 driver.get
 # add code to scrape data of interest here ...

下一场,能够调用该函数加载你感兴趣的Facebook(TWT酷威.US卡塔尔国页面,并接收合法的推特邮箱和密码,抓取生成的HTML页面。

数量获得又能够分成使用别的合营社提供的API和手动抓取其它网址数据。

前几天已有多样抓取建设方案。在那之中部分将 HTML 转变为此外格式,举例JSON,这样提取想要的开始和结果会愈发简便易行。别的实施方案读取 HTML,您可将内容定义为 HTML 分层布局的一个函数,此中的数码已加了符号。意气风发种此类建设方案是 Nokogiri,它扶助接收 Ruby 语言剖判 HTML 和 XML 文书档案。其余开源抓取工具包蕴用于 JavaScript 的 pjscrape 和用来 Python 的 Beautiful Soup。pjscrape 落成三个命令行工具来抓取完全展现的页面,包罗JavaScript 内容。Beautiful Soup 完全集成到 Python 2 和 3 景况中。

华夏气象网(Weather.com.cn卡塔尔

2 Facebook API

如第1章所述,抓取网址是在其数额还没交到布局化格式时的最末之选。而Facebook(脸谱卡塔尔确实为绝大好多国有或私有数据提供了API,因而大家须求在构建抓实的浏览器抓取以前,首先检查一下这么些API提供的拜见是否早就能够满足急需。

首先要做的作业是明确通过API哪些数据是可用的。为了解决该难题,我们要求先查阅其API文档。开荒者文档的网站为 API,该API中蕴藏了作者们想要的音信。假诺你需求构建与Facebook(Instagram卡塔尔的其它交互作用(通过API或SDK),能够随时查阅该文书档案,该文档会准时更新还要易于使用。

别的,依照文档链接,大家还足以选取浏览器内的图谱 API探求工具,其地点为

图片 3

图3

在那,笔者能够寻找API,获取PacktPub的推特页面ID。图谱探寻工具还足以用来扭转访谈口令,我们能够用它来定位API。

想要在Python中动用图谱API,大家需求利用具备更尖端恳求的特种访谈口令。幸运的是,有七个名叫facebook-sdk(

pip install facebook-sdk

下边是运用推文(Tweet卡塔尔(英语:State of Qatar)的图谱API从Packt出版社页面中抽取数据的代码示例。

In [1]: from facebook import GraphAPI
In [2]: access_token = '....' # insert your actual token here
In [3]: graph = GraphAPI(access_token=access_token, version='2.7')
In [4]: graph.get_object('PacktPub')
Out[4]: {'id': '204603129458', 'name': 'Packt'}

我们得以看见和基于浏览器的图谱探寻工具相像的结果。大家得以因此传递想要收取的附加消息,来博取页面中的更多信息。要规定使用什么音信,大家得以在图谱文书档案中看出页面中有所可用的字段,文书档案地址为

In [5]: graph.get_object('PacktPub', fields='about,events,feed,picture')
Out[5]:
{'about': 'Packt provides software learning resources, from eBooks to video
courses, to everyone from web developers to data scientists.',
 'feed': {'data': [{'created_time': '2017-03-27T10:30:00 0000',
 'id': '204603129458_10155195603119459',
 'message': "We've teamed up with CBR Online to give you a chance to win 5
tech eBooks - enter by March 31! http://bit.ly/2mTvmeA"},
...
 'id': '204603129458',
 'picture': {'data': {'is_silhouette': False,
 'url':
'https://scontent.xx.fbcdn.net/v/t1.0-1/p50x50/14681705_10154660327349459_7
2357248532027065_n.png?oh=d0a26e6c8a00cf7e6ce957ed2065e430&oe=59660265'}}}

我们能够看看该响应是格式出色的Python字典,大家得以比较轻松地实行深入分析。

图谱API还提供了众多走访客户数量的别的调用,其文书档案能够从Instagram的开采者页面中收获,网站为

1. 某商铺提供的API

只要你愿意采纳抓取功效和 Nokogiri 来识别 CrunchBase 所报告的 IBM 工作者数量。第一步是精通 CrunchBase 上列出了 IBM 职员和工人数量的一定 HTML 页面包车型大巴标志。图 1 显示了在 Mozilla Firefox 中的 Firebug 工具中张开的此页面。该图的上半有个别显得了所显现的 HTML,下半部分来得了感兴趣部分的 HTML 源代码。


可以从Ali云的云市集中找找,可以找到免费的API,何况提供分歧语言的身体力行,实在不会还足以向客服咨询...

图片 4

  • 该网提供有如下四个Json格式的询问接口,以东京为例:
  • ID是三个9位的数字,依照长度能够分成如下四片段:101(国家代号) 01(省) 01(二级地区) 00(三级地区)
  • 要收获具备的地段代号,通过如下情势:

忆起当年使用A企业提供的API,使用B集团的应用软件CODE,还言之成理的去问A的客性格很顽强在艰难困苦或巨大压力面前不屈“笔者照你们示范写的干什么还调用退步”???

项目清单 1 中的 Ruby 脚本使用 Nokogiri 从图 1 中的网页抓取工作者数量。
清单 1. 使用 Nokogiri 解析 HTML (parse.rb)

示例Demo

2.其余网站数量抓取

#!/usr/bin/env ruby
require 'rubygems'
require 'nokogiri'
require 'open-uri'

# Define the URL with the argument passed by the user
uri = "http://www.crunchbase.com/company/#{ARGV[0]}"

# Use Nokogiri to get the document
doc = Nokogiri::HTML(open(uri))

# Find the link of interest
link = doc.search('tr span[1]')

# Emit the content associated with that link
puts link[0].content

抓取数据源网站为中心气象局(http://www.nmc.gov.cn卡塔尔国。利用抓包工具,解析得出获取实时气象需求选取以下多少个接口(以询问里约热内卢天气为例):

在 Firebug 展现的 HTML 源代码中(如 图 1 所示),您可看出感兴趣的数目(职员和工人数量)嵌入在叁个 HTML 唯风华正茂 ID <span> 标志内。还可观察 <span id="num_employees"> 标志是三个 <span> ID 标志中的第二个。所以,清单 第11中学的最终多个指令是,使用 link = doc.search('tr span[1]'卡塔尔 诉求第一个<span> 标志,然后接收 puts link[0].content 发出这一个已剖析链接的开始和结果。

      编制程序使用示比方下:大家要获取如下网页中的天气新闻:

1)省及直辖市信息(http://www.nmc.gov.cn/f/rest/province)
GET http://www.nmc.gov.cn/f/rest/province HTTP/1.1
Host: www.nmc.gov.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://www.nmc.gov.cn/publish/forecast/ATJ/tian-jin.html
X-Requested-With: XMLHttpRequest
Cookie:UM_distinctid=1608c818855d7-08ea6f54050ee3-4c322e7d-100200-1608c818856e4; CNZZDATA1254743953=65764743-1514184268-https%3A%2F%2Fwww.baidu.com%2F|1514184060; followcity=54511,58367,59493,57516,58321,57679,58847,59287,58238
DNT: 1
Connection: keep-alive
Cache-Control: max-age=0
返回内容为:
[
  {
    "code": "ABJ",
    "name": "北京市",
    "url": "/publish/forecast/ABJ.html"
  },
  {
    "code": "ATJ",
    "name": "天津市",
    "url": "/publish/forecast/ATJ.html"
  },
  {
    "code": "AHE",
    "name": "河北省",
    "url": "/publish/forecast/AHE.html"
  },
  {
    "code": "ASX",
    "name": "山西省",
    "url": "/publish/forecast/ASX.html"
  },
  {
    "code": "ANM",
    "name": "内蒙古自治区",
    "url": "/publish/forecast/ANM.html"
  },
  {
    "code": "ALN",
    "name": "辽宁省",
    "url": "/publish/forecast/ALN.html"
  },
  {
    "code": "AJL",
    "name": "吉林省",
    "url": "/publish/forecast/AJL.html"
  },
  {
    "code": "AHL",
    "name": "黑龙江省",
    "url": "/publish/forecast/AHL.html"
  },
  {
    "code": "ASH",
    "name": "上海市",
    "url": "/publish/forecast/ASH.html"
  },
  {
    "code": "AJS",
    "name": "江苏省",
    "url": "/publish/forecast/AJS.html"
  },
  {
    "code": "AZJ",
    "name": "浙江省",
    "url": "/publish/forecast/AZJ.html"
  },
  {
    "code": "AAH",
    "name": "安徽省",
    "url": "/publish/forecast/AAH.html"
  },
  {
    "code": "AFJ",
    "name": "福建省",
    "url": "/publish/forecast/AFJ.html"
  },
  {
    "code": "AJX",
    "name": "江西省",
    "url": "/publish/forecast/AJX.html"
  },
  {
    "code": "ASD",
    "name": "山东省",
    "url": "/publish/forecast/ASD.html"
  },
  {
    "code": "AHA",
    "name": "河南省",
    "url": "/publish/forecast/AHA.html"
  },
  {
    "code": "AHB",
    "name": "湖北省",
    "url": "/publish/forecast/AHB.html"
  },
  {
    "code": "AHN",
    "name": "湖南省",
    "url": "/publish/forecast/AHN.html"
  },
  {
    "code": "AGD",
    "name": "广东省",
    "url": "/publish/forecast/AGD.html"
  },
  {
    "code": "AGX",
    "name": "广西壮族自治区",
    "url": "/publish/forecast/AGX.html"
  },
  {
    "code": "AHI",
    "name": "海南省",
    "url": "/publish/forecast/AHI.html"
  },
  {
    "code": "ACQ",
    "name": "重庆市",
    "url": "/publish/forecast/ACQ.html"
  },
  {
    "code": "ASC",
    "name": "四川省",
    "url": "/publish/forecast/ASC.html"
  },
  {
    "code": "AGZ",
    "name": "贵州省",
    "url": "/publish/forecast/AGZ.html"
  },
  {
    "code": "AYN",
    "name": "云南省",
    "url": "/publish/forecast/AYN.html"
  },
  {
    "code": "AXZ",
    "name": "西藏自治区",
    "url": "/publish/forecast/AXZ.html"
  },
  {
    "code": "ASN",
    "name": "陕西省",
    "url": "/publish/forecast/ASN.html"
  },
  {
    "code": "AGS",
    "name": "甘肃省",
    "url": "/publish/forecast/AGS.html"
  },
  {
    "code": "AQH",
    "name": "青海省",
    "url": "/publish/forecast/AQH.html"
  },
  {
    "code": "ANX",
    "name": "宁夏回族自治区",
    "url": "/publish/forecast/ANX.html"
  },
  {
    "code": "AXJ",
    "name": "新疆维吾尔自治区",
    "url": "/publish/forecast/AXJ.html"
  },
  {
    "code": "AXG",
    "name": "香港特别行政区",
    "url": "/publish/forecast/AXG.html"
  },
  {
    "code": "AAM",
    "name": "澳门特别行政区",
    "url": "/publish/forecast/AAM.html"
  },
  {
    "code": "ATW",
    "name": "台湾省",
    "url": "/publish/forecast/ATW.html"
  }
]

2)区县信息(http://www.nmc.gov.cn/f/rest/province/ATJ)
//根据所选省或直辖市生成区县信息查询接口
GET http://www.nmc.gov.cn/f/rest/province/ATJ HTTP/1.1
Host: www.nmc.gov.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://www.nmc.gov.cn/publish/forecast/ATJ/tian-jin.html
X-Requested-With: XMLHttpRequest
Cookie:UM_distinctid=1608c818855d7-08ea6f54050ee3-4c322e7d-100200-1608c818856e4; CNZZDATA1254743953=65764743-1514184268-https%3A%2F%2Fwww.baidu.com%2F|1514184060; followcity=54511,58367,59493,57516,58321,57679,58847,59287,58238
DNT: 1
Connection: keep-alive
Cache-Control: max-age=0

返回内容为:
[
  {
    "url": "/publish/forecast/ATJ/xi-qing.html",
    "code": "54527",
    "city": "西青",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/bin-hai-xin-qu.html",
    "code": "54623",
    "city": "滨海新区",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/bao-di.html",
    "code": "54525",
    "city": "宝坻",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/bei-chen.html",
    "code": "54528",
    "city": "北辰",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/da-gang.html",
    "code": "54645",
    "city": "大港",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/dong-li.html",
    "code": "54526",
    "city": "东丽",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/han-gu.html",
    "code": "54530",
    "city": "汉沽",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/ji-xian.html",
    "code": "54428",
    "city": "蓟县",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/jin-nan.html",
    "code": "54622",
    "city": "津南",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/jing-hai.html",
    "code": "54619",
    "city": "静海",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/ning-he.html",
    "code": "54529",
    "city": "宁河",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/tian-jin.html",
    "code": "54517",
    "city": "天津",
    "province": "天津市"
  },
  {
    "url": "/publish/forecast/ATJ/wu-qing.html",
    "code": "54523",
    "city": "武清",
    "province": "天津市"
  }
]

3)某城市当前天气查询(http://www.nmc.gov.cn/f/rest/real/54517) 
GET http://www.nmc.gov.cn/f/rest/real/54517?_=1514185989171 HTTP/1.1
Host: www.nmc.gov.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://www.nmc.gov.cn/publish/forecast/ATJ/tian-jin.html
X-Requested-With: XMLHttpRequest
Cookie:UM_distinctid=1608c818855d7-08ea6f54050ee3-4c322e7d-100200-1608c818856e4; CNZZDATA1254743953=65764743-1514184268-https%3A%2F%2Fwww.baidu.com%2F|1514184060; followcity=54511,58367,59493,57516,58321,57679,58847,59287,58238
DNT: 1
Connection: keep-alive

返回内容为:
{
"station":

    {

    "url":"/publish/forecast/ATJ/tian-jin.html",

    "code":"54517",

    "city":"天津",

    "province":"天津市"

    },

"publish_time":"2017-12-25 15:05",
"weather":

    {

      "temperature":5.4,  //气温 ℃
       "airpressure":1023.0, //气压 
      "humidity":15.0, //湿度 %
      "rain":0.0,  //降水量 mm

    "rcomfort":43,

    "icomfort":-2,

    "info":"晴",

    "img":"0",

      "feelst":6.7//体感温度 ℃

    },

"wind":

    {

    "direct":"西南风",

    "power":"微风",

      "speed":2.8 m/s

    },

"warn":

    {

    "alert":"2017年12月25日14时天津市发布海上大风蓝色预警",

    "pic":"http://image.nmc.cn/static/site/nmc/themes/basic/alarm/p.png",

    "province":"天津市",

    "city":"9999",

    "url":"/f/alarm/12000041600000_20171225145105.html",

    "issuecontent":"天津海洋中心气象台于2017年12月25日14时43分发布海上大风蓝色预警信号:预计今天后半夜到明天白天,渤海西部中部海面将有东到东北风7级,阵风8级,请有关单位和人员作好防范准备。",

    "fmeans":"9999"
    }
}

CrunchBase 还公开了一个 REST API,它亦可访问的数额比通过抓取效能访谈的多少要多得多。清单 2 呈现了如何运用该 API 从 CrunchBase 站点提取公司的工作者数。
项目清单 2. 组合使用 CrunchBase REST API 和 JSON 剖判 (api.rb卡塔尔国

     图片 5

接口解析完成,接下去正是利用代码获取数据的进程,以获取省及直辖市数据为例,代码如下所示:

#!/usr/bin/env ruby
require 'rubygems'
require 'json'
require 'net/http'

# Define the URL with the argument passed by the user
uri = "http://api.crunchbase.com/v/1/company/#{ARGV[0]}.js"

# Perform the HTTP GET request, and return the response
resp = Net::HTTP.get_response(URI.parse(uri))

# Parse the JSON from the response body
jresp = JSON.parse(resp.body)

# Emit the content of interest
puts jresp['number_of_employees']

     下载HTML Agility Pack组件,新建调控台程序,在你的工程中引用相应framework版本对应的零件,示例代码如下:        

        /// <summary>
        /// 获取省及直辖市
        /// </summary>
        public List<ProvinceModel> GetProvinceData(ref string errorMsg)
        {
            string strResult = string.Empty;
            try
            {
                #region HttpWebRequest
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.nmc.gov.cn/f/rest/province");
                string cookie = "UM_distinctid=1608c818855d7-08ea6f54050ee3-4c322e7d-100200-1608c818856e4; CNZZDATA1254743953=65764743-1514184268-https%3A%2F%2Fwww.baidu.com%2F|1514184060; followcity=54511,58367,59493,57516,58321,57679,58847,59287,58238";
                string referer = "http://www.nmc.gov.cn/publish/forecast/ATJ/tian-jin.html";
                HttpWebRequestHelper.HttpWebRequestConfig(request, cookie, referer);
                #endregion

                using (WebResponse response = request.GetResponse())
                {
                    Stream respStream = response.GetResponseStream();
                    bool isNeedDeCompress = response.Headers.ToString().Contains("Content-Encoding: gzip");
                    if (isNeedDeCompress)
                        respStream = new GZipStream(respStream, CompressionMode.Decompress);
                    StreamReader reader = new StreamReader(respStream, Encoding.UTF8);
                    strResult = reader.ReadToEnd();
                    List<ProvinceModel> lstModel = JsonConvert.DeserializeObject<List<ProvinceModel>>(strResult);
                    response.Close();
                    return lstModel;
                }
            }
            catch (Exception ex)
            {
                errorMsg = ex.Message;
            }
            return null;
        }
      //其中HttpWebRequestHelper.HttpWebRequestConfig()是对请求头的一些设置。

在清单 2 中,您定义了叁个 URAV4L(公司名称作为脚本参数字传送入)。然后使用 HTTP 类发出贰个 GET 央求并赶回响应。响应被深入分析为贰个 JSON 对象,您可通过一个Ruby 数据构造援用感兴趣的数目项。

            string url = @"http://lishi.tianqi.com/beijing/201701.html";
            var webGet = new HtmlWeb();
            var document = webGet.Load(url);
            var div = document.DocumentNode.SelectNodes("//div[@class='tqtongji2']/ul");
            foreach (HtmlNode node in div)
            {
                var tmpNode = node.SelectNodes("li");
                Console.WriteLine(string.Format("{0}-----------{1}---------{2}----------{3}",
                    tmpNode[0].InnerText,
                    tmpNode[1].InnerText,
                    tmpNode[2].InnerText,
                    tmpNode[3].InnerText));
            }
            Console.ReadKey();

二、数据显示

清单 3 中的调整台会话突显了运维 清单 1 中的抓取脚本和 项目清单 2 中基于 API 的剧本的结果。
项目清单 3. 示范抓取和 API 方法

程序运维效果:汉语存在乱码,如下图

数码获得之后,先是模仿原网址的体制用WPF轻便的得以达成了风度翩翩版,运营图如下:

$ ./parse.rb ibm
388,000
$ ./api.rb ibm
388000
$ ./parse.rb cisco
63,000
$ ./api.rb cisco
63000
$ ./parse.rb paypal
300,000
$ ./api.rb paypal
300000
$

图片 6

图片 7

抓取脚本运维时,您选用二个格式化的计数,而 API 脚本会生成三个原有整数。如清单 3 所示,您可推广每个脚本的选用,从 CrunchBase 追踪的任何厂商号召得到职员和工人数。每一种形式提供的 URubiconL 的相符构造使这种通用性成为或者。

透过深入分析HTML Agility Pack源码,在HtmlWeb类的Get(Uri uri, string method, string path, HtmlDocument doc卡塔尔(英语:State of Qatar)方法中,局地变量 resp是http须求的response。设置断点开掘resp.ContentEncoding为空。由此通过HttpWebRequest来下载数据,示例代码如下:

近日做事不忙,以为好久没搞WebForm,所以就又简便的做了上面那个:

那么,大家运用 API 方法能博取怎么样?对于抓取,您需求解析 HTML 以领悟它的结构并识别要提取的多少。然后利用 Nokogiri 拆解分析 HTML 并获取感兴趣的多寡就能够比比较粗略。然则,假如 HTML 文书档案的结构发生变化,您或许需求校正脚本手艺正确剖判新组织。依照 API 合同,API 方法不设有该难题。API 方法的另二个首要亮点是,您可访谈通过接口(通过再次来到的 JSON 对象)公开的有所数据。通过 HTML 公开且可供人使用的 CrunchBase 数据要少得多。

            string url = @"http://lishi.tianqi.com/beijing/201701.html";
            HttpWebRequest req = WebRequest.Create(new Uri(url)) as HttpWebRequest;
            req.Method = "GET";
            WebResponse rs = req.GetResponse();
            Stream rss = rs.GetResponseStream();
            HtmlDocument doc = new HtmlDocument();
            doc.Load(rss);
            var div = doc.DocumentNode.SelectNodes("//div[@class='tqtongji2']/ul");
            foreach (HtmlNode node in div)
            {
                var tmpNode = node.SelectNodes("li");
                Console.WriteLine(string.Format("{0}-----------{1}---------{2}----------{3}",
                    tmpNode[0].InnerText,
                    tmpNode[1].InnerText,
                    tmpNode[2].InnerText,
                    tmpNode[3].InnerText));
            }
            Console.ReadKey();

图片 8

这几天走访如何采用别的部分 API 从 Internet 提取种种音讯,相像要依赖 Ruby 脚本。首先会见怎么着从贰个交际网络站点收罗个人数据。然后将看见什么样通过其他API 来源查找更加少的村办数据。

代码运维效果如下:

 

透过 LinkedIn 提取个人数据

 图片 9

LinkedIn 是叁个面向职业工作的社人机联作连网网址。它对联系其余开拓职员,寻觅专门的学问,切磋一家百货店,只怕参与两个群组,就有意思的大旨开展同盟很有用。LinkedIn 还整合了一个推荐介绍引擎,可依赖你的概要文件推荐工作和企业。

 that's ok!!!

LinkedIn 顾客可采访该站点的 REST 和 JavaScript API,进而获得可由此其人类可读网址访谈的新闻:联系音信、社交分享流、内容群组、通讯(音讯和联络邀约),以至公司和劳作音信。

 

要接纳 LinkedIn API,您必得注册您的应用程序。注册后会得到叁个 API 密钥和地下秘钥,甚至三个客户令牌和潜在秘钥。LinkedIn 使用 OAuth 公约进行身份验证。

  

奉行身份验证后,您可透过拜候令牌对象发出 REST 央求。响应是三个拔尖的 HTTP 响应,所以你可将正文剖析为 JSON 对象。然后可迭代该 JSON 对象来提取感兴趣的数目。

 

项目清单 4 中的 Ruby 脚本为进行身份验证后的 LinkedIn 客商提供了要爱戴的商家引用和职业建议。
项目清单 4. 施用 LinkedIn API (lkdin.rb卡塔尔(قطر‎ 查看集团和劳作提出

 

#!/usr/bin/ruby
require 'rubygems'
require 'oauth'
require 'json'

pquery = "http://api.linkedin.com/v1/people/~?format=json"
cquery='http://api.linkedin.com/v1/people/~/suggestions/to-follow/companies?format=json'
jquery='http://api.linkedin.com/v1/people/~/suggestions/job-suggestions?format=json'

# Fill the keys and secrets you retrieved after registering your app
api_key = 'api key'
api_secret = 'api secret'
user_token = 'user token'
user_secret = 'user secret'

# Specify LinkedIn API endpoint
configuration = { :site => 'https://api.linkedin.com' }

# Use the API key and secret to instantiate consumer object
consumer = OAuth::Consumer.new(api_key, api_secret, configuration)

# Use the developer token and secret to instantiate access token object
access_token = OAuth::AccessToken.new(consumer, user_token, user_secret)

# Get the username for this profile
response = access_token.get(pquery)
jresp = JSON.parse(response.body)
myName = "#{jresp['firstName']} #{jresp['lastName']}"
puts "nSuggested companies to follow for #{myName}"

# Get the suggested companies to follow
response = access_token.get(cquery)
jresp = JSON.parse(response.body)

# Iterate through each and display the company name
jresp['values'].each do | company |
  puts " #{company['name']}"
end

# Get the job suggestions
response = access_token.get(jquery)
jresp = JSON.parse(response.body)
puts "nSuggested jobs for #{myName}"

# Iterate through each suggested job and print the company name
jresp['jobs']['values'].each do | job |
  puts " #{job['company']['name']} in #{job['locationDescription']}"
end

puts "n"

   

项目清单 5 中的调节台会话展现了运维 清单 4 中的 Ruby 脚本的输出。脚本中对 LinkedIn API 的 3 次独立调用有例外的输出结果(三个用于身份验证,其余多少个分级用于公司提构和行事提议链接)。
清单 5. 演示 LinkedIn Ruby 脚本

$ ./lkdin.rb

Suggested companies to follow for M. Tim Jones
 Open Kernel Labs, Inc.
 Linaro
 Wind River
 DDC-I
 Linsyssoft Technologies
 Kalray
 American Megatrends
 JetHead Development
 Evidence Srl
 Aizyc Technology

Suggested jobs for M. Tim Jones
 Kozio in Greater Denver Area
 Samsung Semiconductor Inc in San Jose, CA
 Terran Systems in Sunnyvale, CA
 Magnum Semiconductor in San Francisco Bay Area
 RGB Spectrum in Alameda, CA
 Aptina in San Francisco Bay Area
 CyberCoders in San Francisco, CA
 CyberCoders in Alameda, CA
 SanDisk in Longmont, CO
 SanDisk in Longmont, CO

$

可将 LinkedIn API 与别的提供了 OAuth 援救的语言结合使用。

动用 Yelp API 检索业务数据

Yelp 公开了一个富 REST API 来推行公司查找,包涵评分、批评和地理寻找(地段、城市、地理编码)。使用 Yelp API,您可搜索意气风发种给定类型的厂家(举例“旅舍”)并将追寻限定在多个地理边界内;一个地理坐标周围;大概二个乡里、地址或城市北邻。JSON 响应包涵了与标准合作的店堂的雅量有关音信,包蕴地点音信、间距、评分、交易,以至此外类别的音信(譬喻该公司的图纸、移动格式新闻等)的 UXC90L。

像 LinkedIn 相仿,Yelp 使用 OAuth 实施身份验证,所以您必须向 Yelp 注册工夫经过该 API 获得豆蔻年华组用于身份验证的证据。脚本完毕身份验证后,可协会叁个基于 REST 的 U翼虎L 央求。在项目清单 6 中,小编硬编码了三个指向性俄勒冈州 Boulder 的旅舍必要。响应正文被深入解析到一个 JSON 对象中并张开迭代,进而产生想要的音讯。注意,小编去掉了已关门的厂家。
项目清单 6. 运用 Yelp API (yelp.rb卡塔尔国 检索集团数据

#!/usr/bin/ruby
require 'rubygems'
require 'oauth'
require 'json'

consumer_key = 'your consumer key'
consumer_secret = 'your consumer secret'
token = 'your token'
token_secret = 'your token secret'
api_host = 'http://api.yelp.com'

consumer = OAuth::Consumer.new(consumer_key, consumer_secret, {:site => api_host})
access_token = OAuth::AccessToken.new(consumer, token, token_secret)

path = "/v2/search?term=restaurants&location=Boulder,CO"

jresp = JSON.parse(access_token.get(path).body)

jresp['businesses'].each do | business |
  if business['is_closed'] == false
   printf("%-32s s = %1.1fn", 
        business['name'], business['phone'], 
        business['review_count'], business['rating'])
  end
end

项目清单 7 中的调整台会话突显了运营 项目清单 6 本子的示范输出。为了轻松一些,小编只展现了所返回的前头生龙活虎组公司,并不是永葆该 API 的节制/偏移特性(以执行八个调用来查找整个列表)。这段示例输出呈现了集团名称、电话号码、收到的口无遮拦数和平均评分。
清单 7. 演示 Yelp API Ruby 脚本

$ ./yelp.rb
Frasca Food and Wine       3034426966 189 4.5
John's Restaurant         3034445232  51 4.5
Leaf Vegetarian Restaurant    3034421485 144 4.0
Nepal Cuisine           3035545828  65 4.5
Black Cat Bistro         3034445500  72 4.0
The Mediterranean Restaurant   3034445335 306 4.0
Arugula Bar E Ristorante     3034435100  48 4.0
Ras Kassa's Ethiopia Restaurant  3034472919 101 4.0
L'Atelier             3034427233  58 4.0
Bombay Bistro           3034444721  87 4.0
Brasserie Ten Ten         3039981010 200 4.0
Flagstaff House          3034424640  86 4.5
Pearl Street Mall         3034493774  77 4.0
Gurkhas on the Hill        3034431355  19 4.0
The Kitchen            3035445973 274 4.0
Chez Thuy Restaurant       3034421700  99 3.5
Il Pastaio            3034479572 113 4.5
3 Margaritas           3039981234  11 3.5
Q's Restaurant          3034424880  65 4.0
Julia's Kitchen                 8 5.0

$

Yelp 提供了三个怀有优越文书档案的 API,以致数据描述、示例、错误管理等。就算Yelp API 很有用,但它的选取有必然的限定。作为软件原始开辟人士,您每天最多可进行100 次 API 调用,出于测量试验用场可施行 1,000 次调用。假如你的应用程序满足Yelp 的来得需要,每一日可实践 10,000 次调用(也恐怕进行更频仍)。

富含一个简便 mashup 的域地点

下四个演示将两段源代码连接起来,以生成音信。在本例中,您要将多个 Web 域名转移为它的平常地理地方。清单 8 中的 Ruby 脚本使用 Linux? host 命令和 OpenCrypt IP Location API Service 来搜寻地方消息。
清单 8. 检索 Web 域的地方音讯

#!/usr/bin/env ruby
require 'net/http'

aggr = ""
key = 'your api key here'

# Get the IP address for the domain using the 'host' command
IO.popen("host #{ARGV[0]}") { | line |
 until line.eof?
  aggr  = line.gets
 end
}

# Find the IP address in the response from the 'host' command
pattern = /d{1,3}.d{1,3}.d{1,3}.d{1,3}$/
if m = pattern.match(aggr)
  uri = "http://api.opencrypt.com/ip/?IP=#{m[0]}&key=#{key}"
  resp = Net::HTTP.get_response(URI.parse(uri))
  puts resp.body
end

在项目清单 8 中,您首先选取本地的 host 命令将域名调换为 IP 地址。(host 命令自身使用八个里面 API 和 DNS 剖析将域名剖判为 IP 地址。)您使用多个归纳的正则表达式(和 match 方法)从 host 命令输出中分析 IP 地址。有了 IP 地址,就可采纳 OpenCrypt 上的 IP 地方服务来索求通常地理地点音讯。OpenCrypt API 允许你试行最多 50,000 次无偿 API 调用。

OpenCrypt API 调用非常轻巧:您结构的 U奥迪Q7L 满含您要定位的 IP 地址和 OpenCrypt 注册进程提要求您的密钥。HTTP 响应正文满含 IP 地址、国家代码和国家名称。

清单 9 中的调整台会话展现了多个示例域名的出口。
清单 9. 接纳简易的域地方脚本

$ ./where.rb www.baynet.ne.jp
IP=111.68.239.125
CC=JP
CN=Japan
$ ./where.rb www.pravda.ru
IP=212.76.137.2
CC=RU
CN=Russian Federation
$

Google API 查询

Web API 方面四个斐然的优胜者是 谷歌。谷歌 拥有那样多的 API,甚至于它提供了另三个 API 来查询它们。通过 Google API Discovery 瑟维斯,您可列出 Google 提供的可用 API 并提取它们的元数据。尽管与多数谷歌 API 的相互要求开展身份验证,但您可因而三个雅安套接字连接访问查询 API。出于此原因,清单 10 使用 Ruby 的 https 类来布局与安全端口的接连。已定义的 U宝马X3L 钦命了 REST 乞请,况且响应选取了 JSON 编码。迭代响应并发生一小部分首推的 API 数据。
清单 10. 使用 Google API Discovery Service (gdir.rb) 列出 Google API

#!/usr/bin/ruby
require 'rubygems'
require 'net/https'
require 'json'

url = 'https://www.googleapis.com/discovery/v1/apis'

uri = URI.parse(url)

# Set up a connection to the Google API Service
http = Net::HTTP.new( uri.host, 443 )
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

# Connect to the service
req = Net::HTTP::Get.new(uri.request_uri)
resp = http.request(req)

# Get the JSON representation
jresp = JSON.parse(resp.body)

# Iterate through the API List
jresp['items'].each do | item |
 if item['preferred'] == true
  name = item['name']
  title = item['title']
  link = item['discoveryLink']
  printf("%-17s %-34s %-20sn", name, title, link)
 end
end

清单 11 中的调整台会话展现了运维项目清单 10 中脚本获得的响应示例。
清单 11. 接受简便的 Google 目录服务 Ruby 脚本

$ ./gdir.rb
adexchangebuyer  Ad Exchange Buyer API       ./apis/adexchangebuyer/v1.1/rest
adsense      AdSense Management API       ./apis/adsense/v1.1/rest
adsensehost    AdSense Host API          ./apis/adsensehost/v4.1/rest
analytics     Google Analytics API        ./apis/analytics/v3/rest
androidpublisher Google Play Android Developer API ./apis/androidpublisher/v1/rest
audit       Enterprise Audit API        ./apis/audit/v1/rest
bigquery     BigQuery API            ./apis/bigquery/v2/rest
blogger      Blogger API            ./apis/blogger/v3/rest
books       Books API             ./apis/books/v1/rest
calendar     Calendar API            ./apis/calendar/v3/rest
compute      Compute Engine API         ./apis/compute/v1beta12/rest
coordinate    Google Maps Coordinate API     ./apis/coordinate/v1/rest
customsearch   CustomSearch API          ./apis/customsearch/v1/rest
dfareporting   DFA Reporting API         ./apis/dfareporting/v1/rest
discovery     APIs Discovery Service       ./apis/discovery/v1/rest
drive       Drive API             ./apis/drive/v2/rest
...
storage      Cloud Storage API         ./apis/storage/v1beta1/rest
taskqueue     TaskQueue API           ./apis/taskqueue/v1beta2/rest
tasks       Tasks API             ./apis/tasks/v1/rest
translate     Translate API           ./apis/translate/v2/rest
urlshortener   URL Shortener API         ./apis/urlshortener/v1/rest
webfonts     Google Web Fonts Developer API   ./apis/webfonts/v1/rest
youtube      YouTube API            ./apis/youtube/v3alpha/rest
youtubeAnalytics YouTube Analytics API       ./apis/youtubeAnalytics/v1/rest
$

项目清单 11 中的输出突显了 API 名称、它们的标题,以至更深入分析种种 API 的 U奥迪Q5L 路线。

结束语

本文中的示例演示了公私 API 在从 Internet 提取消息方面包车型客车刚劲功效。与 Web 抓取和爬取 (spidering卡塔尔(قطر‎ 相比较,Web API 提供了访谈有指向性的一定音讯的力量。Internet 上在一再开立异价值,那不仅仅经过选用这一个 API 来兑现,还通过用新型的法子结合它们,从而向更扩充的 Web 客户提供新数据来贯彻。

可是请深深记住,使用 API 要求付出一定的代价。节制难题就常令人长吁短气。类似,或者在不通报你的景况下改善API 准绳那大器晚成实际,因而在营造应用程序时必得加以思谋。方今,Instagram校正了它的 API 来提供 “豆蔻梢头种越发意气风发致的心得”。那风姿潇洒转移对数不清恐怕被视为标准推特(TWTR.US卡塔尔国 Web 客商端竞争对手的第三方应用程序来说,无疑是一场灾祸。

你或者感兴趣的篇章:

  • ruby nokogori抓取尴尬事百科前10页并蕴藏进数据库示例
  • ruby完结网页图片抓取
  • Ruby达成网页图片抓取

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:天气查询,使用Ruby程序实现web信息抓取的教程