抓取:来自浏览器的会话 ID 有效,但来自抓取的会话 ID 无效

Scraping: session ID from browser works, but session ID from scraping doesn't

注意:出于显而易见的原因,我已将会话 ID 的最后 5 个字符替换为“x”

我正在抓取一个网站。我可以在浏览器中看到,登录设置了一个名为 PHPSESSID 的 cookie 值。没问题,我可以抓取:

superagent
    .post(loginUrl)
    .send(loginDetails)
    .end(function(err, res){
        var setCookieValue = res.headers['set-cookie'][0]
        var sessionID = cookieParser.parse(setCookieValue).PHPSESSID
        console.log(sessionID)

Returns:

37c3bog3tf6erp2i6ss5vxxxxx

这看起来像一个 PHP 会话 ID。伟大的!现在使用会话 ID:

superagent
.get(loggedInURL)
.set('Cookie', 'PHPSESSID'=sessionID)
.end(err, res)

将我重定向到登录页面。但是 我从浏览器手动获取的会话 ID,格式完全相同,工作正常:

var fakeSessionID = 'a1oslk341uoht8p6009q5xxxxx'
superagent
.get(loggedInURL)
.set('Cookie', 'PHPSESSID='+fakeSessionID)

将 return 已登录用户的完整 HTML loggedInURL。

为什么我抓取的会话 ID 不起作用?

除了会话 ID 之外,工作代码和非工作代码之间没有任何不同。

有什么不同?

您可以尝试在 GET 和 POST 的超级代理调用中的 header 中抛出不同的 user-agent 属性:

  .set('User-Agent','Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0')

您的代码看起来没有用实际的 sessionID 值替换字符串 "sessionID"...

superagent
.get(loggedInURL)
.set('Cookie', 'PHPSESSID=sessionID')
.end(err, res)

应该是这样的吧?

superagent
.get(loggedInURL)
.set('Cookie', 'PHPSESSID='+sessionID)
.end(err, res)

我觉得...

PHP 有一些 dubious extra security for sessions such as checking Referer.

一些网站可能另外check User-Agent