Web scraping 从维基百科抓取数据

Web scraping 从维基百科抓取数据,web-scraping,wikipedia,wikipedia-api,Web Scraping,Wikipedia,Wikipedia Api,我试图找到或建立一个网络刮板,能够通过并找到美国的每个州/国家公园,以及它们的GPS坐标和土地面积。我已经研究了一些框架,比如Scrapy,然后我发现有一些专门针对维基百科的网站,比如。这两种方法中的任何一种都有什么特别的优点,或者哪一种方法能更好地将信息加载到在线数据库中?我认为这不是最好的方法 我的想法是从openstreetmap.org(或任何其他您可以查询的基于地理位置的API)转到API,并请求它提供您想要的数据。国家公园很容易找到。您可以从Wikipedia这样的来源获取这些名称,

我试图找到或建立一个网络刮板,能够通过并找到美国的每个州/国家公园,以及它们的GPS坐标和土地面积。我已经研究了一些框架,比如Scrapy,然后我发现有一些专门针对维基百科的网站,比如。这两种方法中的任何一种都有什么特别的优点,或者哪一种方法能更好地将信息加载到在线数据库中?

我认为这不是最好的方法

我的想法是从openstreetmap.org(或任何其他您可以查询的基于地理位置的API)转到API,并请求它提供您想要的数据。国家公园很容易找到。您可以从Wikipedia这样的来源获取这些名称,然后让ony的GeoAPI为您提供所需的信息


顺便说一句,有什么问题吗?

让我们假设您想要像这样解析页面。下面的代码应该可以工作

var doc=new HtmlDocument();
doc=//在这里加载文档。请参阅doc.Load(..),doc.LoadHtml(..)等。
//我们从表中获取所有行(标题除外)
var rows=doc.DocumentNode.SelectNodes(//table[contains(@class,'sortable')]//tr”)。跳过(1);
foreach(行中的变量行){
var name=HttpUtility.HtmlDecode(行.SelectSingleNode(“./*[1]/a[@href和@title]”).InnerText);
var loc=HttpUtility.HtmlDecode(row.SelectSingleNode(“.//span[@class='geo-dec']”)。InnerText);
var areaNodes=row.SelectSingleNode(“./*[5]”)。ChildNodes.Skip(1);
字符串区域=”;
foreach(区域节点中的变量a){
area+=HttpUtility.HtmlDecode(a.InnerText);
}
Console.WriteLine(“{0,-30}{1,-20}{2,-10}”,名称,位置,区域);
}
我测试了它,它产生了以下输出:

Acadia                         44.35A°N 68.21A°W    47,389.67 acres (191.8 km2)
American Samoa                 14.25A°S 170.68A°W   9,000.00 acres (36.4 km2)
Arches                         38.68A°N 109.57A°W   76,518.98 acres (309.7 km2)
Badlands                       43.75A°N 102.50A°W   242,755.94 acres (982.4 km2)
Big Bend                       29.25A°N 103.25A°W   801,163.21 acres (3,242.2 km2)
Biscayne                       25.65A°N 80.08A°W    172,924.07 acres (699.8 km2)
Black Canyon of the Gunnison   38.57A°N 107.72A°W   32,950.03 acres (133.3 km2)
Bryce Canyon                   37.57A°N 112.18A°W   35,835.08 acres (145.0 km2)
Canyonlands                    38.2A°N 109.93A°W    337,597.83 acres (1,366.2 km2)
Capitol Reef                   38.20A°N 111.17A°W   241,904.26 acres (979.0 km2)
Carlsbad Caverns               32.17A°N 104.44A°W   46,766.45 acres (189.3 km2)
Channel Islands                34.01A°N 119.42A°W   249,561.00 acres (1,009.9 km2)
Congaree                       33.78A°N 80.78A°W    26,545.86 acres (107.4 km2)
Crater Lake                    42.94A°N 122.1A°W    183,224.05 acres (741.5 km2)
Cuyahoga Valley                41.24A°N 81.55A°W    32,860.73 acres (133.0 km2)
Death Valley                   36.24A°N 116.82A°W   3,372,401.96 acres (13,647.6 km2)
Denali                         63.33A°N 150.50A°W   4,740,911.72 acres (19,185.8 km2)
Dry Tortugas                   24.63A°N 82.87A°W    64,701.22 acres (261.8 km2)
Everglades                     25.32A°N 80.93A°W    1,508,537.90 acres (6,104.8 km2)
Gates of the Arctic            67.78A°N 153.30A°W   7,523,897.74 acres (30,448.1 km2)
Glacier                        48.80A°N 114.00A°W   1,013,572.41 acres (4,101.8 km2)
(...)
我认为这是一个开始。如果某个页面失败,您必须查看布局是否更改,等等


当然,您还必须找到一种获取所有要解析的链接的方法


一件很重要的事:你知道维基百科是否被允许删除吗?我不知道,但你应该在做之前看看是否<代码>;)

尽管这个问题有点老了,但现在可用的另一种选择是避免任何刮取并直接从中获取原始数据-它包含来自和的数据。(披露:我曾为制作和维护数据库和网站的组织工作。)


非商业用途是免费的,但您需要注册才能下载。例如,您可以下载美国22600个保护区,分别为KMZ、CSV和SHP(包含lat、lng、边界、IUCN类别和一系列其他元数据)。

维基百科的列表非常棒,这正是我想要的,但我想将其放入地图中,并需要GPS坐标。所以你对openstreet进行查询的想法很好,但我试图通过删除数据来节省时间,这样我就不必剪切和粘贴数据了all@OscarMederos这是一个我一直在思考的页面示例:复制表格内容->粘贴到电子表格软件->在包含多个数据段的列上使用数据到列功能->另存为什么当然,你还必须解析经纬度,但这不是一个刮片任务。@clifgray-hmm,我想我不明白你的问题。你知道C#吗?这是一个C代码,它使用HtmlAgilityPack。如果您将代码复制并粘贴到编译器或其他东西中,它当然不会编译。它甚至没有打开维基百科页面。我只是给你一些技巧,告诉你如何在使用C语言和HtmlAgilityPack下载文档后解析它。你是程序员吗?