1

这个 Python 脚本正确吗?


import urllib, urllib2, cookielib 

username = 'myuser' 
password = 'mypassword' 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
login_data = urllib.urlencode({'username' : username, 'j_password' : password}) 
opener.open('http://www.example.com/login.php', login_data) 
resp = opener.open('http://www.example.com/hiddenpage.php') 
resp.read()

我在这里找到了这个脚本。它的目的是先登录到一个网页,检索 cookie,存储它们并使用它们,以便打开同一网站中的其他页面。我想以这种方式登录我的 eBay 帐户(网址是https://signin.ebay.com/ws/eBayISAPI.dll?SignIn),然后转到我的 eBay 帐户的收件箱(网址是http:// /my.ebay.com/ws/eBayISAPI.dll?MyEbay&gbh=1 )。

所以,这里是我需要在这个脚本中使用的值:

第一个(Sing-in)网址:https ://signin.ebay.com/ws/eBayISAPI.dll?SignIn

第二个网址:http ://my.ebay.com/ws/eBayISAPI.dll?MyEbay&gbh=1

我在 eBay 上的登录名:tryinghard

我在 eBay 上的密码:gettingsomewhere

有了所有这些新值,上面的脚本必须是这样的:


import urllib, urllib2, cookielib 

username = 'tryinghard' 
password = 'gettingsomewhere' 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
login_data = urllib.urlencode({'username' : username, 'j_password' : password}) 
opener.open(https://signin.ebay.com/ws/eBayISAPI.dll?SignIn', login_data) 
resp = opener.open(http://my.ebay.com/ws/eBayISAPI.dll?MyEbay&gbh=1') 
resp.read()

这是正确的吗?我特别怀疑这login_data =条线(倒数第四条),为什么它是 a j_passwordthere 而不是 just password

我用所有这些值尝试了这个脚本,但它没有用。有人知道为什么它在我的情况下不起作用吗?

我已经学会了如何登录到我的 eBay 帐户,然后通过运行使用斜纹布作为外部模块的 python 脚本来检查那里的其他页面,但只有当我从命令提示符运行该脚本时才成功或从 Python 外壳。当我尝试通过从"Google App Engine"下载的"Google App Engine Software Development Kit"运行该脚本时,它没有成功。

后来我在这里被告知它没有成功,因为“Google App Engine”不喜欢外部模块。这就是我找到这个脚本的原因——它一开始就导入的那些模块(urlliburllib2cookielib)都是内置模块。

4

1 回答 1

3

登录页面上的一个简单的“查看源代码”,您提供的 URL 很容易揭示有关它的以下详细信息......(只是为了便于阅读而对 HTML 进行最低限度的格式化):

<span style="display:-moz-inline-stack" class="unl">
  <label for="userid">User ID  </label></span>
<span><input size="27" maxlength="64" class="txtBxF"
       value="" name="userid" id="userid"></span></div>
<div><span style="display:-moz-inline-stack" class="unl">
  <label for="pass">Password  </label></span>
<span><input size="27" maxlength="64" class="txtBxF"
       value="" name="pass" id="pass" type="password"></span>

如您所见,关键输入字段的名称不是 username您使用的and j_password,而是useridand pass。因此,您的代码显然不可能像现在这样工作。

阅读更多页面内容,不久之后您还会看到:

<input type="checkbox" name="keepMeSignInOption" value="1" id="signed_in"></b>
<span class="pcsm"><label for="signed_in"><b>Keep me signed in for today.</b>

很可能您必须模拟选中该复选框以获取可用的 cookie(至少对于任何东西,除了短暂的时间;-)。

等等,等等,真的 - 尝试自动与页面交互而无需费心阅读该页面的源来获取实际使用的 ID 和名称,这让我觉得绝对表现出对生活、宇宙的非常乐观的态度,和所有...;-)。顺便说一句,为了简化这种交互(仔细阅读了源代码之后;-),我发现mechanize非常方便(并且比尝试使用标准库来破解它更强大,就像你正在做的那样)

此外,在与站点进行自动交互之前,请务必检查其robots.txt以确保您没有违反其使用条款——站点可以轻松识别“机器人”(自动交互)而不是“人类”,并进行报复通过禁止、列入黑名单和更糟的方式来防止 robots.txt 违规;您真的不想遇到这种情况;-)。

于 2010-09-04T15:07:41.393 回答