ฉันจะเข้าสู่เว็บไซต์ด้วย Python ได้อย่างไร?


88

ฉันจะทำมันได้อย่างไร? ฉันพยายามป้อนลิงค์ที่ระบุ (พร้อม urllib) แต่ในการทำฉันต้องเข้าสู่ระบบ

ฉันมีแหล่งข้อมูลนี้จากเว็บไซต์:

<form id="login-form" action="auth/login" method="post">
    <div>
    <!--label for="rememberme">Remember me</label><input type="checkbox" class="remember" checked="checked" name="remember me" /-->
    <label for="email" id="email-label" class="no-js">Email</label>
    <input id="email-email" type="text" name="handle" value="" autocomplete="off" />
    <label for="combination" id="combo-label" class="no-js">Combination</label>
    <input id="password-clear" type="text" value="Combination" autocomplete="off" />
    <input id="password-password" type="password" name="password" value="" autocomplete="off" />
    <input id="sumbitLogin" class="signin" type="submit" value="Sign In" />

เป็นไปได้หรือไม่

คำตอบ:


70

บางทีคุณอาจต้องการที่จะใช้สิ่งทอลายทแยง มันค่อนข้างง่ายที่จะใช้และควรจะทำสิ่งที่คุณต้องการ

จะมีลักษณะดังต่อไปนี้:

from twill.commands import *
go('http://example.org')

fv("1", "email-email", "blabla.com")
fv("1", "password-clear", "testpass")

submit('0')

คุณสามารถใช้showforms()เพื่อแสดงรายการแบบฟอร์มทั้งหมดเมื่อคุณใช้go…เพื่อเรียกดูไซต์ที่คุณต้องการเข้าสู่ระบบ เพียงแค่ลองใช้งานจากล่ามงูเหลือม


โปรดทราบว่าในบางกรณีคุณจำเป็นต้องใช้ submit () ดู: lists.idyll.org/pipermail/twill/2006-August/000526.html ฉันยืนยันปัญหานี้สำหรับฉันโดยลงชื่อเข้าใช้ www.pge.com โดยใช้งาน submit ()
user391339

2
มีวิธีแก้ปัญหาสำหรับ Python 3.6 หรือไม่? ดูเหมือนว่าสิ่งทอลายทแยงจะไม่รองรับ Python 3.5 หรือ 3.6 ฉันลองดาวน์โหลดและแปลงไฟล์โดยใช้2to3แต่ตอนนี้ฉันได้รับModuleNotFoundErrorเมื่อพยายามนำเข้า
CGFoX

จริงๆแล้วฉันสามารถแก้ไขได้ModuleNotFoundErrorโดยใช้ / แปลง Twill 1.8.0 และติดตั้งlxmlและrequestsด้วยpip install. แต่ตอนนี้ฉันได้รับSyntaxErrorเมื่อพยายามนำเข้าเพราะบางที่False = 0....
CGFoX

2
มันเป็นความเจ็บปวดที่ต้องแก้ไข แต่ใช้งานได้: stackoverflow.com/a/45459994/2745116
CGFoX

มันทำงานด้วย HTTPS ไซต์หรือฉันต้องทำอะไรเช่นนี้ ?
Mahesha999

53

ให้ฉันพยายามทำให้ง่ายสมมติว่า URL ของไซต์คือ www.example.com และคุณต้องลงทะเบียนโดยกรอกชื่อผู้ใช้และรหัสผ่านดังนั้นเราจึงไปที่หน้าเข้าสู่ระบบโดยพูดว่าhttp://www.example.com/login .phpตอนนี้และดูเป็นซอร์สโค้ดและค้นหา URL การดำเนินการซึ่งจะอยู่ในแท็กรูปแบบเช่น

 <form name="loginform" method="post" action="userinfo.php">

ตอนนี้ใช้ userinfo.php เพื่อสร้าง URL ที่สมบูรณ์ซึ่งจะเป็น ' http://example.com/userinfo.php ' ตอนนี้เรียกใช้สคริปต์ python อย่างง่าย

import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
          'password': 'pass'}

r = requests.post(url, data=values)
print r.content

ฉันหวังว่าสิ่งนี้จะช่วยใครสักคนสักวันหนึ่ง


สิ่งนี้ใช้ไม่ได้กับเว็บไซต์ส่วนใหญ่ที่ฉันลอง
Anurag Pandey

จากหน้าวิธีใช้ / stackoverflow สองโหลที่ฉันดูนี่เป็นโซลูชันเดียวที่ใช้ได้กับไซต์เดียวที่ฉันต้องการ
ทุ่น

ทางเลือกที่ดีที่สุดสำหรับเว็บอัตโนมัติคือ webbot stackoverflow.com/a/51170181/6665568
Natesh bhat

ค่าทั้งหมดเป็นชื่อผู้ใช้และรหัสผ่านเสมอหรือไม่? ฉันไม่คิดว่าสิ่งนี้จะใช้ได้กับไซต์ที่ฉันเลือก
Dylan Logan

@DylanLogan คุณต้องตรวจสอบสิ่งที่หน้าเว็บจริงส่งไปยังเซิร์ฟเวอร์และปรับสคริปต์ของคุณให้เข้ากับมัน เซิร์ฟเวอร์ไม่ควรแยกความแตกต่างระหว่างสคริปต์ของคุณและเว็บเบราว์เซอร์
Jeyekomon

28

โดยทั่วไปคุณจะต้องใช้คุกกี้เพื่อเข้าสู่ระบบไซต์ซึ่งหมายถึง cookielib, urllib และ urllib2 นี่คือคลาสที่ฉันเขียนกลับไปเมื่อฉันเล่นเกมบนเว็บ Facebook:

import cookielib
import urllib
import urllib2

# set these to whatever your fb account is
fb_username = "your@facebook.login"
fb_password = "secretpassword"

class WebGamePlayer(object):

    def __init__(self, login, password):
        """ Start up... """
        self.login = login
        self.password = password

        self.cj = cookielib.CookieJar()
        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)'))
        ]

        # need this twice - once to set cookies, once to log in...
        self.loginToFacebook()
        self.loginToFacebook()

    def loginToFacebook(self):
        """
        Handle login. This should populate our cookie jar.
        """
        login_data = urllib.urlencode({
            'email' : self.login,
            'pass' : self.password,
        })
        response = self.opener.open("https://login.facebook.com/login.php", login_data)
        return ''.join(response.readlines())

คุณไม่จำเป็นต้องใช้ตัวจัดการ HTTPS หรือตัวจัดการการเปลี่ยนเส้นทาง แต่ก็ไม่เจ็บและทำให้ตัวเปิดมีประสิทธิภาพมากขึ้น คุณอาจไม่จำเป็นต้องใช้คุกกี้ แต่ก็ยากที่จะบอกได้จากแบบฟอร์มที่คุณโพสต์ ฉันสงสัยว่าคุณอาจจะมาจากข้อมูล "จดจำฉัน" ที่มีการแสดงความคิดเห็น


19
import cookielib
import urllib
import urllib2

url = 'http://www.someserver.com/auth/login'
values = {'email-email' : 'john@example.com',
          'password-clear' : 'Combination',
          'password-password' : 'mypassword' }

data = urllib.urlencode(values)
cookies = cookielib.CookieJar()

opener = urllib2.build_opener(
    urllib2.HTTPRedirectHandler(),
    urllib2.HTTPHandler(debuglevel=0),
    urllib2.HTTPSHandler(debuglevel=0),
    urllib2.HTTPCookieProcessor(cookies))

response = opener.open(url, data)
the_page = response.read()
http_headers = response.info()
# The login cookies should be contained in the cookies variable

ดูข้อมูลเพิ่มเติมได้ที่https://docs.python.org/2/library/urllib2.html


ลิงก์ใช้งานไม่ได้: a 2ถูกเพิ่มในdocs.python.orgurls: docs.python.org/2/library/urllib2.html
Michael Kopp

18

หน้าเว็บอัตโนมัติ? "webbot" อย่างแน่นอน

webbot ใช้งานได้แม้กระทั่งหน้าเว็บที่มีการเปลี่ยนแปลง id และชื่อคลาสแบบไดนามิกและมีวิธีการและคุณสมบัติมากกว่าซีลีเนียมหรือกลไก

นี่คือตัวอย่าง :)

from webbot import Browser 
web = Browser()
web.go_to('google.com') 
web.click('Sign in')
web.type('mymail@gmail.com' , into='Email')
web.click('NEXT' , tag='span')
web.type('mypassword' , into='Password' , id='passwordFieldId') # specific selection
web.click('NEXT' , tag='span') # you are logged in ^_^

เอกสารนี้ค่อนข้างตรงไปตรงมาและใช้งานง่าย: https://webbot.readthedocs.io


ข้อสอบนี้ใช้งานได้ดี มันจะทำงานที่ไหนautocomplete=off.?
S Andrew

ไม่ได้ติดตั้งบน win 64 บิต ข้อผิดพลาด:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa

ลองใช้ python3
Natesh bhat

วิธีจัดการ iframe ใน webbot.?.. ฉันหมายความว่าฉันต้องปิด iframe ที่ป๊อปอัปหลังจากโหลดหน้า ..
arihanth jain

7

โดยทั่วไปเว็บไซต์สามารถตรวจสอบการอนุญาตได้หลายวิธี แต่เว็บไซต์ที่คุณกำหนดเป้าหมายดูเหมือนจะทำให้ง่ายพอสมควรสำหรับคุณ

สิ่งที่คุณต้องมีเพียงแค่POSTใส่auth/loginURL ที่เข้ารหัสแบบฟอร์มพร้อมช่องต่างๆที่คุณเห็นในนั้น (อย่าลืมป้ายกำกับforเพราะเป็นการตกแต่งสำหรับผู้เยี่ยมชมที่เป็นมนุษย์) handle=whatever&password-clear=pwdและอื่น ๆ ตราบใดที่คุณทราบค่าของหมายเลขอ้างอิง (อีเมล AKA) และรหัสผ่านคุณก็น่าจะใช้ได้

สันนิษฐานว่า POST จะเปลี่ยนเส้นทางคุณไปยังหน้า "คุณเข้าสู่ระบบสำเร็จ" บางหน้าพร้อมด้วยSet-Cookieส่วนหัวที่ตรวจสอบความถูกต้องของเซสชันของคุณ (อย่าลืมบันทึกคุกกี้นั้นและส่งกลับไปเมื่อมีการโต้ตอบเพิ่มเติมตลอดเซสชัน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.