V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ericgui
V2EX  ›  PHP

PHP 爬虫:怎样拿到浏览器的 cookie?

  •  
  •   ericgui · 2017-10-29 11:13:29 +08:00 · 8791 次点击
    这是一个创建于 2572 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们用 PHP 写爬虫,需要在 guzzle 的 request options 里的 header 里,加上 cookie
    现在都是手动,就是先用浏览器点开网站,F12,复制 cookie,粘贴到代码里,
    这很傻逼,一方面 cookie 过一段会失效,二方面,始终无法自动获取到 cookie

    Python 的 requests 包就可以,但显然我还是希望用 php 解决问题。

    尝试过各种方式,均失败。

    各位有什么好的建议么?

    还有一个疑惑,这属于 HTTP 协议学得不好,也来请教一下:

    如果首次访问网站,仍然会有 cookie,而且 cookie 里包含有 sessionID,这就很邪门,
    如果要爬取的网页不是首次访问网站, 这个可以理解,因为你已经和网站建立连接了,当然会有 sessionID。
    但首次访问网站,仍然会有 sessionID 包含在 cookie 里,实在理解不能,这 sessionID 哪里来的? TCP 三次握手的时候 server 发送的?

    请高人赐教。
    15 条回复    2017-11-10 19:48:46 +08:00
    lifeintools
        1
    lifeintools  
       2017-10-29 11:19:03 +08:00 via iPhone
    使用自动化工具,获取 cookie.那些浏览器测试用的框架。可以考虑下。selenium
    lhx2008
        2
    lhx2008  
       2017-10-29 11:27:10 +08:00 via Android
    在 php 里面模拟登录,就可以拿到 cookies 了,如果要半自动就在 php 里面执行 python 的 selenium 弹浏览器拿 cookies 再返回给 php
    第一次访问没 cookies,访问后网站会给你一个 cookies,里面有 seeson id
    jugelizi
        3
    jugelizi  
       2017-10-29 11:31:04 +08:00
    你都会 F12 了把浏览器清空看 header 的 set-cookie
    还有 curl 是可以拿到 cookie 的
    ericgui
        4
    ericgui  
    OP
       2017-10-29 12:04:45 +08:00
    @lifeintools facebook webdriver 难用的一逼
    AchillesNeo
        5
    AchillesNeo  
       2017-10-29 12:07:02 +08:00
    ### 服务端测试结果

    UserSystem_BasicDataService_TestCase_20160415110013 测试完成,共 7 个测试用例,成功 6 个,失败 1 个。
    gouchaoer
        6
    gouchaoer  
       2017-10-29 12:10:35 +08:00 via Android
    Facebook webdriver 写的很好啊,拿来驱动 selenium 毫无问题,至于自动管理 cookie 的话 guzzle 应该会解析 header 里的 cookie 更新 httpclient 缓存的吧
    wdlth
        7
    wdlth  
       2017-10-29 12:13:05 +08:00
    guzzle 不是有 CookieJar 么?可以保存 Cookie,再利用的。
    allenhu
        8
    allenhu  
       2017-10-29 15:21:16 +08:00 via Android
    不知道 cookiejar 吗?
    skyjerry
        9
    skyjerry  
       2017-10-29 16:45:03 +08:00 via iPhone
    sessionid 为什么会想到 tcp 三次握手?请求服务器的资源,服务器返回给你的东西带着 session 很奇怪吗?
    jq8778
        10
    jq8778  
       2017-10-29 17:27:27 +08:00
    COOKIE 植入一般有两种
    一种是 HTTP 服务端返回 SET COOKIE,这种很好读
    还有一种是用 JS 来植入
    这种就要分析对应代码了...
    to2false
        11
    to2false  
       2017-10-30 09:29:33 +08:00
    @skyjerry 感觉他需要先补充下基本知识
    8355
        12
    8355  
       2017-10-30 09:49:16 +08:00
    只用这个保存到文件就可以了啊.... 楼上讨论那么多在说啥...
    curl 可以保存 cookie 的

    http://php.net/manual/zh/function.curl-setopt.php
    CURLOPT_COOKIEJAR
    mingyun
        13
    mingyun  
       2017-11-05 20:46:59 +08:00
    @8355
    picone
        14
    picone  
       2017-11-06 16:22:28 +08:00
    如果用 curl 提取的话,可以获取返回的 header,正则提取出你需要的 cookie。
    如果只是一个用户的话可以用 CURLOPT_COOKIEJAR,不过这个玩意要读文件,不方便存数据库里面,而且无用的 cookie 可能很多。
    wk110
        15
    wk110  
       2017-11-10 19:48:46 +08:00
    学习到了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3587 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:02 · PVG 13:02 · LAX 21:02 · JFK 00:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.