Làm việc với các Forms và yêu cầu POST (phần 4)

Làm việc với các Forms và yêu cầu POST (tiếp tục)

Chính như params, đối số data được cung cấp như một Python dictionary object trình bày các cặp name-value.
Tuy nhiên, thế vẫn chưa xong, xem kết quả của code trên bỏ qua requests.get

import requests
url = ‘http://www.webscrapingfordatascience.com/postform3/’
# No GET request needed?
formdata = {
‘name’: ‘Seppe’,
‘gender’: ‘M’,
‘pizza’: ‘like’,
‘haircolor’: ‘brown’,
‘comments’: ”
}
r = requests.post(url, data=formdata)
print(r.text)
# Will show: Are you trying to submit information from somewhere else?

Tại sao bạn lại đệ trình thông tin từ người khác. Câu trả lời nằm ở một phần tử form thêm cái bây giờ có mặt trong
code nguồn HTML

<input type=”hidden” name=”protection” value=”2c17abf5d5b4e326bea802600ff88405″>

Như bạn có thể thấy, form này tích hợp một trường ẩn mới cái sẽ được đệ trình với phần còn lại của form data,
tên là protection. Nó sẽ như thế nào khi bao gồm nó trực tiếp trong code nguồn Python của chúng ta như sau:

url = ‘http://www.webscrapingfordatascience.com/postform3/’
formdata = {
‘name’: ‘Seppe’,
‘gender’: ‘M’,
‘pizza’: ‘like’,
‘haircolor’: ‘brown’,
‘comments’: ”,
‘protection’: ‘2c17abf5d5b4e326bea802600ff88405’
}
r = requests.post(url, data=formdata)
print(r.text)
# Will show: You waited too long to submit this information. Try
<a href=”./”>again</a>.

Chúng ta vẫn gặp lỗi, để làm việc qua cái này, chúng ta không có biện pháp nào khác ngoài trước tiên lấy ra nguồn
HTML của form sử dụng một yêu cầu GET

import requests
from bs4 import BeautifulSoup
url = ‘http://www.webscrapingfordatascience.com/postform3/’
# First perform a GET request
r = requests.get(url)
# Get out the value for protection
html_soup = BeautifulSoup(r.text, ‘html.parser’)
p_val = html_soup.find(‘input’, attrs={‘name’: ‘protection’}).get(‘value’)
# Then use it in a POST request
formdata = {
‘name’: ‘Seppe’,
‘gender’: ‘M’,
‘pizza’: ‘like’,
‘haircolor’: ‘brown’,
‘comments’: ”,
‘protection’: p_val
}
r = requests.post(url, data=formdata)
print(r.text)

Code trên minh họa một biện pháp bảo vệ cái bạn gặp mọi lần trong các tình huống đời thực.

Chia sẻ