Python / urllib突然停止正常工作

时间:2009-04-08 01:31:58

标签: python urllib

我正在写一个小工具来监控我校的课程开放。

我编写了一个python脚本,每隔几分钟就会从每个部门获取当前可用的类。

脚本运行正常,直到uni的网站开始返回:

SIS Server is not available at this time 

Uni必须阻止我的服务器吗?好吧,不是因为这是我直接从其他PC转到URL时得到的输出。但是,如果我通过uni的网站上的中介表格进行POST,我就不会收到该消息。

我要求的网址是https://s4.its.unc.edu/SISMisc/SISTalkerServlet

这就是我的python代码:

data = urllib.urlencode({"progname" : "SIR033WA", "SUBJ" : "busi", "CRS" : "", "TERM" : "20099"})
f = urllib.urlopen("https://s4.its.unc.edu/SISMisc/SISTalkerServlet", data)
s =  f.read()
print (s)

我真的很难过!好像python没有发送正确的请求。起初我以为它没有发送正确的帖子数据,但是我将URL更改为我的localbox,收到的后期数据apache似乎很好。

如果您想查看系统实际运行情况,请转到https://s4.its.unc.edu/SISMisc/browser/student_pass_z.jsp并单击“以访客身份输入”按钮,然后查找“课程可用性”。 (现在你知道我为什么要建造这个!)

最奇怪的是这是工作到上午11点!我之前遇到过同样的错误,但只持续了几分钟。这告诉我,除了任何阻止我的服务器之外,它更像是一个问题。

更新的 根据建议,我尝试使用更合法的引用者/用户代理。结果相同。这就是我试过的:

import httplib
import urllib
headers =  {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4',"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain","Referrer": "https://s4.its.unc.edu/SISMisc/SISTalkerServlet"}
data = urllib.urlencode({"progname" : "SIR033WA", "SUBJ" : "busi", "CRS" : "", "TERM" : "20099"})
c = httplib.HTTPSConnection("s4.its.unc.edu",443)
c.request("POST", "/SISMisc/SISTalkerServlet",data,headers)
r = c.getresponse()
print r.read()

2 个答案:

答案 0 :(得分:2)

本文不会尝试修复您的代码,而是建议使用调试工具。

曾几何时,我正在编写一个程序来为我填写在线表格。为了确切了解我的浏览器如何处理POST,cookie以及诸如此类的东西,我安装了一个网络嗅探器WireShark(http://www.wireshark.org/)。这个应用程序允许我按块查看在IP和硬件级别上发送和接收的数据。

您可以考虑尝试类似的程序并比较网络流量。这可能会突出显示浏览器正在执行的操作与脚本之间的差异。

答案 1 :(得分:0)

在看到来自奇怪的非浏览器用户代理字符串的多个请求之后,他们可能会阻止未从该网站引用的用户。例如,PHP有一个名为$_SERVER['HTTP_REFERRER'] IIRC的功能,它将检查将用户引用到当前页面的页面。由于您的程序在User-Agent字符串中不包含一个(您试图直接访问它),因此很可能它们会阻止您根据它访问。尝试将引荐来源添加到您的http请求的标头中,看看它是如何进行的。 (最好是链接到您尝试访问的页面的页面)

http://whatsmyuseragent.com/可以帮助您构建欺骗性用户代理。

然后你就像这样构建标题......

headers = {"Content-type": "application/x-www-form-urlencoded",
"Accept": "text/plain"}

然后使用您的HTTPConnection请求将它们作为附加参数发送...

conn.request("POST", "/page/on/site", params, headers)

请参阅httplib上的python doc以获取进一步的参考和示例。