如何登录此页面阅读?

时间:2015-02-06 04:30:34

标签: 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和登录函数,它既没有用。

硒不起作用,因为我会在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

1 个答案:

答案 0 :(得分:2)

首先,您应该知道,如果没有公开的API可以完成所有这些而不需要抓取,那么很可能您正在做的事情不受网站所有者欢迎,反对他们根据您居住的地方,服务条款甚至可能是违法的,并可依法惩处。

除非mechanize可以解释javascript代码(我怀疑它虽然我可能错了)但它不会有很大的帮助,但是,浏览你提供给Chrome的链接&#39; s DevTools看起来你可以用一些纯粹的urlib2请求来实现你想要的东西。

例如,当您第一次登录时,您会看到对http://auth.hurriyet.com.tr/api/loginuser/tasklak@hotmail.com/?%3D%3E%3F89%3A网址的GET请求,其中包含您的用户名和编码密码,并返回一些会话ID。 mechanize无法使用的原因是密码是通过您在代码中提交表单时未解释的JavaScript代码进行编码的。

进入登录表单的源代码,您将看到&#34;提交&#34;单击按钮会调用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,然后您可以使用它来获取完整的文章,但我会留给您。