24

これは私が使用しようとしているモジュールであり、自動的に入力しようとしているフォームがあります。Mechanize ではなく Requests を使用したい理由は、Mechanize では入力して送信する前にログイン ページをロードする必要があるのに対し、Requests ではロード段階をスキップして直接メッセージの POST に進むことができるためです。 (うまくいけば)。基本的に、ログイン プロセスで消費される帯域幅をできるだけ少なくしようとしています。

2 つ目の質問は、ログイン プロセスとリダイレクトの後、ページ全体を完全にダウンロードするのではなく、ページ タイトルのみを取得することは可能ですか? 基本的にはタイトルだけでログインの成否がわかるので、帯域の使用は極力抑えたい。

HTTPリクエストなどに関しては、私はちょっと初心者なので、助けていただければ幸いです。参考までに、これは学校のプロジェクト用です。

編集質問の最初の部分は回答済みです。私の質問は今、第二部です

4

2 に答える 2

39

いくつかのコード例:

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

最初のステップは、ソース ページを見て、送信されている要素を特定するformことです (Firebug/Chrome/IE ツールを何でも使用します (または単にソースを調べます))。次に、input要素を見つけて、必要なname属性を特定します (上記を参照)。

あなたが提供した URL にはたまたま「Remember Me」があります。私は試していませんが (できないため)、それ以上のログインを避けるために一定期間 Cookie を発行することを意味します。その Cookie は保持されます。でrequest.session

次に、session.get(someurl, ...)ページなどを取得するために使用します...

于 2012-10-30T21:51:41.080 に答える
16

リクエストの get または post 関数内で認証を使用するには、auth引数を指定するだけです。このような:

response = requests.get(url, auth = ('username', 'password')) 詳細については、リクエスト認証のドキュメントを参照してください。

Chrome の開発者ツールを使用して、入力して送信するフォームを含む HTML ページの要素を調べることができます。これがどのように行われるかの説明については、こちらを参照してください。投稿リクエストのデータ引数に入力する必要があるデータを見つけることができます。アクセスしているサイトのセキュリティ証明書を検証することを心配していない場合は、get 引数リストでそれを指定することもできます。

HTML ページに、Web フォームの投稿に使用するこれらの要素がある場合:

<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">

次に、このフォームに投稿する Python コードは次のとおりです。

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)
于 2013-04-26T16:10:26.820 に答える