Iniciar sesión en LinkedIn con sesiones de solicitudes de python

Estoy intentando iniciar sesión en LinkedIn utilizando las solicitudes de Python:

import sys import requests from BeautifulSoup import BeautifulSoup payload={ 'session-key' : 'user@email.com', 'session-password' : 'password' } URL='https://www.linkedin.com/uas/login-submit' s=requests.session() s.post(URL,data=payload) r=s.get('http://www.linkedin.com/nhome') soup = BeautifulSoup(r.text) print soup.find('title') 

Parece que no puedo iniciar sesión con este método. Incluso intenté jugar con csrf, etc. en la carga útil, pero ¿no se supone que las sesiones se encarguen de eso por ti?

Nota sobre la última línea: uso el título para comprobar si me he conectado correctamente. (Debería ver “¡Bienvenido! | LinkedIn” si he iniciado sesión, en cambio veo “La red de profesionales más grande del mundo | LinkedIn”

¿Me estoy perdiendo de algo?

Modifiqué una plantilla de raspado web que uso para la mayoría de mis necesidades de raspado basadas en Python para satisfacer sus necesidades. Verificado que funcionó con mi propia información de inicio de sesión.

La forma en que funciona es imitando un navegador y manteniendo un cookieJar que almacena su sesión de usuario. Tengo que trabajar con BeautifulSoup para ti también.

Nota: Esta es una versión de Python2. Agregué un ejemplo de trabajo de Python3 más abajo a pedido.

 import cookielib import os import urllib import urllib2 import re import string from BeautifulSoup import BeautifulSoup username = "user@email.com" password = "password" cookie_filename = "parser.cookies.txt" class LinkedInParser(object): def __init__(self, login, password): """ Start up... """ self.login = login self.password = password # Simulate browser with cookies enabled self.cj = cookielib.MozillaCookieJar(cookie_filename) if os.access(cookie_filename, os.F_OK): self.cj.load() self.opener = urllib2.build_opener( urllib2.HTTPRedirectHandler(), urllib2.HTTPHandler(debuglevel=0), urllib2.HTTPSHandler(debuglevel=0), urllib2.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', ('Mozilla/4.0 (compatible; MSIE 6.0; ' 'Windows NT 5.2; .NET CLR 1.1.4322)')) ] # Login self.loginPage() title = self.loadTitle() print title self.cj.save() def loadPage(self, url, data=None): """ Utility function to load HTML from URLs for us with hack to continue despite 404 """ # We'll print the url in case of infinite loop # print "Loading URL: %s" % url try: if data is not None: response = self.opener.open(url, data) else: response = self.opener.open(url) return ''.join(response.readlines()) except: # If URL doesn't load for ANY reason, try again... # Quick and dirty solution for 404 returns because of network problems # However, this could infinite loop if there's an actual problem return self.loadPage(url, data) def loginPage(self): """ Handle login. This should populate our cookie jar. """ html = self.loadPage("https://www.linkedin.com/") soup = BeautifulSoup(html) csrf = soup.find(id="loginCsrfParam-login")['value'] login_data = urllib.urlencode({ 'session_key': self.login, 'session_password': self.password, 'loginCsrfParam': csrf, }) html = self.loadPage("https://www.linkedin.com/uas/login-submit", login_data) return def loadTitle(self): html = self.loadPage("https://www.linkedin.com/feed/") soup = BeautifulSoup(html) return soup.find("title") parser = LinkedInParser(username, password) 

Actualización del 19 de junio de 2014: se agregó el análisis para el token CSRF de la página de inicio para su uso en el proceso de inicio de sesión actualizado.

Actualización del 23 de julio de 2015: Agregar un ejemplo de Python 3 aquí. Básicamente requiere la sustitución de ubicaciones de bibliotecas y la eliminación de métodos en desuso. No está perfectamente formateado ni nada, pero funciona. Lo siento por el trabajo de prisa. Al final los principios y pasos son idénticos.

 import http.cookiejar as cookielib import os import urllib import re import string from bs4 import BeautifulSoup username = "user@email.com" password = "password" cookie_filename = "parser.cookies.txt" class LinkedInParser(object): def __init__(self, login, password): """ Start up... """ self.login = login self.password = password # Simulate browser with cookies enabled self.cj = cookielib.MozillaCookieJar(cookie_filename) if os.access(cookie_filename, os.F_OK): self.cj.load() self.opener = urllib.request.build_opener( urllib.request.HTTPRedirectHandler(), urllib.request.HTTPHandler(debuglevel=0), urllib.request.HTTPSHandler(debuglevel=0), urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', ('Mozilla/4.0 (compatible; MSIE 6.0; ' 'Windows NT 5.2; .NET CLR 1.1.4322)')) ] # Login self.loginPage() title = self.loadTitle() print(title) self.cj.save() def loadPage(self, url, data=None): """ Utility function to load HTML from URLs for us with hack to continue despite 404 """ # We'll print the url in case of infinite loop # print "Loading URL: %s" % url try: if data is not None: response = self.opener.open(url, data) else: response = self.opener.open(url) return ''.join([str(l) for l in response.readlines()]) except Exception as e: # If URL doesn't load for ANY reason, try again... # Quick and dirty solution for 404 returns because of network problems # However, this could infinite loop if there's an actual problem return self.loadPage(url, data) def loadSoup(self, url, data=None): """ Combine loading of URL, HTML, and parsing with BeautifulSoup """ html = self.loadPage(url, data) soup = BeautifulSoup(html, "html5lib") return soup def loginPage(self): """ Handle login. This should populate our cookie jar. """ soup = self.loadSoup("https://www.linkedin.com/") csrf = soup.find(id="loginCsrfParam-login")['value'] login_data = urllib.parse.urlencode({ 'session_key': self.login, 'session_password': self.password, 'loginCsrfParam': csrf, }).encode('utf8') self.loadPage("https://www.linkedin.com/uas/login-submit", login_data) return def loadTitle(self): soup = self.loadSoup("https://www.linkedin.com/feed/") return soup.find("title") parser = LinkedInParser(username, password) 

Esta es una versión mucho más simple.

 import requests from bs4 import BeautifulSoup client = requests.Session() HOMEPAGE_URL = 'https://www.linkedin.com' LOGIN_URL = 'https://www.linkedin.com/uas/login-submit' html = client.get(HOMEPAGE_URL).content soup = BeautifulSoup(html, "html.parser") csrf = soup.find(id="loginCsrfParam-login")['value'] login_information = { 'session_key':'Login', 'session_password':'Password', 'loginCsrfParam': csrf, } client.post(LOGIN_URL, data=login_information) client.get('Any_Linkedin_URL') 

La solución del OP funcionó para mí con solo una pequeña modificación.

Cambie ‘session-key’ a ‘session_key’ y cambie ‘session-password’ a session_password. ‘

Aparte de eso, el código es bueno tal como está.