Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scrapy:为响应设置Cookie(请求没有)_Python_Cookies_Scrapy_Request_Response - Fatal编程技术网

Python Scrapy:为响应设置Cookie(请求没有)

Python Scrapy:为响应设置Cookie(请求没有),python,cookies,scrapy,request,response,Python,Cookies,Scrapy,Request,Response,我需要提取一些美元货币的工资,但我正在访问另一个国家的网页,然后,显示的货币是当地(瑞尔)一个,没有美元。所以,我发送cookies请求一种新的货币和一个新的国家 在设置中,我有: COOKIES_ENABLED = False COOKIES_DEBUG = True 在我使用的蜘蛛中: class HtSpider(scrapy.Spider): name = 'sells' allow_domain = ['hattrick.org'] def start_re

我需要提取一些美元货币的工资,但我正在访问另一个国家的网页,然后,显示的货币是当地(瑞尔)一个,没有美元。所以,我发送cookies请求一种新的货币和一个新的国家

在设置中,我有:

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
然后,从cookies调试中,我获得:

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;
DEBUG:将cookie发送到:
Cookie:货币=美元;国家=美国;货币=美元;国家=美国;ASP.NET_SessionId=xxxxx
2021-01-05 16:33:13[scrapy.downloadermiddleware.cookies]调试:从以下地址接收cookies:
设置Cookie:InitialOrigin=Origin=direct |&DateSet=2021-01-05 10:33:13;
**打印价格:2280000瑞尔**


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

首先,您是否与邮递员进行了测试,以确保它确实适用于这种饼干

如果您启用了
COOKIES\u=False
,则scrapy不会将您的COOKIES发送到目标服务器。由于您只向服务器发送一个请求,因此不会考虑来自服务器的cookie。所以设置
COOKIES\u ENABLED=True
应该可以解决这个问题

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

为了解决这个问题,我将设置
COOKIES\u ENABLED=False
。 然后发送如下请求:

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

我建议使用标题而不是cookies,因为如果您在设置中禁用了cookies,那么cookies字段将被考虑。

Hi@felix eklöf,谢谢您的回答。我尝试了
Cookies\u enable
(False和True)的两个选项,也尝试了
标题,但问题仍然存在。我可以发送Cookies,但它们不会覆盖服务器上的Cookies。还有其他建议吗?我会仔细看看这个网站,即使我在网站上把语言改成en-US,我仍然可以用我的当地货币支付工资。我在任何地方都找不到你附加的标题,你在哪里找到的?在我看来,服务器似乎是在服务器端进行地理定位。有时,您可以使用Accept Language标头绕过此操作,但它不适用于此服务器。我能想到的唯一选择是使用代理API和我们geotargeting.Hi Felix。是的,我和邮递员查过了,它是地理定位的。我将按照您的建议使用代理API进行检查。