python - 我怎样才能登录这个页面并阅读它?

标签 python html google-app-engine login mechanize

我知道关于这件事有很多问题,但我尝试了其中的大部分。
我的目标是从 this page 获取文章并在 gae 中使用它。

如果我尝试登录,它会重定向到 long url ,在我登录后它会重定向回文章。

首先,我尝试使用 how to login to a website with python and mechanize 中提到的 urllib2,但它没有用。

然后我从 https://github.com/cdhigh/KindleEar/blob/master/books/base.py 中获取了 SelectLoginForm 和登录功能,但它也不起作用。

Selenium 不起作用,因为我要在 gae 中使用它。我猜 gae 不能支持 Selenium

我开始研究 Mechanize 模块。我目前的代码是:

# -*- coding: cp1254 -*-
import cookielib 
import urllib2 
import mechanize 
b=mechanize.Browser()
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()

br.set_cookiejar(cj)

br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize.HTTPRefreshProcessor(),max_time=1)
b.addheaders = [("User-agent","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13")]

b.open('https://hurpass.com/iframe/login?appkey=52da7ef64037f9497f0acb091390051062215&secret=52da7f0c4037f9497f0acb0b1390051084754&domain=sosyal.hurriyet.com.tr&callback_url=http://sosyal.hurriyet.com.tr/Account/AutoLogin?returnUrl=http://sosyal.hurriyet.com.tr/yazar/ahmet-hakan_131/baskanlik-diktatorluk-getirir-diyenleri-girtlaklamak-istiyorum_28116073&referer=http://sosyal.hurriyet.com.tr&user_page=http://sosyal.hurriyet.com.tr/Account/AutoLogin?returnUrl=http://sosyal.hurriyet.com.tr/yazar/ahmet-hakan_131/baskanlik-diktatorluk-getirir-diyenleri-girtlaklamak-istiyorum_28116073&is_mobile=0&session_timeout=0&is_vative=0&email=')


b.select_form(name='frm_login')


b["email"]="tasklak@hotmail.com"
b["password"]="123456"

b.submit(type="submit")

url='http://sosyal.hurriyet.com.tr/yazar/ahmet-hakan_131/baskanlik-diktatorluk-getirir-diyenleri-girtlaklamak-istiyorum_28116073'

last_response = b.response() 
http_header_dict = last_response.info().dict
html_string_list = last_response.readlines()
html_data = "".join(html_string_list)
page = br.open(url)
print page.read().decode("UTF-8")

ha=open("test.html",'w')
ha.write(html_data)
ha.close

再次我无法让它工作,但如果我打开它创建的 html,它会重定向到记录的文章页面。可能是 Mechanize 重定向问题还是无法登录此页面?

在 mihail 的回答之后编辑:
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

user = 'tasklak@hotmail.com'
password = '123456'
xor_password = ''.join(chr(12 ^ ord(c)) for c in password)

auth_url = 'http://auth.hurriyet.com.tr/api/loginuser/{}/?{}'.format(user, xor_password)
url='http://www.hurriyet.com.tr/anasayfa/'

sessionidd=urllib2.urlopen(auth_url).read().split(',')[1].split('\"')[3]

print sessionidd

opener.open(url+';ASPSESSIONID='+sessionidd)
print cj

编辑2:
sessionidd=urllib2.urlopen(auth_url).read().split(',')[1].split('\"')[3]
print sessionidd
opener.open(url)
k=0
for a in cj:
    if k<2:
        a.value=sessionidd
        k+=1
print cj

最佳答案

首先,您应该知道,如果没有公开可用的 API 可以在不进行抓取的情况下完成所有这些操作,那么您所做的事情很可能不受网站所有者的欢迎,违反了他们的服务条款,甚至可能是非法的并根据您的居住地而受到法律处罚。

除非 mechanize 可以解释 javascript 代码(我怀疑它可以解释,尽管我可能错了),否则它不会很有帮助,尽管浏览您提供的 Chrome DevTools 链接,看起来您可以用一些纯粹的代码来实现您想要的urlib2 请求。

例如,当您第一次登录时,您会看到对 http://auth.hurriyet.com.tr/api/loginuser/tasklak@hotmail.com/?%3D%3E%3F89%3A URL 的 GET 请求,其中包含您的用户名和编码密码并返回一些 session ID。 mechanize 不起作用的原因是密码是通过 javascript 代码编码的,当您在代码中提交表单时,该代码不会被解释。

进入登录表单的源代码,您会看到当单击“提交”按钮时,会调用 loginUser() 函数,当您发现密码正在与以下代码进行异或运算时:

for (i = 0; i < password.length; ++i) {
    encoded_password += String.fromCharCode(12 ^ password.charCodeAt(i));
}

您必须在 python 中重写它,因此要接收初始 session ID,您将拥有以下内容:
import urllib2

user = 'tasklak@hotmail.com'
password = '123456'
xor_password = ''.join(chr(12 ^ ord(c)) for c in password)

auth_url = 'http://auth.hurriyet.com.tr/api/loginuser/{}/?{}'.format(user, xor_password)

print(urllib2.urlopen(auth_url).read())

看起来您随后需要验证您收到的 session ID 并检索 session cookie,然后您可以使用这些 cookie 来获取完整的文章,但我会将这些留给您。

关于python - 我怎样才能登录这个页面并阅读它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28358616/

相关文章:

python - Python 中的列表操作 - 增加元素列表

Python文件复制删除原始文件

google-app-engine - 在 Google 应用引擎上运行的大容量应用有哪些示例?

python - 有没有一种简单的方法(除了重定向之外)让 Google App Engine 指向另一个 Web 服务器来获取内容?

google-app-engine - 在 Google App Engine 数据模型中进行 'OR' 查询

python - 如何将自定义函数列表传递给 pandas.Dataframe.aggregate

python - 在命令输出中找到 b''?

javascript - 仅当我单击我的 div 链接时才可能加载我的进度条?

javascript - 选中时突出显示表格行

jquery - 使用 ajax、jquery 动态附加时,owl 轮播项目不起作用