我知道这个问题有很多问题,但我尝试了大部分问题。 我的目标是从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
答案 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,然后您可以使用它来获取完整的文章,但我会留给您。