Comment gratter un site qui requiert une connexion abord avec Python
Tout d'abord, je pense que c'est important de dire que, je sais qu'il y a un tas de questions similaires, mais AUCUN d'entre eux travaille pour moi...
Je suis un newbie sur le langage Python, html et web grattoir. Je vais essayer de glaner des informations de l'utilisateur à partir d'un site web qui a besoin de se connecter en premier. Dans mes tests, j'ai utiliser le grattoir mes paramètres de courrier électronique à partir de github à titre d'exemples. La page principale est " https://github.com/login "et la page cible est"https://github.com/settings/emails'
Voici une liste de méthodes que j'ai essayé
##################################### Method 1
import mechanize
import cookielib
from BeautifulSoup import BeautifulSoup
import html2text
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
# Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Chrome')]
# The site we will navigate into, handling it's session
br.open('https://github.com/login')
for f in br.forms():
print f
br.select_form(nr=0)
# User credentials
br.form['login'] = 'myusername'
br.form['password'] = 'mypwd'
# Login
br.submit()
br.open('github.com/settings/emails').read()
################ Method 2
import urllib, urllib2, cookielib
username = 'myusername'
password = 'mypwd'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'username' : username, 'j_password' : password})
opener.open('https://github.com/login', login_data)
resp = opener.open('https://github.com/settings/emails')
print resp.read()
############# Method 3
import urllib
opener = urllib.FancyURLopener()
print opener.open('http://myusername:[email protected]/settings/emails').read()
########## Method 4
import mechanize
import cookielib
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
#br.set_debug_http(True)
#br.set_debug_redirects(True)
#br.set_debug_responses(True)
br.addheaders = [('User-agent', 'Chrome')]
br.add_password('https://github.com/settings/emails', 'myusername', 'mypwd')
br.open('https://github.com/settings/emails')
print br.response().read()
############ Methods 5
from requests import session
payload = {
'action': 'login',
'username': 'myusername',
'password': 'mypwd'
}
with session() as c:
c.post('https://github.com/login', data=payload)
request = c.get('https://github.com/settings/emails')
print request.headers
print request.text
########### Method 6
import requests
from requests.packages.urllib3 import add_stderr_logger
import sys
from bs4 import BeautifulSoup as bs
add_stderr_logger()
s = requests.Session()
s.headers['User-Agent'] = 'Chrome'
username = 'myusername'
password = 'mypwd'
url = 'https://github.com/login'
# after examining the HTML of the website you're trying to log into
# set name_form to the name of the form element that contains the name and
# set password_form to the name of the form element that will contain the password
login = {'login': username, 'password': password}
login_response = s.post(url, data=login)
for r in login_response.history:
if r.status_code == 401: # 401 means authentication failed
print 'error!'
sys.exit(1) # abort
pdf_response = s.get('https://github.com/settings/emails') # Your cookies and headers are automatically included
soup = bs(pdf_response.content)
Aussi j'ai lu quelques discussions sur les différences entre l'Authentification HTTP et les cookies. Toujours aucun d'entre eux travaillaient.
S'il vous plaît aider et de toute aide serait appréciée. Je vous remercie beaucoup.
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne pour moi:
Vous n'étiez pas loin du tout!
aimerais ajouter ma solution côtés . cette réponse suit principalement le hacky /paresseux approche je suis toujours dans tout ce que je fais. sont allés sur principalement parce que j'étais trop paresseux pour gérer les cookies, les données de session etc .
cette solution est des plus utiles si vous voulez gratter plusieurs pages d'un site web une fois connecté avec un compte unique d'identification (par exemple, tous vos conseils pinterest) . pas si tu veux automatiser l'authentification à l'aide de plusieurs comptes
donc ma solution est de sélénium avec firefox profils.
j'ai conçu ce mécanisme quand je suis tombé sur besoin de gratter quelques pages pinterest, j'ai ajouté quelques lignes de code à partir de l'exemple montrant comment utiliser le profil. adapter le code en fonction de vos besoins.
De la façon classique à l'approche de ce problème est:
I. qui est le formulaire de connexion (une page peut avoir de nombreuses formes, mais généralement l'un d'eux est le formulaire de connexion)
II. qui sont les noms de champ utilisé pour le nom d'utilisateur et le mot de passe (ceux-ci pourraient varier d'un lot)
III. si il y a d'autres domaines qui doivent être soumis (comme un jeton d'authentification)
D'être fans de l'automatisation, nous avons pensé que nous pourrions écrire un peu de code pour automatiser le point 2 (qui est en fait le plus de temps) et le résultat est le formulaire de connexion, une bibliothèque pour remplir automatiquement les formulaires de connexion donné à la page de connexion, nom d'utilisateur et mot de passe.
Voici le code d'une simple araignée qui l'utilisent loginform pour vous connecter à des sites automatiquement.
githubloginspider.py
items.py
loginform.py