node.js - Questions sur les romans d'exploration de robots Node
巴扎黑
巴扎黑 2017-05-16 13:38:49
0
1
606
最近因为没小说看,也无聊,就想着用Node来写爬虫爬书下来,弄了好几天有些问题。
爬小说异步的话章节不是顺序排列的,所以用了sync-request进行同步操作,我爬的是笔趣阁这个网站上的书,现在由于刚学,只是做了爬单本书的。我发现在爬取的时候,会假死掉,停在那不动了,而且每次的章节数不同,我就加了个十秒的timeout超时,但是还是会出现这种假死的情况。后来百度了下,说网站是有防止爬虫的东东的,具体我也不太清楚==,我就想,那我就加个间隔咯,我让他每请求十次就休息20秒钟,再重新爬。结果!!!还是会假死,233333。所以现在有点不明白为啥了,想求教一下,给点思路。拜托各位~~

Voici le code que j'ai demandé. J'ai exploré la liste de chapitres spécifiques dans un autre js et je l'ai écrit en json. Ici, je demande directement chaque lien :

.
var http = require('http')
var fs = require('fs')
var cheerio = require('cheerio')
var iconv = require('iconv-lite')
var request = require('sync-request')
var urlList = JSON.parse(fs.readFileSync('list.json', 'utf-8'))
var header = JSON.parse(fs.readFileSync('header.json'), 'utf-8')

//爬取每章节正文并存在txt中
function getContent(list,title) {
  //用try catch进行错误捕获,防止报错跳出
  try{
    var res = request('GET',list.link,{
      'timeout': 10000,
      'retry': true,
      'retryDelay': 10000
    })
    var html = iconv.decode(res.body, 'utf8')
    var $ = cheerio.load(html,{
      decodeEntities: false
    })
    var ContentTitle = $('.bookname h1').text()
    var ContentText = $('#content').text().trim().replace('readx();', '').replace(/\ /g, '')
    fs.appendFileSync(title+".txt", ContentTitle)
    fs.appendFileSync(title+".txt", ContentText)
    console.log("爬取" + list.link + "成功")
  }catch(err) {
    console.log("爬取" + list.link + "出错")
  }
}

//为了达到间隔的调用请求做了递归调用
function getUrl(index) {
  for (let i = index;i < urlList.length;i++){
    if (i>0 && i%10 == 0){
      getContent(urlList[i],header.title)
      console.log("休息一下")
      setTimeout(() => {
        i++
        getUrl(i)
      },20000)
      return
    }else {
      console.log(i)
      getContent(urlList[i],header.title)
    }
  }
}

getUrl(0)


C'est la même chose que celui-ci. Après avoir grimpé pendant un moment, ça s'est arrêté comme ça. Peu importe combien de temps j'attends, il n'y a aucun mouvement et les autres choses n'ont pas de réponse.

巴扎黑
巴扎黑

répondre à tous(1)
漂亮男人

Je suis confronté à ce problème depuis deux jours. Au début, je pensais qu'il s'agissait d'un problème de demande de synchronisation, mais je l'ai ensuite remplacé par autre chose et il est toujours resté le même. J'ai deviné que le site Web IP était peut-être bloqué ou quelque chose du genre. Plus tard, j'ai discuté avec mes collègues pendant le déjeuner et j'ai demandé conseil. Ils m'ont dit que c'était probablement le problème. Dans ce cas, je suis allé chercher des IP proxy gratuites, puis lors de la demande, tant que la demande expire ou qu'une erreur est signalée, je passerai immédiatement à une adresse IP pour faire la demande. De cette façon, j'ai grimpé un grand roman hier. Quand je suis arrivé au travail aujourd'hui, j'ai vu que tout était descendu et qu'il n'y avait aucun problème, haha. Cependant, de nombreuses adresses IP proxy gratuites ne peuvent pas être utilisées, ce qui fait perdre une partie du temps. Commençons maintenant par voir comment explorer plusieurs livres, ↖(^ω^)↗

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal