我的朋友要求我为ask.fm编写一个抓取脚本,并认为这很简单,但我还没有能够找出登录过程。我发现了很多关于使用python登录的帖子,但是没有成功调整代码。
根据Chrome开发者控制台,普通浏览器登录的POST仅提供authenticity_token,login(用户名),密码和提交("登录")作为表单数据。
import requests
import cookielib
from urllib2 import build_opener, HTTPCookieProcessor, HTTPHandler, Request
from bs4 import BeautifulSoup
#do a GET to the login page and get the authentication token
loginGet = requests.get('http://ask.fm/login/')
data = loginGet.text
soup = BeautifulSoup(data)
inputs = soup.find('input', {'name':"authenticity_token"})
authToken = inputs['value']
#find default values of form fields (<input> elements below #login_form element
cookies = cookielib.CookieJar()
opener = build_opener(HTTPCookieProcessor(cookies), HTTPHandler())
req = Request("http://www.ask.fm/login/")
f = opener.open(req)
for cookie in cookies:
if cookie.name == "_ask.fm_session":
sessionCookie = cookie.value
#add default values to email and password data
form_data = {'authenticity_token' : authToken,
'login' : USERNAME,
'password' : PASSWORD,
'commit' : 'Log in' }
headers = {'Accept':"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
'Accept-Encoding' : 'gzip,deflate,sdch',
'Accept-Language' : 'en-US,en;q=0.8,de;q=0.6',
'Cache-Control' : 'max-age=0',
'Connection' : 'keep-alive',
'Content-Length' : '115',
'Host' : 'ask.fm',
'Origin' : 'http://ask.fm',
'Referer' : 'http://ask.fm/login',
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36' }
#send login using Requests Session
url = 'http://ask.fm/login/'
cookies = {"_ask.fm_session" : sessionCookie}
s = requests.Session()
r = s.post(url, data=form_data, cookies=cookies, headers=headers)
wall = s.get("http://ask.fm/account/wall", headers=headers, timeout=10)
print wall.content
当我执行代码时,最后的get总是超时。看起来r.content(来自post()行)与ask.fm主页具有相同的HTML,而不是成功登录重定向到的页面。
答案 0 :(得分:2)
我可以知道为什么您的内容长度始终相同吗?您还应该注意发送的表单数据,发送到服务器的表单数据不是列表,可能类似
authenticity_token=123&username=toto&password=toto&...
尝试这样的事情让我知道