【问题标题】:Request from different Country IP来自不同国家 IP 的请求
【发布时间】:2015-07-29 07:37:29
【问题描述】:

我想在 Playstation 商店中查看来自不同国家/地区的电影内容。但是,playstation 商店会根据请求的位置阻止 IP,因此无法从美国观看加拿大的电影:

https://store.playstation.com/#!/en-ca/movies/the-house/cid=UV0130-NPVA92773_CN-0000000000236063

有没有办法做如下的事情:

url = 'https://store.playstation.com/#!/en-ca/movies/the-house/cid=UV0130-NPVA92773_CN-0000000000236063'
r = requests.get(url, proxy_from = COUNTRY['CA']) # In pseudocode

基本上,这样您就可以指定一个国家/地区,然后从被识别为来自该国家/地区的 IP 发送请求。这将如何完成?

【问题讨论】:

  • 值得注意的是,您尝试执行的操作几乎肯定违反了 Sony 的 ToS,根据您的居住地,这可能会给他们提供合法理由取消您的订阅而不退款,甚至可能是非法的。如果您知道这一点并且无论如何都想这样做,那当然取决于您,但请确保您知道自己在做什么。
  • @abarnert 理解。这更多是为了验证某个标题(我们拥有或管理的标题)在某个国家/地区的价格是否下降。这是为了能够从最终用户的角度审核价格。
  • 你有代理服务器或VPN服务器或类似的东西吗?
  • 这个网站好像有很多JS代码。我认为仅仅使用requests 不足以获取内容。
  • @skyline75489 是正确的。页面内加载了一个“api端点”,这就是解析信息所请求的。例如:store.playstation.com/chihiro-api/pc-storetree/US/en/999/…

标签: python proxy ip


【解决方案1】:

您可以做的只是诊断并尝试弄清楚这是否可能。

您可以做的第一件事是使用VPN 或任何Proxy 将您的位置模拟为来自加拿大。如果这样可行,并且您能够加载所需的页面,那么很可能该位置是根据请求 IP 确定的。

实际上从服务的角度来看,在您的情况下是 Playstation 商店,没有其他可靠的信息可以从中检索客户的地理位置。

因此,如果是这种情况,解决您的问题的唯一合理方法就是以某种方式更改您的 IP 地址。但无论如何,如果你在应用程序端这样做,就会有太多的层,例如路由器,无论如何都会暴露您的真实位置,因为到达服务的最终IP packet 将包含真实的real IP

因此,它与您的应用程序或请求客户端无关,您应该考虑放在它前面。

如果你的问题是:

如何在应用端实现我的目标?

...那么答案是:很可能没有办法:/

但如果你问:

我怎样才能实现我的目标?

...然后有选项:

  • 使用proxyVPN。您肯定会找到一个 VPN 服务,该服务将为每个位置提供访问凭据(例如 OpenVPN config),因此您可以以编程方式加载它们。这可以在您的应用程序端实现。
  • 而鲁莽的......在您想要请求的每个位置都有机器:)

【讨论】:

  • @David542 如果你最终使用OpenVPN,我可以用python 代码来帮助你控制它,因为有一些棘手的部分。
【解决方案2】:

如果我理解正确,您基本上是在问如何使用代理在 python 中发出 url 请求?

如果是,你可以这样做:

import urllib2
import urllib
import random

CAproxies = [{"http":"199.201.122.175:3128", "https":"199.201.122.175:3128"},{"http":"192.99.3.129:3128", "https":"192.99.3.129:3128"},{"http":"192.99.246.101:8118", "https":"192.99.246.101:8118"},{"http":"205.205.129.130:443", "https":"205.205.129.130:443"} ]


proxies = urllib2.ProxyHandler(random.choice(CAproxies))

url = 'https://store.playstation.com/#!/en-ca/movies/the-house/cid=UV0130-NPVA92773_CN-0000000000236063'

request = urllib2.Request(url)
request.add_header("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0")
request.add_header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")

opener = urllib2.build_opener(proxies)
urllib2.install_opener(opener)
r = urllib2.urlopen(request, timeout=15)
html = r.read()

如果您希望服务认为您正在使用浏览器,则标头很好,它们通常可以防御机器人。您需要用自己的代理替换代理地址,这只是为了说明目的而发明的代理。

可以在此处找到代理列表,例如: http://www.proxy-listen.de/Proxy/Proxyliste.html 如果上面给出的代理不起作用。 如果其中一个代理更适合您的特定位置(假设第二个最适合您,最好将代理的随机选择更改为仅第二个。即

random.choice(CAproxies) -> CAproxies[1]

CAproxies[3] 最适合我。 html 的前 250 个字符:

>>> html[0:250]
'<!DOCTYPE html>\n\n<html class="ctry mobvportA rgba">\n  <head>\n    <meta http-equiv="x-ua-compatible" content="IE=edge" />\n    <meta charset="utf-8"/>\n\n    <link rel="dns-prefetch" href="//ajax.googleapis.com">\n    <link rel="dns-prefetch" href="//ssl.'

【讨论】:

  • 谢谢,您能否展示一个加拿大代理的真实示例,以显示该网址返回真实响应?之后,我会奖励赏金。
  • 您可以在此处找到代理,例如:proxy4free.com/list/webproxy1.html 我可以将其添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2020-10-04
相关资源
最近更新 更多