Tôi đang viết một hàm cho một số mã python hiện có sẽ được chuyển qua một đối tượng Trình duyệt cơ khí làm tham số.Khôi phục từ HTTPError trong Cơ chế
Tôi điền một số chi tiết vào biểu mẫu trong trình duyệt và sử dụng response = browser.submit()
để chuyển trình duyệt sang trang mới và thu thập một số thông tin từ trình duyệt đó.
Thật không may, tôi thỉnh thoảng nhận được lỗi sau:
httperror_seek_wrapper: HTTP Error 500: Internal Server Error
tôi đã chuyển đến trang trong trình duyệt của riêng tôi, và chắc chắn đủ, tôi thỉnh thoảng gặp phải lỗi này trực tiếp, vì vậy tôi nghĩ rằng đây là một vấn đề máy chủ, không phải bất cứ điều gì để làm với robots.txt
, tiêu đề hoặc tương tự.
Vấn đề là sau khi gửi, trạng thái của các thay đổi đối tượng browser
và tôi không thể tiếp tục sử dụng nó. Suy nghĩ đầu tiên của tôi là cố gắng lấy một bản sao sâu đầu tiên và sử dụng nó nếu tôi gặp vấn đề, nhưng điều đó đưa ra lỗi TypeError: object.__new__(cStringIO.StringO) is not safe, use cStringIO.StringO.__new__()
như được mô tả here.
Tôi cũng đã thử sử dụng browser.back()
nhưng nhận được lỗi NoneType
.
Có ai có giải pháp tốt cho điều này không?
Solution (với nhờ karnesJ.R dưới đây):
Một giải pháp tuyệt vời dưới đây sử dụng tuyệt vời requests
thư viện (tài liệu here). requests
có chức năng điền vào biểu mẫu và gửi qua post
hoặc get
, điều quan trọng là không thay đổi trạng thái của đối tượng br
.
An excellent website cho phép chúng tôi kiểm tra nhiều mã lỗi khác nhau và có giao diện biểu mẫu ở trên cùng mà tôi đã thử nghiệm tính năng này. Tôi tạo đối tượng br
tại trang web này, sau đó xác định hàm chọn biểu mẫu từ br
, rút ra thông tin có liên quan nhưng gửi thông qua requests
- để đối tượng br
không thay đổi và có thể sử dụng lại được. Mã lỗi gây ra requests
để trả về rác, nhưng không hiển thị br
không sử dụng được.
Như đã nêu bên dưới, điều này liên quan đến thời gian thiết lập ít hơn một chút, nhưng cũng đáng giá.
import mechanize
import requests
def testErrorCodes(br,theCodes):
for x in theCodes:
br.select_form(nr=0)
theAction = br.action
payload = {'code': x}
response = requests.post(theAction, data=payload)
print response.status_code
br=mechanize.Browser()
br.set_handle_robots(False)
response = br.open("http://savanttools.com/test-http-status-codes")
testErrorCodes(br,[401,402,403,404,500,503,504]) # Prints the error codes
testErrorCodes(br,[404]) # The browser is still alive and well to be used again!
Bạn có thể cập nhật cho chúng tôi mã mà bạn đã sử dụng cho đến bây giờ không? –
Bạn có thể thử sử dụng selenuim. – ssundarraj
Bạn có thể hiển thị mã của mình hoặc cung cấp URL trang web bạn đang cố truy cập không? – 0605002