【问题标题】:Scraping: session ID from browser works, but session ID from scraping doesn't抓取:来自浏览器的会话 ID 有效,但来自抓取的会话 ID 无效
【发布时间】:2015-09-07 07:19:02
【问题描述】:

注意:出于显而易见的原因,我已将会话 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)

返回:

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)

将返回loggedInURL,以及登录用户的完整HTML。

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

  • 格式相同
  • 字符数相同(26 个字符)

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

有什么不同?

【问题讨论】:

  • 抓取的cookie是否包含控制字符,例如最后换行?

标签: javascript php node.js screen-scraping session-cookies


【解决方案1】:

PHP 有一些dubious extra security for sessionschecking Referer

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

【讨论】:

  • 我已经切换到使用超级代理的持久化选项,例如var agent = superagent.agent()。这为我处理了引用者、cookie 和其他与持久性相关的问题。由于上面的答案与该解决方案最接近,因此我将其标记为正确并给您这个表情符号玉米:?
【解决方案2】:

您可以尝试在对 GET 和 POST 的 superagent 调用中的标头中抛出不同的用户代理属性:

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

【讨论】:

【解决方案3】:

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

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

应该是这样的?

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

我觉得……

【讨论】:

  • 你是对的,但这是在为 StackOverflow 制作测试用例时出现的错误。我的真实代码在正确的位置有引号。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2016-01-23
  • 2021-04-03
相关资源
最近更新 更多