【问题标题】:python requests weird error on PythonAnywherepython 在 PythonAnywhere 上请求奇怪的错误
【发布时间】:2018-03-14 01:24:09
【问题描述】:

因此,当我在本地机器上使用 PyCharm/来自 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 必须启用才能查看此 页。";\n\n\n函数测试(var1)\n{\n\tvar var_str=""+挑战;\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 答案;\n}\n\n\nclient = 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\文档库 ment.write("并非所有需要的 JavaScript 方法都是 支持。
");\n\n}\nelse\n{\n\tclient.onreadystatechange = 函数()\n\t{\n\t\tif(客户端.readyState == 4)\n\t\t{\n\t\t\tvar MyCookie=client.getResponseHeader("X-AA-Cookie-Value");\n\t\t\tif ((MyCookie == null) || (MyCookie 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(挑战);\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 必须启用才能查看 页。\n\n'

我尝试过的事情:

  • urllib.open() 的交换请求
  • 手动添加标题
  • 确保安装相同的软件包
  • 升级到 PA 高级帐户

什么给了?让我印象深刻的是 requests 在我的机器和他们的机器上应该具有相同的功能。

【问题讨论】:

  • 这不是您正在运行的(整个)程序。你已经忽略了htmlchardetrequests 的定义,谁知道还有什么。向我们展示实际的完整代码。
  • @JohnGordon 完成。谢谢。

标签: python python-requests pythonanywhere


【解决方案1】:

您尝试抓取的服务器似乎具有保护措施,以确保您使用的是真正的浏览器/请求背后有人支持。如果您很好地格式化该响应,您会看到它在页面上设置了一些标题,在开头使用 ChallengeChallengeId

我假设 PythonAnywhere 使用的 IP/服务器已被服务器所有者添加到列表中以阻止请求(也许过去真的有人向它们发送垃圾邮件?)

环顾四周寻找相同的标题,我发现这个项目似乎解决了同样的问题:https://github.com/niryariv/opentaba-server/

他们检查挑战:https://github.com/niryariv/opentaba-server/blob/master/lib/mavat_scrape.py#L31 并使用此帮助程序解析它们:https://github.com/niryariv/opentaba-server/blob/master/lib/helpers.py#L109

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2020-10-24
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多