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

Berikut ialah kod yang saya minta saya merangkak keluar senarai bab tertentu dalam js lain dan menulisnya dalam json Di sini saya meminta setiap pautan secara langsung

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)


Sama seperti yang ini Selepas mendaki, ia hanya berhenti seperti ini
巴扎黑
巴扎黑

membalas semua(1)
漂亮男人

Saya telah menangani masalah ini sejak dua hari lalu. Pada mulanya saya fikir ia adalah masalah permintaan penyegerakan, tetapi kemudian saya menukarnya kepada perkara lain dan ia masih kekal. Saya meneka bahawa mungkin laman web IP telah disekat atau sesuatu Kemudian, saya berbual dengan rakan sekerja saya semasa makan tengah hari dan meminta nasihat Mereka berkata bahawa ini mungkin masalahnya. Dalam kes ini, saya pergi untuk mendapatkan beberapa IP proksi percuma, dan kemudian apabila meminta, selagi masa permintaan tamat atau ralat dilaporkan, saya akan segera bertukar kepada alamat IP untuk membuat permintaan. Dengan cara ini, saya memanjat novel besar semalam apabila saya datang ke tempat kerja hari ini, saya melihat semuanya telah naik dan tidak ada masalah, haha. Walau bagaimanapun, banyak IP proksi percuma tidak boleh digunakan, jadi sebahagian daripada masa terbuang untuk perkara ini. Sekarang mari kita mula melihat cara merangkak berbilang buku, ↖(^ω^)↗

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan