Biểu mẫu web tự động điền Python

Một trong những nhiệm vụ khó khăn nhất khi quét web là có thể đăng nhập tự động và trích xuất dữ liệu trong tài khoản của bạn trên trang web đó. Trong hướng dẫn này, bạn sẽ học cách trích xuất tất cả các biểu mẫu từ các trang web, điền và gửi chúng bằng thư viện request_html và BeautifulSoup

Để bắt đầu, hãy cài đặt chúng

pip3 install requests_html bs4

Có liên quan. Cách tự động đăng nhập bằng Selenium trong Python

Trích xuất các biểu mẫu từ các trang web

Mở một tập tin mới. Tôi đang gọi nó là form_extractor. py

from bs4 import BeautifulSoup
from requests_html import HTMLSession
from pprint import pprint

Để bắt đầu, chúng tôi cần một cách để đảm bảo rằng sau khi thực hiện các yêu cầu đối với trang web mục tiêu, chúng tôi sẽ lưu trữ các cookie do trang web đó cung cấp để chúng tôi có thể duy trì phiên

# initialize an HTTP session
session = HTMLSession[]

Giờ đây, biến

from bs4 import BeautifulSoup
from requests_html import HTMLSession
from pprint import pprint
8 là một phiên có thể sử dụng được để duy trì cookie; . Hãy viết một hàm cung cấp một URL, yêu cầu trang đó, trích xuất tất cả các thẻ biểu mẫu HTML từ nó, sau đó trả lại chúng [dưới dạng danh sách]

def get_all_forms[url]:
    """Returns all form tags found on a web page's `url` """
    # GET request
    res = session.get[url]
    # for javascript driven website
    # res.html.render[]
    soup = BeautifulSoup[res.html.html, "html.parser"]
    return soup.find_all["form"]

Bạn có thể nhận thấy rằng tôi đã nhận xét rằng res. html. render[] thực thi Javascript trước khi cố gắng trích xuất bất kỳ thứ gì, vì một số trang web tải động nội dung của họ bằng Javascript, hãy bỏ ghi chú nếu bạn cảm thấy rằng trang web đang sử dụng Javascript để tải biểu mẫu

Vì vậy, chức năng trên sẽ có thể trích xuất tất cả các biểu mẫu từ một trang web, nhưng chúng tôi cần một cách để trích xuất chi tiết của từng biểu mẫu, chẳng hạn như đầu vào, biểu mẫu

from bs4 import BeautifulSoup
from requests_html import HTMLSession
from pprint import pprint
9 [
# initialize an HTTP session
session = HTMLSession[]
0,
# initialize an HTTP session
session = HTMLSession[]
1,
# initialize an HTTP session
session = HTMLSession[]
2, v.v. ] và
# initialize an HTTP session
session = HTMLSession[]
3 [URL mục tiêu để gửi biểu mẫu], hàm bên dưới sẽ thực hiện điều đó

def get_form_details[form]:
    """Returns the HTML details of a form,
    including action, method and list of form controls [inputs, etc]"""
    details = {}
    # get the form action [requested URL]
    action = form.attrs.get["action"].lower[]
    # get the form method [POST, GET, DELETE, etc]
    # if not specified, GET is the default in HTML
    method = form.attrs.get["method", "get"].lower[]
    # get all form inputs
    inputs = []
    for input_tag in form.find_all["input"]:
        # get type of input form control
        input_type = input_tag.attrs.get["type", "text"]
        # get name attribute
        input_name = input_tag.attrs.get["name"]
        # get the default value of that input tag
        input_value =input_tag.attrs.get["value", ""]
        # add everything to that list
        inputs.append[{"type": input_type, "name": input_name, "value": input_value}]

Ở trên chỉ chịu trách nhiệm trích xuất các thẻ HTML đầu vào. Hãy trích xuất cả

# initialize an HTTP session
session = HTMLSession[]
4s và
# initialize an HTTP session
session = HTMLSession[]
5s

    for select in form.find_all["select"]:
        # get the name attribute
        select_name = select.attrs.get["name"]
        # set the type as select
        select_type = "select"
        select_options = []
        # the default select value
        select_default_value = ""
        # iterate over options and get the value of each
        for select_option in select.find_all["option"]:
            # get the option value used to submit the form
            option_value = select_option.attrs.get["value"]
            if option_value:
                select_options.append[option_value]
                if select_option.attrs.get["selected"]:
                    # if 'selected' attribute is set, set this option as default    
                    select_default_value = option_value
        if not select_default_value and select_options:
            # if the default is not set, and there are options, take the first option as default
            select_default_value = select_options[0]
        # add the select to the inputs list
        inputs.append[{"type": select_type, "name": select_name, "values": select_options, "value": select_default_value}]
    for textarea in form.find_all["textarea"]:
        # get the name attribute
        textarea_name = textarea.attrs.get["name"]
        # set the type as textarea
        textarea_type = "textarea"
        # get the textarea value
        textarea_value = textarea.attrs.get["value", ""]
        # add the textarea to the inputs list
        inputs.append[{"type": textarea_type, "name": textarea_name, "value": textarea_value}]

Vòng lặp for đầu tiên trích xuất tất cả các thẻ

# initialize an HTTP session
session = HTMLSession[]
4 trong biểu mẫu. Chúng tôi cũng nhận được tất cả các tùy chọn có sẵn và thêm chúng vào chi tiết biểu mẫu. Vòng lặp thứ hai là về việc tìm các thẻ
# initialize an HTTP session
session = HTMLSession[]
5 và thêm chúng vào chi tiết biểu mẫu, hoàn thành chức năng

    # put everything to the resulting dictionary
    details["action"] = action
    details["method"] = method
    details["inputs"] = inputs
    return details

Ghi chú. Bạn luôn có thể kiểm tra toàn bộ mã trên trang này

Bây giờ, hãy thử các chức năng này trước khi chúng tôi đi sâu vào việc gửi biểu mẫu

if __name__ == "__main__":
    import sys
    # get URL from the command line
    url = sys.argv[1]
    # get all form tags
    forms = get_all_forms[url]
    # iteratte over forms
    for i, form in enumerate[forms, start=1]:
        form_details = get_form_details[form]
        print["="*50, f"form #{i}", "="*50]
        print[form_details]

Tôi đã sử dụng enumerate[] chỉ để đánh số các biểu mẫu được trích xuất. Hãy lưu tệp Python dưới dạng

# initialize an HTTP session
session = HTMLSession[]
8 và chạy nó

$ python form_extractor.py //wikipedia.org

Đây là kết quả trong trường hợp trang chủ của Wikipedia

================================================== form #1 ==================================================
{'action': '//www.wikipedia.org/search-redirect.php',
 'inputs': [{'name': 'family', 'type': 'hidden', 'value': 'Wikipedia'},
            {'name': 'language', 'type': 'hidden', 'value': 'en'},
            {'name': 'search', 'type': 'search', 'value': ''},
            {'name': 'go', 'type': 'hidden', 'value': 'Go'},
            {'name': 'language',
             'type': 'select',
             'value': 'en',
             'values': ['af', 'pl', 'sk', 'ar', 'ast', 'az', 'bg', 'nan', 'bn', 'be', 'ca', 'cs', 'cy', 'da', 'de', 'et', 'el', 'en', 'es', 'eo', 'eu', 'fa', 'fr', 'gl', 'hy', 'hi', 'hr', 'id', 'it', 'he', 'ka', 'la', 'lv', 'lt', 'hu', 'mk', 'arz', 'ms', 'min', 'nl', 'ja', 'no', 'nn', 'ce', 'uz', 'pt', 'kk', 'ro', 'ru', 'simple', 'ceb', 'sl', 'sr', 'sh', 'sv', 'ta', 'tt', 'th', 'tg', 'azb', 'tr', 'uk', 'ur', 'vi', 'vo', 'war', 'zh-yue', 'zh','my']}],
 'method': 'get'}

Như bạn có thể thấy, nếu bạn cố truy cập vào trang đó bằng trình duyệt của mình, bạn sẽ thấy một hộp tìm kiếm Wikipedia đơn giản. Đó là lý do tại sao chúng ta chỉ thấy một hình thức ở đây

học cũng được. Cách tải xuống tất cả hình ảnh từ một trang web bằng Python

Gửi biểu mẫu web

Bạn cũng có thể nhận thấy rằng hầu hết các trường đầu vào được trích xuất trước đó đều có loại

# initialize an HTTP session
session = HTMLSession[]
9; . Thay vào đó, chúng ta cần điền vào đầu vào có tên "tìm kiếm" và loại "tìm kiếm", đó là trường hiển thị duy nhất cho người dùng thông thường. Tổng quát hơn, chúng tôi tìm kiếm bất kỳ trường nhập liệu nào không bị ẩn đối với người dùng, bao gồm các trường
# initialize an HTTP session
session = HTMLSession[]
4 và
# initialize an HTTP session
session = HTMLSession[]
5

Mở một tệp Python mới. Tôi sẽ gọi nó là

def get_all_forms[url]:
    """Returns all form tags found on a web page's `url` """
    # GET request
    res = session.get[url]
    # for javascript driven website
    # res.html.render[]
    soup = BeautifulSoup[res.html.html, "html.parser"]
    return soup.find_all["form"]
2 và nhập các thư viện mà chúng tôi sẽ cần

from bs4 import BeautifulSoup
from requests_html import HTMLSession
from pprint import pprint
0

Chúng tôi đang lấy các chức năng mà chúng tôi đã làm trước đó từ tệp

# initialize an HTTP session
session = HTMLSession[]
8, hãy bắt đầu sử dụng chúng

Đầu tiên ta giải nén tất cả các biểu mẫu có sẵn và in ra màn hình

from bs4 import BeautifulSoup
from requests_html import HTMLSession
from pprint import pprint
1

Bây giờ để làm cho mã của chúng tôi linh hoạt nhất có thể [trong đó chúng tôi có thể chạy cho bất kỳ trang web nào], hãy nhắc người dùng tập lệnh chọn biểu mẫu nào sẽ gửi

from bs4 import BeautifulSoup
from requests_html import HTMLSession
from pprint import pprint
2

Bây giờ hãy xây dựng dữ liệu đệ trình của chúng tôi

from bs4 import BeautifulSoup
from requests_html import HTMLSession
from pprint import pprint
3

Vì vậy, đoạn mã trên sẽ sử dụng giá trị mặc định của các trường ẩn [chẳng hạn như mã thông báo CSRF] và nhắc người dùng về các trường nhập khác [chẳng hạn như tìm kiếm, email, văn bản và các trường khác]. Nó cũng sẽ nhắc người dùng chọn từ các tùy chọn

# initialize an HTTP session
session = HTMLSession[]
4 có sẵn

Hãy xem làm thế nào chúng ta có thể gửi nó dựa trên phương pháp

from bs4 import BeautifulSoup
from requests_html import HTMLSession
from pprint import pprint
4

Tôi chỉ sử dụng

# initialize an HTTP session
session = HTMLSession[]
0 hoặc
# initialize an HTTP session
session = HTMLSession[]
1 ở đây, nhưng bạn có thể mở rộng điều này cho các phương thức HTTP khác, chẳng hạn như
def get_all_forms[url]:
    """Returns all form tags found on a web page's `url` """
    # GET request
    res = session.get[url]
    # for javascript driven website
    # res.html.render[]
    soup = BeautifulSoup[res.html.html, "html.parser"]
    return soup.find_all["form"]
7 và
# initialize an HTTP session
session = HTMLSession[]
2 [sử dụng phiên. đặt [] và phiên. phương thức xóa [] tương ứng]

Được rồi, bây giờ chúng ta có biến

def get_all_forms[url]:
    """Returns all form tags found on a web page's `url` """
    # GET request
    res = session.get[url]
    # for javascript driven website
    # res.html.render[]
    soup = BeautifulSoup[res.html.html, "html.parser"]
    return soup.find_all["form"]
9 chứa phản hồi HTTP; . Đoạn mã dưới đây chuẩn bị nội dung HTML của trang web để lưu nó trên máy tính cục bộ của chúng tôi

from bs4 import BeautifulSoup
from requests_html import HTMLSession
from pprint import pprint
5

Tất cả điều này đang làm là thay thế các URL tương đối [chẳng hạn như /wiki/Programming_language] bằng các URL tuyệt đối [chẳng hạn như https. //www. wikipedia. org/wiki/Programming_language], vì vậy chúng tôi có thể duyệt trang cục bộ trong máy tính của mình một cách đầy đủ. Tôi đã lưu tất cả nội dung vào một tệp cục bộ

def get_form_details[form]:
    """Returns the HTML details of a form,
    including action, method and list of form controls [inputs, etc]"""
    details = {}
    # get the form action [requested URL]
    action = form.attrs.get["action"].lower[]
    # get the form method [POST, GET, DELETE, etc]
    # if not specified, GET is the default in HTML
    method = form.attrs.get["method", "get"].lower[]
    # get all form inputs
    inputs = []
    for input_tag in form.find_all["input"]:
        # get type of input form control
        input_type = input_tag.attrs.get["type", "text"]
        # get name attribute
        input_name = input_tag.attrs.get["name"]
        # get the default value of that input tag
        input_value =input_tag.attrs.get["value", ""]
        # add everything to that list
        inputs.append[{"type": input_type, "name": input_name, "value": input_value}]
0, hãy mở nó trong trình duyệt của chúng ta

from bs4 import BeautifulSoup
from requests_html import HTMLSession
from pprint import pprint
6

Được rồi, mã được thực hiện. Đây là cách tôi thực hiện điều này

from bs4 import BeautifulSoup
from requests_html import HTMLSession
from pprint import pprint
7

Lúc đầu, tập lệnh nhắc tôi chọn từ danh sách các biểu mẫu. Trong trường hợp của chúng tôi, chỉ có một hình thức. Sau đó, nó nhắc tôi về tất cả các biểu mẫu không ẩn có sẵn, đó là trường chọn

def get_form_details[form]:
    """Returns the HTML details of a form,
    including action, method and list of form controls [inputs, etc]"""
    details = {}
    # get the form action [requested URL]
    action = form.attrs.get["action"].lower[]
    # get the form method [POST, GET, DELETE, etc]
    # if not specified, GET is the default in HTML
    method = form.attrs.get["method", "get"].lower[]
    # get all form inputs
    inputs = []
    for input_tag in form.find_all["input"]:
        # get type of input form control
        input_type = input_tag.attrs.get["type", "text"]
        # get name attribute
        input_name = input_tag.attrs.get["name"]
        # get the default value of that input tag
        input_value =input_tag.attrs.get["value", ""]
        # add everything to that list
        inputs.append[{"type": input_type, "name": input_name, "value": input_value}]
1 và
def get_form_details[form]:
    """Returns the HTML details of a form,
    including action, method and list of form controls [inputs, etc]"""
    details = {}
    # get the form action [requested URL]
    action = form.attrs.get["action"].lower[]
    # get the form method [POST, GET, DELETE, etc]
    # if not specified, GET is the default in HTML
    method = form.attrs.get["method", "get"].lower[]
    # get all form inputs
    inputs = []
    for input_tag in form.find_all["input"]:
        # get type of input form control
        input_type = input_tag.attrs.get["type", "text"]
        # get name attribute
        input_name = input_tag.attrs.get["name"]
        # get the default value of that input tag
        input_value =input_tag.attrs.get["value", ""]
        # add everything to that list
        inputs.append[{"type": input_type, "name": input_name, "value": input_value}]
2

Điều này về cơ bản giống như điền thủ công vào biểu mẫu trong trình duyệt web và chọn ngôn ngữ

Sau khi tôi nhấn enter trong quá trình thực thi mã của mình, thao tác này sẽ gửi biểu mẫu, lưu trang kết quả cục bộ và tự động mở nó trong trình duyệt web mặc định

Đây là cách Python nhìn thấy kết quả, vì vậy chúng tôi đã tự động gửi thành công biểu mẫu tìm kiếm và tải trang kết quả với sự trợ giúp của Python

Phần kết luận

Được rồi, vậy thôi. Trong hướng dẫn này, chúng tôi đã tìm kiếm Wikipedia. Tuy nhiên, như đã đề cập trước đó, bạn có thể sử dụng nó trên bất kỳ biểu mẫu nào bạn muốn, đặc biệt là biểu mẫu đăng nhập, trong đó bạn có thể đăng nhập và tiếp tục trích xuất dữ liệu yêu cầu xác thực người dùng

Xem cách bạn có thể mở rộng điều này. Chẳng hạn, bạn có thể thử tạo một trình gửi cho tất cả các biểu mẫu [vì chúng tôi chỉ sử dụng biểu mẫu đầu tiên ở đây] hoặc bạn có thể tạo một trình thu thập thông tin tinh vi để trích xuất tất cả các liên kết trang web và tìm tất cả các biểu mẫu của một trang web cụ thể. Tuy nhiên, hãy nhớ rằng một trang web có thể cấm địa chỉ IP của bạn nếu bạn yêu cầu nhiều trang trong một thời gian ngắn. Trong trường hợp đó, bạn có thể làm chậm trình thu thập thông tin của mình hoặc sử dụng proxy

Ngoài ra, bạn có thể mở rộng mã này bằng cách đăng nhập tự động bằng Selenium. Hãy xem hướng dẫn này để biết cách bạn có thể làm điều đó

Bạn có thể lấy mã hoàn chỉnh của hướng dẫn này tại đây

Bạn muốn tìm hiểu thêm về Web Scraping?

Cuối cùng, nếu bạn muốn tìm hiểu sâu hơn về web scraping với các thư viện Python khác nhau, không chỉ BeautifulSoup, các khóa học dưới đây chắc chắn sẽ có giá trị cho bạn

Làm cách nào để tự động hóa ứng dụng web bằng Python?

Cách chạy thử nghiệm Selenium đầu tiên của bạn với Python. Ví dụ .
Đầu tiên nhập các lớp WebDriver và Keys từ Selenium. .
Tiếp theo, tạo một phiên bản Chrome với đường dẫn của trình điều khiển mà bạn đã tải xuống thông qua các trang web của trình duyệt tương ứng. .
Tiếp theo, sử dụng. .
Khi trang tải thành công, bạn có thể sử dụng

Làm cách nào để nhập dữ liệu vào trang web bằng Python?

Để trích xuất dữ liệu bằng cách sử dụng quét web với python, bạn cần làm theo các bước cơ bản sau. .
Tìm URL mà bạn muốn cạo
Kiểm tra Trang
Tìm dữ liệu bạn muốn trích xuất
Viết mã
Chạy mã và giải nén dữ liệu
Lưu trữ dữ liệu ở định dạng cần thiết

Chủ Đề