node爬虫遇上301重定向Moved Permanently

遇到场景:在爬取相关网站时,刚开始一段时间可以爬,过了一段时间后则爬取报错 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,网站通过校验请求信息是否存在Cookie,以及校验Cookie的值来判定发起访问请求的到底是真实的用户还是爬虫,第一次打开网页会生成一个随机cookie,如果再次打开网页如果这个Cookie不存在则会返回一个cookie,这就形成了301重定向的报错返回。有些网站也会通过访问次数、访问频率或请求的header来判断是否为爬虫
此处,是由于爬虫默认不保存cookie,所以网站不断返回301,不断返回cookie,导致报错

解决思路:爬虫在第一次访问网站时保存cookie,然后在第二次访问时带上cookie访问网站即可
代码:

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保存下来

参考资料:

  1. 关于cookie持久化
  2. Saving cookies

你可能感兴趣的:(node)