使用GAE urlfetch时,有没有人遇到以下异常的经验?
DownloadError: ApplicationError: 2 timed out
Run Code Online (Sandbox Code Playgroud)
我正在尝试发送HTTP POST请求.像这样:
result = urlfetch.fetch('http://api.nathan.com:8080/Obj/',
method='POST',
payload=postdata,
deadline=10)
Run Code Online (Sandbox Code Playgroud)
我已经尝试将截止日期设置为最大值(10秒).来自命令行的请求(使用curl或httplib2)大约需要一秒钟.
nchong@almond ~ $ time curl
-d "<Obj><a>1</a><b>n</b></Obj>"
http://api.nathan.com:8080/Obj/
agd1c2VyYXBpcgoLEgRTZXNzGAIM #< key returned by call
real 0m1.109s
user 0m0.003s
sys 0m0.009s
Run Code Online (Sandbox Code Playgroud)
这是来自dev appserver的curl请求的输出(我正在使用appengine-rest-server):
INFO __init__.py:819] adding models from module __main__
INFO __init__.py:867] added model Obj with type <class '__main__.Obj'>
INFO dev_appserver.py:3243] "POST /Obj HTTP/1.1" 200 -
INFO dev_appserver_index.py:205] Updating /path/to/index.yaml
Run Code Online (Sandbox Code Playgroud)
这是我尝试使用urlfetch时的输出:
ERROR __init__.py:388] ApplicationError: 2 timed out
Traceback (most recent call last):
File "/path/to/webapp/__init__.py", line …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用fetch()API POST方法来获取PHP中的POST数据.
这是我尝试过的:
var x = "hello";
fetch(url,{method:'post',body:x}).then(function(response){
return response.json();
});
Run Code Online (Sandbox Code Playgroud)
PHP:
<?php
if(isset($_GET['x']))
{
$get = $_GET['x'];
echo $get;
}
?>
Run Code Online (Sandbox Code Playgroud)
它是否正确?
我有这个问题尝试使用lxml获取HTML文档中的所有文本节点,但我得到一个UnicodeEncodeError : 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128). 但是,当我试图找出这个页面的编码类型(encoding = chardet.detect(response)['encoding'])时,它说它是utf-8.单个页面有utf-8和ascii似乎很奇怪.实际上,这个:
fromstring(response).text_content().encode('ascii', 'replace')
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.
这是我的代码:
from lxml.html import fromstring
import urllib2
import chardet
request = urllib2.Request(my_url)
request.add_header('User-Agent',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)')
request.add_header("Accept-Language", "en-us")
response = urllib2.urlopen(request).read()
print encoding
print fromstring(response).text_content()
Run Code Online (Sandbox Code Playgroud)
输出:
utf-8
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这个问题?请记住,我想用其他几个页面来做这个,所以我不想单独编码.
更新:
也许还有其他事情在这里发生.当我在终端上运行这个脚本时,我得到一个正确的输出但是当它在SublimeText中运行时,我得到UnicodeEncodeError ...¿?
UPDATE2:
当我使用此输出创建文件时,也会发生这种情况..encode('ascii', 'replace')工作,但我想有一个更通用的解决方案. …
我需要在我的Wordpress博客管理区域内获取一个页面.以下脚本:
function fetchAdminPage() {
var url = "http://www.mydomain.invalid/wp/wp-admin/wp-login.php";
var options = {
"method": "post",
"payload": {
"log": "admin",
"pwd": "password",
"wp-submit": "Login",
"redirect_to":"http://www.mydomain.invalid/wp/wp-admin/edit-comments.php",
"testcookie": 1
}
};
var response = UrlFetchApp.fetch(url, options);
...
}
Run Code Online (Sandbox Code Playgroud)
执行没有错误.无论如何,response.getContentText()返回登录页面,我无法访问http://www.mydomain.invalid/wp/wp-admin/edit-comments.php页面,这是我想要获取的页面.有关如何做到这一点的任何想法?
每当我在GAE上使用urlfetch请求外部URL时,我都会收到以下警告:
WARNING 2012-03-16 15:37:21,474 urlfetch_stub.py:428] Stripped prohibited headers from URLFetch request: ['Content-Length']
Run Code Online (Sandbox Code Playgroud)
我明白为什么会这样,而且我无法阻止潜在的问题.有没有办法可以抑制这个警告,以免堵塞日志?当然,我仍然想知道urlfetch想要记录的任何其他警告/错误.
我使用 UrlFetchApp 发送用户和密码(POST 方法)。获取cookie后,并在其他请求中使用(GET方法)。但是这个新请求不起作用,我认为这个 cookie 在这个新请求中没有正确使用。谁能帮我?
var opt ={
"method":"post",
"User-Agent" : "Mozilla/5.0",
"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language" : "en-US,en;q=0.5",
"payload": this.payload.toString(),
"followRedirects" : false
};
var response = UrlFetchApp.fetch("https://edas.info/addTopic.php?c=19349",opt);
var resp1=response.getContentText();
Logger.log(resp1);
response.getResponseCode();
var headers = response.getAllHeaders();
var cookies = headers['Set-Cookie'];
for (var i = 0; i < cookies.length; i++) {
cookies[i] = cookies[i].split( ';' )[0];
};
opt = {
"method" : "get",
"User-Agent" : "Mozilla/5.0",
"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language" : "en-US,en;q=0.5",
"headers": {
"Cookie": cookies.join(';')
},
"followRedirects" : false …Run Code Online (Sandbox Code Playgroud) 背景:
我正在使用谷歌应用引擎,我的网站爬虫有一个奇怪的错误.
我有一个后端,每晚会自动抓取一个网站.由于php中的时间限制,这是由推送到pushQueue的任务发起的.
问题:
当我手动运行创建任务的脚本时,任务按预期完成,没有错误.但是当cron启动任务时,我收到以下错误.
调用URLFetch失败,应用程序错误5为url x
码:
function url_get_contents ($Url) {
global $retry;
try {
if (!function_exists('curl_init')){
die('CURL is not installed!');
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $Url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
return $output;
} catch (Exception $e) {
syslog(LOG_INFO, 'Caught exception: ', $e->getMessage());
if($retry > 0){
$retry -= 1;
return url_get_contents($Url);
}
else{
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
感谢syslog我可以看到$ url很好,这让我发疯,因为当手动启动完全相同的脚本而不是通过cron时它会起作用.
我怎样才能解决这个问题?
提前致谢.
在Google App Engines中,我获得了此代码,可帮助通过其URL获取任何网页的HTML代码:
from google.appengine.api import urlfetch
url = "http://www.google.com/"
result = urlfetch.fetch(url)
if result.status_code == 200:
doSomethingWithResult(result.content)
Run Code Online (Sandbox Code Playgroud)
我不明白这里有一件事(事实上还有很多其他事情)为什么在这段代码中建议从google.appengine.api导入urlfecth?Python没有自己的命令吗?
我在我的应用程序中使用urlfetch,虽然在开发环境中一切都运行良好,但我发现urlfetch在实际部署时非常不可靠.有时它可以正常工作(检索数据),但几分钟之后它可能什么也没有返回,然后在几分钟之后再次正常工作.这是非常不可接受的.我已经检查过以确保它不是问题的源URL(YQL),而且,一切都在开发环境中正常工作.
我可以试试第三方图书馆吗?
示例代码:
url = "http://query.yahooapis.com/v1/public/yql?q=%s&format=json" % urllib.quote_plus(query)
result = urlfetch.fetch(url, deadline=10)
if result.status_code == 200:
r = json.loads(result.content)
else:
return
a = r['query']['results']
# Do stuff with 'a'
Run Code Online (Sandbox Code Playgroud)
有时它会按预期工作,但有时候 - 完全随机而没有代码更改 - 我会得到这个错误:
a = r['query']['results']
TypeError: 'NoneType' object is unsubscriptable
Run Code Online (Sandbox Code Playgroud) 我试图通过Google Apps脚本运行MongoLab(基于REST的MongoDB访问)查询.从记录器生成的URL如下所示
https://api.mongolab.com/api/1/databases/abcd/collections/efgh?apiKey=XXXXXXXXXXXXXXXX&q= {"created_on":{"$ gte":"Thu Dec 06 00:00:00 PST 2012","$ lt":"Thu Dec 06 23:59:59 PST 2012"}}
当我在浏览器中输入此内容时,它可以正常工作并获取我正在寻找的响应.但是通过UrlFetchApp运行它会产生"无效参数"错误.我看到有几个帖子在同一行,但没有找到适合我的答案.Javascript代码如下
//start and end are JS date objects
var query = { created_on : {'$gte': start, '$lt' : end} };
var url = MONGO_LAB_URLS.MAIN + "&q=" + Utilities.jsonStringify(query);
Logger.log("Query URL : " + url);
var response = UrlFetchApp.fetch(url);
Run Code Online (Sandbox Code Playgroud)
我试过encodeURIComponent,但它不起作用 - 可能是我做错了.有什么建议可以解决这个问题吗?
谢谢.