python 在 PythonAnywhere 上请求奇怪的错误
python requests weird error on PythonAnywhere
因此,当我 运行 在 PyCharm/from shell-script shell-script 中的本地计算机上使用以下代码时,它可以完美运行:
# -*- coding: utf-8 -*-
import requests
from lxml import etree, html
import chardet
def gimme_pairs():
url = "https://halbidoncom/sha.xml"
page = requests.get(url).content
encoding = chardet.detect(page)['encoding']
if encoding != 'utf-8':
page = page.decode(encoding, 'replace').encode('utf-8')
doc = html.fromstring(page, base_url=url)
print(doc)
print(page)
wanted = doc.xpath('//location')
print(wanted)
date_list = None
tashkif_list = None
for elem in wanted:
date_list = elem.xpath('locationdata/timeunitdata/date/text()')
tashkif_list = elem.xpath('locationdata/timeunitdata/element/elementvalue/text()')
但是在 PythonAnywhere 上我得到了 doc
的输出:
b'\n\n\nChallenge=355121;\nChallengeId=58551073;\nGenericErrorMessageCookies="Cookies
must be enabled in order to view this
page.";\n\n\nfunction test(var1)\n{\n\tvar
var_str=""+Challenge;\n\tvar var_arr=var_str.split("");\n\tvar
LastDig=var
_arr.reverse()[0];\n\tvar minDig=var_arr.sort()[0];\n\tvar subvar1 = (2 * (var_arr[2]))+(var_arr[1]*1);\n\tvar subvar2 = (2 * var_arr[2])+v
ar_arr[1];\n\tvar
my_pow=Math.pow(((var_arr[0]*1)+2),var_arr[1]);\n\tvar
x=(var1*3+subvar1)1;\n\tvar y=Math.cos(Math.PIsubvar2);\n\tvar a
nswer=x*y;\n\tanswer-=my_pow*1;\n\tanswer+=(minDig*1)-(LastDig*1);\n\tanswer=answer+subvar2;\n\treturn
answer;\n}\n\n\ncli ent = null;\nif
(window.XMLHttpRequest)\n{\n\tvar client=new
XMLHttpRequest();\n}\nelse\n{\n\tif
(window.ActiveXObject)\n\t{\n\t\tclient = new
ActiveXObject(\'MSXML2.XMLHTTP.3.0\');\n\t};\n}\nif
(!((!!client)&&(!!Math.pow)&&(!!Math.cos)&&(!![].sort)&&(!![].reverse)))\n{\n\tdocu
ment.write("Not all needed JavaScript methods are
supported.
");\n\n}\nelse\n{\n\tclient.onreadystatechange =
function()\n\t{\n\t\tif(c lient.readyState == 4)\n\t\t{\n\t\t\tvar
MyCookie=client.getResponseHeader("X-AA-Cookie-Value");\n\t\t\tif
((MyCookie == null) || (MyCooki
e==""))\n\t\t\t{\n\t\t\t\tdocument.write(client.responseText);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tvar
cookieName = MyCookie.split(\'= \')[0];\n\t\t\tif
(document.cookie.indexOf(cookieName)==-1)\n\t\t\t{\n\t\t\t\tdocument.write(GenericErrorMessageCookies);\n\t\t\t\treturn;\
n\t\t\t}\n\t\t\twindow.location.reload(true);\n\t\t}\n\t};\n\ty=test(Challenge);\n\tclient.open("POST",window.location,true);\n\tclient.set
RequestHeader(\'X-AA-Challenge-ID\',
ChallengeId);\n\tclient.setRequestHeader(\'X-AA-Challenge-Result\',y);\n\tclient.setRequestHeader(\'X-
AA-Challenge\',Challenge);\n\tclient.setRequestHeader(\'Content-Type\'
, \'text/plain\');\n\tclient.send();\n}\n\n\n\
nJavaScript must be enabled in order to view this
page.\n\n'
我尝试过的事情:
- 交换 urllib.open()
的请求
- 手动添加headers
- 确保安装相同的包
- 升级到 PA 高级帐户
什么给了?让我印象深刻的是请求应该在我的机器和他们的机器上具有相同的功能。
看起来你试图抓取的服务器有保护措施,试图确保你使用的是真正的 browser/there 请求背后的人。如果您很好地格式化该响应,您会看到它在页面上使用开头的 Challenge
和 ChallengeId
设置了一些 headers。
我假设服务器所有者已将 PythonAnywhere 使用的 IPs/servers 添加到列表中以阻止请求(也许过去真的有人向它们发送过垃圾邮件?)
环顾四周寻找同样的 headers,我发现这个项目似乎解决了同样的问题:https://github.com/niryariv/opentaba-server/
他们检查挑战:https://github.com/niryariv/opentaba-server/blob/master/lib/mavat_scrape.py#L31 and parse them with this helper: https://github.com/niryariv/opentaba-server/blob/master/lib/helpers.py#L109
希望对您有所帮助!
因此,当我 运行 在 PyCharm/from shell-script shell-script 中的本地计算机上使用以下代码时,它可以完美运行:
# -*- coding: utf-8 -*-
import requests
from lxml import etree, html
import chardet
def gimme_pairs():
url = "https://halbidoncom/sha.xml"
page = requests.get(url).content
encoding = chardet.detect(page)['encoding']
if encoding != 'utf-8':
page = page.decode(encoding, 'replace').encode('utf-8')
doc = html.fromstring(page, base_url=url)
print(doc)
print(page)
wanted = doc.xpath('//location')
print(wanted)
date_list = None
tashkif_list = None
for elem in wanted:
date_list = elem.xpath('locationdata/timeunitdata/date/text()')
tashkif_list = elem.xpath('locationdata/timeunitdata/element/elementvalue/text()')
但是在 PythonAnywhere 上我得到了 doc
的输出:
b'\n\n\nChallenge=355121;\nChallengeId=58551073;\nGenericErrorMessageCookies="Cookies must be enabled in order to view this page.";\n\n\nfunction test(var1)\n{\n\tvar var_str=""+Challenge;\n\tvar var_arr=var_str.split("");\n\tvar LastDig=var _arr.reverse()[0];\n\tvar minDig=var_arr.sort()[0];\n\tvar subvar1 = (2 * (var_arr[2]))+(var_arr[1]*1);\n\tvar subvar2 = (2 * var_arr[2])+v ar_arr[1];\n\tvar my_pow=Math.pow(((var_arr[0]*1)+2),var_arr[1]);\n\tvar x=(var1*3+subvar1)1;\n\tvar y=Math.cos(Math.PIsubvar2);\n\tvar a nswer=x*y;\n\tanswer-=my_pow*1;\n\tanswer+=(minDig*1)-(LastDig*1);\n\tanswer=answer+subvar2;\n\treturn answer;\n}\n\n\ncli ent = null;\nif (window.XMLHttpRequest)\n{\n\tvar client=new XMLHttpRequest();\n}\nelse\n{\n\tif (window.ActiveXObject)\n\t{\n\t\tclient = new ActiveXObject(\'MSXML2.XMLHTTP.3.0\');\n\t};\n}\nif (!((!!client)&&(!!Math.pow)&&(!!Math.cos)&&(!![].sort)&&(!![].reverse)))\n{\n\tdocu ment.write("Not all needed JavaScript methods are supported.
");\n\n}\nelse\n{\n\tclient.onreadystatechange = function()\n\t{\n\t\tif(c lient.readyState == 4)\n\t\t{\n\t\t\tvar MyCookie=client.getResponseHeader("X-AA-Cookie-Value");\n\t\t\tif ((MyCookie == null) || (MyCooki e==""))\n\t\t\t{\n\t\t\t\tdocument.write(client.responseText);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tvar cookieName = MyCookie.split(\'= \')[0];\n\t\t\tif (document.cookie.indexOf(cookieName)==-1)\n\t\t\t{\n\t\t\t\tdocument.write(GenericErrorMessageCookies);\n\t\t\t\treturn;\ n\t\t\t}\n\t\t\twindow.location.reload(true);\n\t\t}\n\t};\n\ty=test(Challenge);\n\tclient.open("POST",window.location,true);\n\tclient.set RequestHeader(\'X-AA-Challenge-ID\', ChallengeId);\n\tclient.setRequestHeader(\'X-AA-Challenge-Result\',y);\n\tclient.setRequestHeader(\'X- AA-Challenge\',Challenge);\n\tclient.setRequestHeader(\'Content-Type\' , \'text/plain\');\n\tclient.send();\n}\n\n\n\ nJavaScript must be enabled in order to view this page.\n\n'
我尝试过的事情:
- 交换 urllib.open() 的请求
- 手动添加headers
- 确保安装相同的包
- 升级到 PA 高级帐户
什么给了?让我印象深刻的是请求应该在我的机器和他们的机器上具有相同的功能。
看起来你试图抓取的服务器有保护措施,试图确保你使用的是真正的 browser/there 请求背后的人。如果您很好地格式化该响应,您会看到它在页面上使用开头的 Challenge
和 ChallengeId
设置了一些 headers。
我假设服务器所有者已将 PythonAnywhere 使用的 IPs/servers 添加到列表中以阻止请求(也许过去真的有人向它们发送过垃圾邮件?)
环顾四周寻找同样的 headers,我发现这个项目似乎解决了同样的问题:https://github.com/niryariv/opentaba-server/
他们检查挑战:https://github.com/niryariv/opentaba-server/blob/master/lib/mavat_scrape.py#L31 and parse them with this helper: https://github.com/niryariv/opentaba-server/blob/master/lib/helpers.py#L109
希望对您有所帮助!