在请求中发现 Scrapy 和无效的 cookie

网页抓取需求

要从此处的eventbrite 链接的第一页抓取事件的标题。

方法

虽然该页面没有太多的 javascript,而且页面分页也很简单,但抓取页面上每个事件的标题非常容易,并且没有问题。

但是我看到有一个 API,我想重新设计 HTTP 请求,以提高效率和结构化数据。

问题

我能够使用 requests python 包模拟 HTTP 请求,使用正确的标头、cookie 和参数。不幸的是,当我将相同的 cookie 与 scrapy 一起使用时,它似乎在抱怨 cookie 字典中的三个键是空白的'mgrefby': '''ebEventToTrack': '''AN': '', 。尽管它们在与请求包一起使用的 HTTP 请求中是空白的。

请求包代码示例

import requests


cookies = {

    'mgrefby': '',

    'G': 'v%3D2%26i%3Dbff2ee97-9901-4a2c-b5b4-5189c912e418%26a%3Dd24%26s%3D7a302cadca91b63816f5fd4a0a3939f9c9f02a09',

    'ebEventToTrack': '',

    'eblang': 'lo%3Den_US%26la%3Den-us',

    'AN': '',

    'AS': '50c57c08-1f5b-4e62-8626-ea32b680fe5b',

    'mgref': 'typeins',

    'client_timezone': '%22Europe/London%22',

    'csrftoken': '85d167cac78111ea983bcbb527f01d2f',

    'SERVERID': 'djc9',

    'SS': 'AE3DLHRwcfsggc-Hgm7ssn3PGaQQPuCJ_g',

    'SP': 'AGQgbbkgEVyrPOfb8QOLk2Q893Bkx6aqepKtFsfXUC9SW6rLrY3HzVmFa6m91qZ6rtJdG0PEVaIXdCuyQOL27zgxTHS-Pn0nHcYFr9nb_gcU1ayxSx4Y0QXLDvhxGB9EMsou1MZmIfEBN7PKFp_enhYD6HUP80-pNUGLI9R9_CrpFzXc48lp8jXiHog_rTjy_CHSluFrXr2blZAJfdC8g2lFpc4KN8wtSyOwn8qTs7di3FUZAJ9BfoA',

}


headers = {

    'Connection': 'keep-alive',

    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Mobile Safari/537.36',

    'X-Requested-With': 'XMLHttpRequest',

    'X-CSRFToken': '85d167cac78111ea983bcbb527f01d2f',

    'Content-Type': 'application/json',

    'Accept': '*/*',

    'Origin': 'https://www.eventbrite.com',

    'Sec-Fetch-Site': 'same-origin',

    'Sec-Fetch-Mode': 'cors',

    'Sec-Fetch-Dest': 'empty',

    'Referer': 'https://www.eventbrite.com/d/ny--new-york/human-resources/?page=2',

    'Accept-Language': 'en-US,en;q=0.9',

}


莫回无
浏览 119回答 2
2回答

白猪掌柜的

看起来他们正在使用not value而不是更准确的value is not None. 打开一个问题是你唯一的长期资源,但是子类化 cookie 中间件是短期的,非 hacky 修复。一个 hacky 修复是利用这样一个事实,即他们在执行此操作时没有正确转义 cookie 值,'; '.join()因此您可以将 cookie 的值设置为合法的 cookie 指令(我选择是HttpOnly因为您不关心 JS),然后cookiejar出现丢弃它,产生你关心的实际价值>>> from scrapy.downloadermiddlewares.cookies import CookiesMiddleware>>> from scrapy.http import Request>>> cm = CookiesMiddleware(debug=True)>>> req = Request(url='https://www.example.com', cookies={'AN': '; HttpOnly', 'alpha': 'beta'})>>> cm.process_request(req, spider=None)2020-08-01 15:08:58 [scrapy.downloadermiddlewares.cookies] DEBUG: Sending cookies to: <GET https://www.example.com>Cookie: AN=; alpha=beta>>> req.headers{b'Cookie': [b'AN=; alpha=beta']}

慕斯王

目前的解决方案是使用旧版本的 scrapy(2.2.0 或更低版本),因为最新的 2.3.0 是添加此 cookie 检查的地方。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python