2011-12-20 31 views
7

Vâng, tôi đang cố gắng đăng nhập vào một trang web bằng cách sử dụng Python và cơ giới hóa.Gửi Biểu mẫu với Cơ chế (Python)

Tôi đã có trang web mở:

site = br.open("http://example.com/login.php") 

Và tôi đã có một danh sách các hình thức (với br.forms).

<GET http://example.com/search.php application/x-www-form-urlencoded 
<HiddenControl(search=1) (readonly)> 
... 
<POST http://example.com/login.php application/x-www-form-urlencoded 
<TextControl(username=)> 
<PasswordControl(password=)> 
<CheckboxControl(stay=[1])> 
<SubmitControl(<None>=Log in) (readonly)>> 

Tôi đã cố gắng gửi trường tên người dùng và mật khẩu.

Tôi đã cố gắng làm việc đó như thế này:

br.select_form(nr=0) 
br.form["username"] = 'usernamehere' 
br.form["password"] = 'passwordhere' 
br.submit() 

Sau đó, tôi nhận ra rằng các hình thức tôi đã cố gắng để điền vào không phải là lần đầu tiên trên trang web, nhưng thay đổi 0 không giúp với bất cứ điều gì. Tôi nên làm gì để chọn biểu mẫu trên một trang như thế này?

Tuy nhiên! Đó không phải là vấn đề duy nhất.

Khi tôi chạy nó, tôi nhận được lỗi này:

Traceback (most recent call last): 
File "C:\Python26\login.py", line 34, in <module> 
br.form["username"] = 'usernamehere' 
... 
ControlNotFoundError: no control matching name 'username' 

Làm thế nào tôi có thể sửa lỗi này? D: Hay tôi làm điều đó hoàn toàn sai? Nếu đó là sau này, làm thế nào tôi sẽ đi về làm việc đó?

Trả lời

4

để chọn một hình thức sử dụng tên gọi của nó, bạn nên sử dụng:

br.select_form(name="order") 

những gì bạn đang làm gì ở đây:

br.form["username"] = 'usernamehere' 

đang cố gắng đặt giá trị cho điều khiển theo biểu mẫu đã chọn, vì vậy khi không thể tìm thấy nó, nó sẽ ném ngoại lệ bạn đang thấy.

+0

br.select_form (tên = "tên người dùng") ném lại một lỗi: FormNotFoundError: không có hình thức phù hợp với tên 'tên người dùng' - giống như trước, nhưng lần này với dòng tôi vừa thêm vào. – Matthew

+0

bạn có chắc là bạn có đúng tên không? thử mẫu đơn trong br.forms(): mẫu in – tovmeod

+0

Tích cực. Tôi đã kiểm tra br.forms() và html thô. – Matthew

0

Bạn có thể có một số vấn đề

  • nếu mẫu được tạo ra thông qua javascript, bạn không thể giải quyết nó với mechanize - ít nhất là không theo một cách thẳng về phía trước - trong trường hợp này tôi khuyên bạn nên thử và sử dụng selenium - bạn có thể thử xem xét nguồn HTML của trang - nếu bạn không có biểu mẫu ở đó trong html thuần túy, thì rõ ràng là nó được chèn vào DOM bằng javascript. Ngoài ra, nếu các mẫu được gửi thông qua javascript, cơ giới hóa sẽ không giúp bạn

  • cũng, hình thức có thể không phải trên trang đầu tiên - bạn có thể muốn đặt cơ giới đi theo chuyển hướng

+0

Không, nó không phải là javascript. Và tôi có thể truy cập các hình thức tốt với urllib ... Tôi chỉ muốn sử dụng cơ giới hóa bởi vì tôi không chắc chắn làm thế nào cookiejar hoạt động chính xác và tôi cần phải ở lại đăng nhập> _> Và login.php là vị trí hình thức. Tôi chắc chắn về điều này. – Matthew