使用Urllib2和511 api,需要令牌

时间:2016-01-07 23:06:34

标签: python api

所以,我想做的就是向511 api发送请求并从火车站返回火车时间。我可以使用完整的url请求来做到这一点,但我希望能够设置值而无需粘贴一个字符串然后发送该字符串。我想让api返回不同车站的列车时间。我看到其他使用标头的请求,但我不知道如何在请求中使用标头,并且对文档感到困惑。

这有效......

urllib2.Request("http://services.my511.org/Transit2.0/GetNextDeparturesByStopCode.aspx?token=xxxx-xxx&stopcode=70142")
response = urllib2.urlopen(request)
the_page = response.read()

我希望能够像这样设置值......

token = xxx-xxxx
stopcode = 70142
url = "http://services.my511.org/Transit2.0/GetNextDeparturesByStopCode.aspx?"

......然后像这样把它们放在一起......

urllib2.Request(url,token, stopcode)

得到相同的结果。

2 个答案:

答案 0 :(得分:0)

string formatting文档是开始了解更多插入值的不同方法的好地方。

val1 = 'test'
val2 = 'test2'
url  = "https://www.example.com/{0}/blah/{1}".format(val1, val2)

urllib2.Request(url)

答案 1 :(得分:0)

缺少的部分是“urllib”需要与“urllib2”一起使用。具体来说,函数urllib.urlencode()返回值的编码版本。

来自urllib文档here

import urllib

query_args = { 'q':'query string', 'foo':'bar' }
encoded_args = urllib.urlencode(query_args)
print 'Encoded:', encoded_args

url = 'http://localhost:8080/?' + encoded_args
print urllib.urlopen(url).read()

所以修正后的代码如下:

import urllib
import urllib2
token = xxx-xxxx
stopcode = 70142
query_args = {"token":token, "stopcode":stopcode}
encoded_args = urllib.urlencode(query_args)


request = urllib2.Request(url+encoded_args)
response = urllib2.urlopen(request)

print(response.read())

实际上,使用请求包而不是urllib,urllib2要容易一百万次。上面的所有代码都可以替换为:

import requests
token = xxx-xxxx
stopcode = 70142
query_args = {"token":token, "stopcode":stopcode}
r = request.get(url, params = query_args)
r.text