我正在尝试使用urllib转到许多不同的URL来获取一些HTML并解析它。我有一个循环,应该通过urllib进行大约5000次迭代:
urllib.request('a url here', options=[timeout=50000]).then(function (result) {
// data is Buffer instance
var $ = cheerio.load(result.data);
$('dt').each(function () {
var news_html = cheerio.load($(this).html());
if (news_html('span.timestamp').html() != null) {
var date = news_html('span.timestamp').html();
var description = news_html('.story_title').html();
var link = news_html('a').attr('href');
var post = {description: description, date: date, link: link};
pool.query('INSERT INTO db SET ?', post, function (err, result) {
if (err) {
console.log(err);
}
});
}
});
}).catch(function (err) {
console.error(err);
});
经过大约100次迭代后,我收到了这个错误:
{ ResponseTimeoutError: Response timeout for 5000ms, GET http://www.streetinsider.com/stock_lookup_news.php?q=CREG&type=major_news -1 (connected: true, keepalive socket: false)
headers: {}
at Timeout._onTimeout (/Users/max/projects/stock-news-angular/node_modules/urllib/lib/urllib.js:715:15)
at tryOnTimeout (timers.js:232:11)
at Timer.listOnTimeout (timers.js:202:5)
name: 'ResponseTimeoutError',
requestId: 595,
data: undefined,
path: '/stock_lookup_news.php?q=CREG&type=major_news',
status: -1,
headers: {},
res:
{ status: -1,
statusCode: -1,
headers: {},
size: 0,
aborted: false,
rt: 10030,
keepAliveSocket: false,
data: undefined,
requestUrls: [ 'http://www.streetinsider.com/stock_lookup_news.php?q=CREG&type=major_news' ],
timing: null,
remoteAddress: '162.242.133.50',
remotePort: 80 } }
如何才能增加超时时间,以便完成循环并将所有必需的数据插入MySQL数据库?我想我没有正确理解如何设置超时,因为npm的urllib确实有一个设置它的选项。
答案 0 :(得分:0)
我认为为request()函数添加timeout
选项args可以解决您的问题。
在API doc中:
超时号码| Array - 连接阶段和响应接收阶段的请求超时(以毫秒为单位)。默认为exports.TIMEOUT,两者都是5s。您可以使用timeout:5000来告诉urllib在两个阶段使用相同的超时或单独设置它们,例如timeout:[3000,5000],这会将连接超时设置为3s并响应5s。