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

How can I login this page and read it?

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

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

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

然后我从 https://github.com/cdhigh/KindleEar/blob/master/books/base.py 中获取了 SelectLoginForm 和登录函数,但都没有用。

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

我开始研究机械化模块。我当前的代码是:

# -*- 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,它会重定向到记录的文章页面。可能是机械化重定向问题还是无法登录此页面?

在 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 请求,其中包括您的用户名和编码后的密码以及 returns 一些会话 ID . mechanize 不起作用的原因是因为密码是通过 javascript 代码编码的,当您在代码中提交表单时,该代码不会被解释。

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

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

您必须在 python 中重写,因此要接收初始会话 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())

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