2012-10-30 51 views
16

This là mô-đun mà tôi đang cố gắng sử dụng và có một biểu mẫu tôi đang cố gắng điền tự động. Lý do tôi muốn sử dụng Requests over Mechanize là bởi vì với Mechanize, tôi phải tải trang đăng nhập trước khi tôi có thể điền vào và gửi, trong khi với Yêu cầu, tôi có thể bỏ qua giai đoạn tải và đi thẳng đến POSTING tin nhắn (hy vọng). Về cơ bản, tôi đang cố gắng làm cho quá trình đăng nhập tiêu tốn ít băng thông nhất có thể.Làm thế nào để mô phỏng yêu cầu bài HTTP bằng cách sử dụng mô-đun Yêu cầu Python?

Câu hỏi thứ hai của tôi là sau quá trình đăng nhập và chuyển hướng, bạn có thể tải xuống toàn bộ trang không, nhưng chỉ lấy tiêu đề trang? Về cơ bản, tiêu đề một mình sẽ cho tôi biết nếu đăng nhập thành công hay không, vì vậy tôi muốn giảm thiểu việc sử dụng băng thông.

Tôi là một noob khi nói đến yêu cầu HTTP và không có điều gì, vì vậy mọi trợ giúp sẽ được đánh giá cao. FYI, đây là cho một dự án trường học.

chỉnh sửa Phần đầu tiên của câu hỏi đã được trả lời. Câu hỏi của tôi bây giờ là cho phần thứ hai

+1

Bạn có thể sử dụng Chrome kiểm tra để xem những giá trị nào đang được chuyển tới yêu cầu đăng được tạo bởi trình duyệt và sau đó đi từ đó. – bossylobster

Trả lời

32

Một số mã ví dụ:

import requests 

URL = 'https://www.yourlibrary.ca/account/index.cfm' 
payload = { 
    'barcode': 'your user name/login', 
    'telephone_primary': 'your password', 
    'persistent': '1' # remember me 
} 

session = requests.session() 
r = requests.post(URL, data=payload) 
print r.cookies 

Bước đầu tiên là nhìn vào trang nguồn của bạn và xác định các form yếu tố đó đã được gửi (sử dụng Firebug/công cụ Chrome/IE bất cứ điều gì (hoặc chỉ nhìn vào nguồn)). Sau đó tìm các phần tử input và xác định các thuộc tính bắt buộc name (xem ở trên).

URL bạn đã cung cấp có "Ghi nhớ", mặc dù tôi chưa thử (vì tôi không thể), ngụ ý rằng nó sẽ phát hành cookie trong một khoảng thời gian để tránh đăng nhập thêm - cookie được lưu giữ trong số request.session.

Sau đó, chỉ cần sử dụng session.get(someurl, ...) để lấy trang vv ...

+0

Tôi đã thử nhưng nó dường như không xác thực tôi, mặc dù nó đã làm việc bằng cách sử dụng Mechanize. Bạn có biết có thể sai? ** chỉnh sửa ** Rất tiếc, thực sự nó đã hoạt động. Tôi vừa làm một lỗi đánh máy :) –

+0

Bạn là một phao cứu sinh. Tôi nghĩ tôi sẽ phải lội qua cái lạnh giá cả ngày.Đã kết thúc trong 15 phút để thực hiện 8 giờ tải xuống thủ công! – Blairg23

+0

Vậy làm cách nào để gửi tệp cùng? –

12

Để sử dụng chứng thực trong một yêu cầu GET hoặc POST chức năng bạn chỉ cần cung cấp các luận cứ auth. Như thế này:

response = requests.get(url, auth = ('username', 'password')) Tham khảo các yêu cầu Authentication Documentation để biết thêm thông tin chi tiết.

Sử dụng công cụ dành cho nhà phát triển của Chrome, bạn có thể kiểm tra các yếu tố của trang html có chứa biểu mẫu mà bạn muốn điền và gửi. Để có giải thích về cách thực hiện việc này, hãy truy cập here. Bạn có thể tìm thấy dữ liệu mà bạn cần để điền đối số dữ liệu của yêu cầu bài đăng của bạn. Nếu bạn không lo lắng về việc xác minh chứng chỉ bảo mật của trang web bạn đang truy cập thì bạn cũng có thể chỉ định trong danh sách đối số get.

Nếu trang html của bạn có những yếu tố này để sử dụng cho web biểu mẫu đăng bài:

<textarea id="text" class="wikitext" name="text" cols="80" rows="20"> 
This is where your edited text will go 
</textarea> 
<input type="submit" id="save" name="save" value="Submit changes"> 

Sau đó mã python để gửi mẫu này là như sau:

import requests 
from bs4 import BeautifulSoup 

url = "http://www.someurl.com" 

username = "your_username" 
password = "your_password" 

response = requests.get(url, auth=(username, password), verify=False) 

# Getting the text of the page from the response data  
page = BeautifulSoup(response.text) 

# Finding the text contained in a specific element, for instance, the 
# textarea element that contains the area where you would write a forum post 
txt = page.find('textarea', id="text").string 

# Finding the value of a specific attribute with name = "version" and 
# extracting the contents of the value attribute 
tag = page.find('input', attrs = {'name':'version'}) 
ver = tag['value'] 

# Changing the text to whatever you want 
txt = "Your text here, this will be what is written to the textarea for the post" 

# construct the POST request 
form_data = { 
    'save' : 'Submit changes' 
    'text' : txt 
} 

post = requests.post(url,auth=(username, password),data=form_data,verify=False) 
Các vấn đề liên quan