Trị liệu - Yêu cầu và phản hồi
Sự miêu tả
Scrapy có thể thu thập dữ liệu các trang web bằng cách sử dụng Request và Responsecác đối tượng. Các đối tượng yêu cầu chuyển qua hệ thống, sử dụng các trình thu thập thông tin để thực hiện yêu cầu và quay lại yêu cầu khi nó trả về một đối tượng phản hồi.
Yêu cầu đối tượng
Đối tượng yêu cầu là một yêu cầu HTTP tạo ra một phản hồi. Nó có lớp sau:
class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta,
encoding = 'utf-8', priority = 0, dont_filter = False, errback])
Bảng sau hiển thị các tham số của đối tượng Yêu cầu:
Sr.No | Mô tả về Thông Số |
---|---|
1 | url Nó là một chuỗi chỉ định yêu cầu URL. |
2 | callback Nó là một hàm có thể gọi sử dụng phản hồi của yêu cầu làm tham số đầu tiên. |
3 | method Nó là một chuỗi chỉ định yêu cầu phương thức HTTP. |
4 | headers Nó là một từ điển với các tiêu đề yêu cầu. |
5 | body Nó là một chuỗi hoặc unicode có phần thân yêu cầu. |
6 | cookies Nó là một danh sách chứa các cookie yêu cầu. |
7 | meta Nó là một từ điển chứa các giá trị cho siêu dữ liệu của yêu cầu. |
số 8 | encoding Nó là một chuỗi chứa mã hóa utf-8 được sử dụng để mã hóa URL. |
9 | priority Nó là một số nguyên trong đó bộ lập lịch sử dụng ưu tiên để xác định thứ tự xử lý các yêu cầu. |
10 | dont_filter Nó là một boolean chỉ định rằng bộ lập lịch không nên lọc yêu cầu. |
11 | errback Nó là một hàm có thể gọi được gọi khi một ngoại lệ trong khi xử lý một yêu cầu được đưa ra. |
Truyền dữ liệu bổ sung cho các chức năng gọi lại
Hàm gọi lại của một yêu cầu được gọi khi phản hồi được tải xuống dưới dạng tham số đầu tiên của nó.
Ví dụ -
def parse_page1(self, response):
return scrapy.Request("http://www.something.com/some_page.html",
callback = self.parse_page2)
def parse_page2(self, response):
self.logger.info("%s page visited", response.url)
Bạn có thể dùng Request.meta , nếu bạn muốn truyền các đối số cho các hàm có thể gọi và nhận các đối số đó trong lệnh gọi lại thứ hai như được hiển thị trong ví dụ sau:
def parse_page1(self, response):
item = DemoItem()
item['foremost_link'] = response.url
request = scrapy.Request("http://www.something.com/some_page.html",
callback = self.parse_page2)
request.meta['item'] = item
return request
def parse_page2(self, response):
item = response.meta['item']
item['other_link'] = response.url
return item
Sử dụng lỗi để nắm bắt ngoại lệ trong xử lý yêu cầu
Errback là một hàm có thể gọi được gọi khi một ngoại lệ trong khi xử lý một yêu cầu được đưa ra.
Ví dụ sau đây chứng minh điều này -
import scrapy
from scrapy.spidermiddlewares.httperror import HttpError
from twisted.internet.error import DNSLookupError
from twisted.internet.error import TimeoutError, TCPTimedOutError
class DemoSpider(scrapy.Spider):
name = "demo"
start_urls = [
"http://www.httpbin.org/", # HTTP 200 expected
"http://www.httpbin.org/status/404", # Webpage not found
"http://www.httpbin.org/status/500", # Internal server error
"http://www.httpbin.org:12345/", # timeout expected
"http://www.httphttpbinbin.org/", # DNS error expected
]
def start_requests(self):
for u in self.start_urls:
yield scrapy.Request(u, callback = self.parse_httpbin,
errback = self.errback_httpbin,
dont_filter=True)
def parse_httpbin(self, response):
self.logger.info('Recieved response from {}'.format(response.url))
# ...
def errback_httpbin(self, failure):
# logs failures
self.logger.error(repr(failure))
if failure.check(HttpError):
response = failure.value.response
self.logger.error("HttpError occurred on %s", response.url)
elif failure.check(DNSLookupError):
request = failure.request
self.logger.error("DNSLookupError occurred on %s", request.url)
elif failure.check(TimeoutError, TCPTimedOutError):
request = failure.request
self.logger.error("TimeoutError occurred on %s", request.url)
Các phím đặc biệt Request.meta
Các khóa đặc biệt request.meta là danh sách các khóa meta đặc biệt được Scrapy xác định.
Bảng sau đây cho thấy một số khóa của Request.meta -
Sr.No | Khóa & Mô tả |
---|---|
1 | dont_redirect Nó là một khóa khi được đặt thành true, không chuyển hướng yêu cầu dựa trên trạng thái của phản hồi. |
2 | dont_retry Nó là một khóa khi được đặt thành true, không thử lại các yêu cầu không thành công và sẽ bị phần mềm trung gian bỏ qua. |
3 | handle_httpstatus_list Nó là một khóa xác định mã phản hồi nào có thể được phép trên cơ sở yêu cầu. |
4 | handle_httpstatus_all Nó là một khóa được sử dụng để cho phép bất kỳ mã phản hồi nào cho một yêu cầu bằng cách đặt nó thành true . |
5 | dont_merge_cookies Nó là một khóa được sử dụng để tránh hợp nhất với các cookie hiện có bằng cách đặt nó thành true . |
6 | cookiejar Nó là một khóa được sử dụng để giữ nhiều phiên cookie cho mỗi trình thu thập dữ liệu. |
7 | dont_cache Nó là một khóa được sử dụng để tránh các yêu cầu HTTP vào bộ nhớ đệm và phản hồi trên mỗi chính sách. |
số 8 | redirect_urls Nó là một khóa chứa các URL mà các yêu cầu đi qua. |
9 | bindaddress Nó là IP của địa chỉ IP gửi đi có thể được sử dụng để thực hiện yêu cầu. |
10 | dont_obey_robotstxt Nó là một khóa khi được đặt thành true, không lọc các yêu cầu bị cấm bởi tiêu chuẩn loại trừ robots.txt, ngay cả khi ROBOTSTXT_OBEY được bật. |
11 | download_timeout Nó được sử dụng để đặt thời gian chờ (tính bằng giây) cho mỗi nhện mà người tải xuống sẽ đợi trước khi hết thời gian. |
12 | download_maxsize Nó được sử dụng để đặt kích thước tối đa (tính bằng byte) cho mỗi con nhện mà trình tải xuống sẽ tải xuống. |
13 | proxy Proxy có thể được đặt cho các đối tượng Yêu cầu để đặt proxy HTTP cho việc sử dụng các yêu cầu. |
Yêu cầu lớp con
Bạn có thể triển khai chức năng tùy chỉnh của riêng mình bằng cách phân lớp lớp yêu cầu. Các lớp con yêu cầu tích hợp như sau:
Đối tượng FormRequest
Lớp FormRequest xử lý các biểu mẫu HTML bằng cách mở rộng yêu cầu cơ sở. Nó có lớp sau:
class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body,
cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])
Sau đây là tham số -
formdata - Đây là một từ điển có dữ liệu dạng HTML được gán cho phần thân của yêu cầu.
Note - Các tham số còn lại giống với lớp yêu cầu và được giải thích trong Request Objects phần.
Các phương thức lớp sau được hỗ trợ bởi FormRequest các đối tượng ngoài các phương thức yêu cầu -
classmethod from_response(response[, formname = None, formnumber = 0, formdata = None,
formxpath = None, formcss = None, clickdata = None, dont_click = False, ...])
Bảng sau đây cho thấy các tham số của lớp trên:
Sr.No | Mô tả về Thông Số |
---|---|
1 | response Nó là một đối tượng được sử dụng để điền trước các trường biểu mẫu bằng cách sử dụng biểu mẫu phản hồi HTML. |
2 | formname Nó là một chuỗi mà biểu mẫu có thuộc tính name sẽ được sử dụng, nếu được chỉ định. |
3 | formnumber Nó là một số nguyên của các biểu mẫu được sử dụng khi có nhiều biểu mẫu trong phản hồi. |
4 | formdata Nó là một từ điển của các trường trong dữ liệu biểu mẫu được sử dụng để ghi đè. |
5 | formxpath Nó là một chuỗi khi được chỉ định, biểu mẫu khớp với xpath được sử dụng. |
6 | formcss Nó là một chuỗi khi được chỉ định, biểu mẫu khớp với bộ chọn css được sử dụng. |
7 | clickdata Nó là một từ điển các thuộc tính được sử dụng để quan sát điều khiển được nhấp. |
số 8 | dont_click Dữ liệu từ biểu mẫu sẽ được gửi mà không cần nhấp vào bất kỳ phần tử nào, khi được đặt thành true. |
Ví dụ
Sau đây là một số ví dụ sử dụng yêu cầu:
Using FormRequest to send data via HTTP POST
Đoạn mã sau minh họa cách trả về FormRequest đối tượng khi bạn muốn sao chép biểu mẫu HTML POST trong trình thu thập dữ liệu của bạn -
return [FormRequest(url = "http://www.something.com/post/action",
formdata = {'firstname': 'John', 'lastname': 'dave'},
callback = self.after_post)]
Using FormRequest.from_response() to simulate a user login
Thông thường, các trang web sử dụng các phần tử mà qua đó nó cung cấp các trường biểu mẫu được điền sẵn.
Các FormRequest.form_response() có thể được sử dụng khi bạn muốn các trường này được tự động điền trong khi cạo.
Ví dụ sau đây chứng minh điều này.
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
start_urls = ['http://www.something.com/users/login.php']
def parse(self, response):
return scrapy.FormRequest.from_response(
response,
formdata = {'username': 'admin', 'password': 'confidential'},
callback = self.after_login
)
def after_login(self, response):
if "authentication failed" in response.body:
self.logger.error("Login failed")
return
# You can continue scraping here
Đối tượng phản hồi
Nó là một đối tượng chỉ ra phản hồi HTTP được cấp cho các trình thu thập thông tin để xử lý. Nó có lớp sau:
class scrapy.http.Response(url[, status = 200, headers, body, flags])
Bảng sau đây cho thấy các tham số của các đối tượng Đáp ứng:
Sr.No | Mô tả về Thông Số |
---|---|
1 | url Nó là một chuỗi chỉ định phản hồi URL. |
2 | status Nó là một số nguyên chứa phản hồi trạng thái HTTP. |
3 | headers Nó là một từ điển chứa các tiêu đề phản hồi. |
4 | body Nó là một chuỗi với phần thân phản hồi. |
5 | flags Nó là một danh sách chứa các cờ phản hồi. |
Các lớp con phản hồi
Bạn có thể triển khai chức năng tùy chỉnh của riêng mình bằng cách phân lớp lớp phản hồi. Các lớp con phản hồi tích hợp như sau:
TextResponse objects
Các đối tượng TextResponse được sử dụng cho dữ liệu nhị phân như hình ảnh, âm thanh, v.v. có khả năng mã hóa lớp Phản hồi cơ sở. Nó có lớp sau:
class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])
Sau đây là tham số -
encoding - Nó là một chuỗi có mã hóa được sử dụng để mã hóa một phản hồi.
Note - Các tham số còn lại giống với lớp phản hồi và được giải thích trong Response Objects phần.
Bảng sau đây cho thấy các thuộc tính được hỗ trợ bởi đối tượng TextResponse ngoài các phương thức phản hồi:
Sr.No | Thuộc tính & Mô tả |
---|---|
1 | text Nó là một cơ quan phản hồi, nơi response.text có thể được truy cập nhiều lần. |
2 | encoding Nó là một chuỗi chứa mã hóa cho phản hồi. |
3 | selector Nó là một thuộc tính được khởi tạo trong lần truy cập đầu tiên và sử dụng phản hồi làm mục tiêu. |
Bảng sau đây cho thấy các phương thức được hỗ trợ bởi các đối tượng TextResponse ngoài các phương thức phản hồi :
Sr.No | Phương pháp & Mô tả |
---|---|
1 | xpath (query) Nó là một lối tắt đến TextResponse.selector.xpath (truy vấn). |
2 | css (query) Nó là một phím tắt của TextResponse.selector.css (truy vấn). |
3 | body_as_unicode() Nó là một cơ quan phản hồi có sẵn dưới dạng một phương thức, nơi response.text có thể được truy cập nhiều lần. |
Đối tượng HtmlResponse
Nó là một đối tượng hỗ trợ mã hóa và tự động phát hiện bằng cách xem thuộc tính meta httpequiv của HTML. Các tham số của nó giống như lớp phản hồi và được giải thích trong phần Đối tượng phản hồi. Nó có lớp sau:
class scrapy.http.HtmlResponse(url[,status = 200, headers, body, flags])
Đối tượng XmlResponse
Nó là một đối tượng hỗ trợ mã hóa và tự động phát hiện bằng cách nhìn vào dòng XML. Các tham số của nó giống như lớp phản hồi và được giải thích trong phần Đối tượng phản hồi. Nó có lớp sau:
class scrapy.http.XmlResponse(url[, status = 200, headers, body, flags])