Node爬虫類が301に会ってMoved Permanentlyにリダイレクト

1677 ワード

シーンに遭遇しました:関連するウェブサイトを登る時、ちょうどしばらくの時間が登ることができて、しばらくの時間が過ぎた後に登り間違えて301 Moved Permanentlyを報告して、ブラウザはウェブサイトを開くのが正常です.次のコードは、エラーが発生した場合のものです.
const charset = require('superagent-charset')
const request = require('superagent')
//                  
request.get(url)
      .charset(charset)
      .timeout(20000)
      .end(res=>{
      		console.log(res.text)
      )

どうして301に出会ったの?
サイトはクッキーを認識することによってアンチ爬虫対策を行うため、ユーザがターゲットサイトにリクエストを送信すると、リクエストデータにクッキーが携帯され、サイトはリクエスト情報にクッキーが存在するかどうかを検証し、クッキーの値を検証することによってアクセスリクエストを開始したのが実際のユーザなのか爬虫類なのかを判定し、初めてページを開くとランダムクッキーが生成される.再びウェブページを開くと、このCookieが存在しない場合、cookieが返され、301リダイレクトのエラーリターンが形成される.一部のサイトでは、アクセス回数、アクセス頻度、またはリクエストされたヘッダによって爬虫類であるかどうかを判断することもあります.ここでは、爬虫類がクッキーをデフォルトで保存しないため、301を返し続け、クッキーを返し続け、エラーが発生します.
解決策:爬虫類は1回目のウェブサイトへのアクセス時にクッキーを保存し、2回目のアクセス時にクッキーを持ってウェブサイトにアクセスすればコードが得られる.
const charset = require('superagent-charset')
const request = require('superagent')
const agent = requset.agent()
headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'
}
//                  
agent.get(url)
      .charset(charset)
      .timeout(20000)
      .catch(err => {
        if (err.status === 301) {
          headers.Cookie = err.response.headers['set-cookie'].toString()
          return agent.get(url).set(headers)
            .charset(charset)
            .timeout(20000)
        }
        return Promise.reject(err)
      })

Agentオブジェクトはリクエストを複数回開始するとクッキーを保存します
参考資料:
  • cookie持続化
  • について
  • Saving cookies