V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
bmos
V2EX  ›  Python

关于 Python 写爬虫使用 cookie 的问题,请教些 cookie 的知识

  •  
  •   bmos · 2018-08-31 13:56:56 +08:00 · 3700 次点击
    这是一个创建于 2270 天前的主题,其中的信息可能已经有所发展或是发生改变。
    RT,urllib 库, 在爬一个论坛的帖子详情的时候,只得到一堆加密的 JS 代码。忍着没问,捣鼓了几天,解密 js,发现是实现重定向的,并生成两个 cookie。并且发现是否要求重定向是和 cookie 有关,浏览器正常访问,保存了 cookie 就不会要求重定向,删除 COOKIE,关闭 js,就卡在了重定向页面。
    因此先使用 selenium 获取了 cookie,按照 MozillaCookieJar 的格式保存。这时候有 11 个 cookie,应该都是 js 生成的。然后 urllib 加载。单次测试成功了,没有重定向。但是加代理,多开了几个线程,使用同一个 cookie,就各种失败。
    因此问题来了:
    1、还要分析 cookie 到底是干嘛的,如何入门 cookie 的相关知识。
    2、本来用 selenium +chrome 也可以,但是加上 IP 代理后,好像网页从来没有打开过,全部失败。代理也验证过,虽然不能 100%使用,70%以上都可以用。甚至同样的代理,用 urllib 库就能正常获取数据。
    10 条回复    2018-11-25 00:27:11 +08:00
    huaerxiela
        1
    huaerxiela  
       2018-08-31 14:29:35 +08:00
    要看你这个 js 的情况吧,1,先用代码请求,得到 js 用 requests_html 执行 js 看看 cookie 能不能生成(有的不行),2,和你说的类似,puppeteer 访问获取 cookie,再加到代码中执行 ,3,看 js 生成 cookie 逻辑,是否方便用 py 或 node 代码进行模拟,这个可以解决你那个代理问题,避免使用同一个 cookie,4,方便说下哪个论坛的 js 吗,想研究下
    bmos
        2
    bmos  
    OP
       2018-08-31 14:46:01 +08:00
    @huaerxiela www.19lou.com 是否有办法定位 cookie 是哪段 js 生成的?
    huaerxiela
        3
    huaerxiela  
       2018-08-31 15:00:01 +08:00
    @bmos 找到生成逻辑了,我尝试写下,一会告诉你
    yumenlong
        4
    yumenlong  
       2018-08-31 15:18:10 +08:00
    每个代理使用不用的 cookie 试试。
    huaerxiela
        5
    huaerxiela  
       2018-08-31 16:01:45 +08:00   ❤️ 1
    import requests
    import re


    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
    'Host': 'www.19lou.com'
    }
    s = requests.session()
    s.headers = headers
    res = s.get('https://www.19lou.com/forum-269-thread-41401535624978493-1-1.html')
    redirect_url = res.url
    result_cookie = re.search(r'substr\|(.*?)\|365', res.text).group(1)
    result_cookie = result_cookie.split('|')
    s.cookies.update({result_cookie[0]: result_cookie[1]})
    url = redirect_url.replace('https://www.19lou.com/safeRedirect.htm?', '')
    res = s.get(url)
    print(res.text)

    你看看可以满足你要的要求了吗,本来我想用 execjs 执行返回的 js 的代码,但预期结果总是不符,我发现用 node 去执行,却总是正确的,后来我发现这个 cookie 的键值就存在于返回的 js 中,所以最后就直接提取了,我访问了两个链接,cookie 的键值总是不变,感觉这个 cookie 存在的意义不大啊,也可能还存在潜在的反爬
    qybing
        6
    qybing  
       2018-09-01 13:16:30 +08:00
    @huaerxiela 我也遇到这类的问题了,在爬大众点评商铺详细信息的时候,如果直接访问商铺信息详情页访问不到,必须先访问一次首页,在访问详情页就可以访问到,其中好像就是 COOkie 值被加密了,大佬可有解决方案,js 加密搞 2 天了,始终没有找到怎么生成的
    zaaazaa
        7
    zaaazaa  
       2018-09-01 14:17:00 +08:00
    用 requests 模块呀,用 session 来 get 和 post,根本不用考虑 cookies 的问题
    huaerxiela
        8
    huaerxiela  
       2018-09-03 09:56:55 +08:00   ❤️ 1
    @qybing 我也是菜鸡呀,你把关键步骤或主要代码贴下,我试试,不然我找着麻烦,还有别的事
    bmos
        9
    bmos  
    OP
       2018-09-03 10:37:52 +08:00
    @huaerxiela 非常感谢。可以使用。

    @zaaazaa 为什么不需要考虑?如果没有 cookie 的话就会要求到重定向页面,获取不到内容。
    zaaazaa
        10
    zaaazaa  
       2018-11-25 00:27:11 +08:00
    @bmos requests 库会自动处理重定向的,比自带的好用,反正用楼上那段就对了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1102 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:34 · PVG 02:34 · LAX 10:34 · JFK 13:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.