#node.js #web-scraping #text-files
#node.js #веб-скребок #текстовые файлы
Вопрос:
Я пытаюсь создать веб-скребок с помощью javascript, используя пакеты узлов, чтобы получить данные префикса asn с этого веб-сайта:http://bgp.he.net/AS2#_prefixes .
Это то, что у меня есть на данный момент:
var request = require('request');
var cheerio = require('cheerio');
apnList = {
'MIT': 3,
'Dynamics': 15,
'NYU': 12,
'Harvard': 11,
'Bull HN Information Sys': 6,
'NNIC': 22,
'Symbolics': 5,
'University of Delaware': 2
};
for (apn in apnList) {
var url = 'http://bgp.he.net/AS' apnList[apn] '#_prefixes'
request(url, (function(apn) { return function(err, resp, body) {
$ = cheerio.load(body);
console.log(body)
}})(apn));
}
Когда я запускаю файл в терминале, я получаю это:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /AS11
on this server.</p>
<hr>
<address>Apache/2.2.22 (Ubuntu) Server at bgp.he.net Port 80</address>
</body></html>
Для каждого числа. Как мне это исправить?
Также, дополнительный вопрос: В конце я хочу взять каждый номер asn из этого текстового файла и передать его в цикл for.
[asn.txt] 2014-06-30 02:05:03Z
This file contains a list of autonomous system numbers and names of all
registered ASNs. The column on the right below contains the ARIN
database "handle" of the technical, abuse or NOC contacts for the ASN.
Additional information may be obtained about any of the ASN contacts
in this list by querying the ARIN WHOIS server. For questions or updates
on this information please contact the ARIN Registration Services Hostmaster
staff, HOSTMASTER@ARIN.NET.
AS Number AS Name POC Handles
0 IANA-RSVD-0 IANA-IP-ARIN (Abuse), IANA-ARIN (Admin), IANA-IP-ARIN (Tech)
1 LVLT-1 IPADD5-ARIN (Tech), APL8-ARIN (Abuse), NOCSU27-ARIN (NOC), APL7-ARIN (Admin)
2 UDEL-DCN CASHJ-ARIN (Tech), NSS13-ARIN (Abuse), DJG2-ARIN (Tech), DJG2-ARIN (Admin)
3 MIT-GATEWAYS MNO78-ARIN (NOC), SILIS-ARIN (Admin), MNS18-ARIN (Abuse), SILIS-ARIN (Tech)
4 ISI-AS ACT-ORG-ARIN (Admin), ACT-ORG-ARIN (Abuse), ACT-ORG-ARIN (Tech)
5 SYMBOLICS SG52-ARIN (Tech), SG52-ARIN (Admin), SG52-ARIN (Abuse)
6 BULL-HN USINT-ARIN (Admin), ZB126-ARIN (Abuse), ZB126-ARIN (Tech), JLM23-ARIN (Tech)
7 RIPE-ASNBLOCK-7 ABUSE3850-ARIN (Abuse), RNO29-ARIN (Tech), RNO29-ARIN (Admin)
8 RICE-AS RUH-ORG-ARIN (Tech), RUH-ORG-ARIN (Admin), RUH-ORG-ARIN (Abuse)
9 CMU-ROUTER CH4-ORG-ARIN (Tech), CH4-ORG-ARIN (NOC), CMA3-ARIN (Abuse), CH4-ORG-ARIN (Admin)
10 CSNET-EXT-AS CS15-ARIN (Abuse), CS15-ARIN (Tech), CS15-ARIN (Admin)
11 HARVARD JNL17-ARIN (Admin), JNL17-ARIN (Tech
Это был всего лишь фрагмент этого. Это продолжается для многих тысяч чисел. Есть ли возможность выборочно извлекать каждое число из столбца AS number?
Ответ №1:
Кажется bgp.he.net блокирует попытки очистки своего сайта, возможно, на основе пользовательского агента. Вот почему вы получаете ошибку 403: доступ запрещен! Вы могли бы попробовать изменить пользовательский агент, который Node.js используется при получении удаленных URL-адресов (не уверен, как это сделать сразу), но, похоже, Hurricane Electric не любитель скребка, поэтому вам, вероятно, следует избегать его.
Комментарии:
1. Забыл вернуться и ответить на это. Да, объект options позволяет передавать в заголовке.
Ответ №2:
Забыл вернуться и ответить на это.
var request = require('request');
var cheerio = require('cheerio');
var fs= require('fs')
var filename="/scraping/asn.txt "
apnList = {
'MIT': 3,
'Dynamics': 15,
'NYU': 12,
'Harvard': 11,
'Bull HN Information Sys': 6,
'NNIC': 22,
'Symbolics': 5,
'University of Delaware': 2
};
for (apn in apnList) {
var options = {
url : 'http://bgp.he.net/AS' apnList[apn] '#_prefixes',
headers: {
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36'
}
};
request(options, (function(apn) { return function(err, resp, body) {
var $ = cheerio.load(body);
$('#table_prefixes4 tr').each(function(index, prefix) {
$(this).find('.nowrap').each(function(){
event = $(this).text().trim();
nextevent = $(this).next().text();
console.log(apn "," event "," nextevent)
});
});
}})(apn));
}