【问题标题】:Scrapy: set cookies for a response (no from request)Scrapy:为响应设置 cookie(不来自请求)
【发布时间】:2021-04-11 01:33:33
【问题描述】:

我需要以美元货币提取一些工资,但我从另一个国家/地区访问该页面,然后显示的货币是当地(瑞尔)货币,没有美元。所以,我发送 cookie 来请求新货币和新国家

在我的设置中:

COOKIES_ENABLED = False
COOKIES_DEBUG = True

在我使用的蜘蛛中:

class HtSpider(scrapy.Spider):
    name = 'sells'
    allow_domain = ['hattrick.org']

    def start_requests(self):
        urls = ['https://www.hattrick.org']
        for url in urls:
            player = 'goto.ashx?path=/Club/Players/Player.aspx?playerId=450940600'
            joint = urljoin(url, player)
            yield scrapy.Request(
                url=joint,
                cookies={'currency': 'USD', 'country': 'US'},
                # meta={'dont_merge_cookies': True},
                dont_filter=True,callback=self.price)
    def price(self,response):
       price_xpath = response.xpath('//* [@id="transferHistory"]/table//tr[1]/td[6]/text()').extract_first()
       print(price_xpath) // it is not in USD but in Riel :(
       open_in_browser(response) // to check if it is in Riel or in USD

然后,从我获得的 cookie 调试中:

DEBUG: Sending cookies to: <GET https://www.hattrick.org/en/Club/Players/Player.aspx?playerId=450940600> 
Cookie: currency=USD; country=US; currency=USD; country=US; ASP.NET_SessionId=xxxxx
2021-01-05 16:33:13 [scrapy.downloadermiddlewares.cookies] DEBUG: Received cookies from: <200 https://www.hattrick.org/en/Club/Players/Player.aspx?playerId=450940600>
Set-Cookie: InitialOrigin=Origin=direct|&DateSet=2021-01-05 10:33:13;

**Print price: 2 280 000 Riel**

如何获取我在请求中发送的 cookie,而不是来自网站的 cookie?简而言之……如何获得美元而不是瑞尔?

【问题讨论】:

    标签: python cookies scrapy request response


    【解决方案1】:

    首先,您是否使用 Postman 进行了测试,以确保它确实可以与此 cookie 一起使用?

    如果您有COOKIES_ENABLED = False,则scrapy 不会将您的cookie 发送到目标服务器。由于您只向服务器发送一个请求,因此不会考虑来自服务器的 cookie。所以设置COOKIES_ENABLED = True应该可以解决。

    但是,如果您需要向服务器发送多个请求,那么这可能不起作用,因为来自服务器的 set_cookies 标头可能会覆盖您的 cookie。

    为了解决这个问题,我会设置COOKIES_ENABLED = False。 然后像这样发送请求:

    yield scrapy.Request(
        url=joint,
        headers={
             'cookies': 'currency:USD;country:US'
        }
        dont_filter=True,callback=self.price)
    

    我正在使用标头而不是 cookie,因为如果您在设置中禁用了 cookie,则会考虑使用 cookie 字段。

    【讨论】:

    • 嗨@felix-eklöf,谢谢你的回答。我尝试了Cookies_enable(False 和 True)和Headers 的两个选项,但问题仍然存在。我可以发送 Cookie,但它们不会覆盖来自服务器的 Cookie。还有其他建议吗?
    • 我仔细查看了该网站,即使我在网站上将语言更改为 en-US,我仍然以当地货币获得工资。而且我在任何地方都找不到您附加的标题,您在哪里找到的?对我来说,服务器似乎在服务器端进行地理定位。有时您可以使用 Accept-Language 标头绕过它,但它不适用于此服务器。我能想到的唯一选择是使用代理 API 和美国地理定位。
    • 嗨菲利克斯。是的,我与 Postman 核实过,它是地理定位的。我会按照你的建议检查代理 API。
    猜你喜欢
    • 2016-07-26
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多