Scrapy - Permintaan dan Respons
Deskripsi
Scrapy dapat merayapi situs web menggunakan Request dan Responsebenda. Objek permintaan melewati sistem, menggunakan spider untuk menjalankan permintaan dan kembali ke permintaan ketika mengembalikan objek respons.
Minta Objek
Objek permintaan adalah permintaan HTTP yang menghasilkan respons. Ini memiliki kelas berikut -
class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta,
encoding = 'utf-8', priority = 0, dont_filter = False, errback])
Tabel berikut menunjukkan parameter objek Permintaan -
Sr Tidak | Parameter & Deskripsi |
---|---|
1 | url Ini adalah string yang menentukan permintaan URL. |
2 | callback Ini adalah fungsi yang dapat dipanggil yang menggunakan respons permintaan sebagai parameter pertama. |
3 | method Ini adalah string yang menentukan permintaan metode HTTP. |
4 | headers Ini adalah kamus dengan header permintaan. |
5 | body Ini adalah string atau unicode yang memiliki isi permintaan. |
6 | cookies Ini adalah daftar yang berisi cookie permintaan. |
7 | meta Ini adalah kamus yang berisi nilai untuk metadata permintaan. |
8 | encoding Ini adalah string yang berisi pengkodean utf-8 yang digunakan untuk menyandikan URL. |
9 | priority Ini adalah bilangan bulat di mana penjadwal menggunakan prioritas untuk menentukan urutan untuk memproses permintaan. |
10 | dont_filter Ini adalah boolean yang menentukan bahwa penjadwal tidak boleh memfilter permintaan. |
11 | errback Ini adalah fungsi yang dapat dipanggil untuk dipanggil saat pengecualian saat memproses permintaan dimunculkan. |
Meneruskan Data Tambahan ke Fungsi Callback
Fungsi panggilan balik dari sebuah permintaan dipanggil ketika respon diunduh sebagai parameter pertamanya.
Misalnya -
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)
Kamu dapat memakai Request.meta atribut, jika Anda ingin meneruskan argumen ke fungsi yang dapat dipanggil dan menerima argumen tersebut di callback kedua seperti yang ditunjukkan dalam contoh berikut -
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
Menggunakan errbacks untuk Menangkap Pengecualian dalam Pemrosesan Permintaan
Errback adalah fungsi yang dapat dipanggil untuk dipanggil saat pengecualian saat memproses permintaan dimunculkan.
Contoh berikut menunjukkan ini -
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)
Request.meta Tombol Khusus
Kunci khusus request.meta adalah daftar kunci meta khusus yang diidentifikasi oleh Scrapy.
Tabel berikut menunjukkan beberapa kunci Request.meta -
Sr Tidak | Kunci & Deskripsi |
---|---|
1 | dont_redirect Ini adalah kunci jika disetel ke true, tidak mengalihkan permintaan berdasarkan status respons. |
2 | dont_retry Ini adalah kunci jika disetel ke true, tidak mencoba lagi permintaan yang gagal dan akan diabaikan oleh middleware. |
3 | handle_httpstatus_list Ini adalah kunci yang menentukan kode respons per permintaan mana yang dapat diizinkan. |
4 | handle_httpstatus_all Ini adalah kunci yang digunakan untuk mengizinkan kode respons apa pun untuk permintaan dengan menyetelnya ke true . |
5 | dont_merge_cookies Ini adalah kunci yang digunakan untuk menghindari penggabungan dengan cookie yang ada dengan menyetelnya ke true . |
6 | cookiejar Ini adalah kunci yang digunakan untuk menyimpan beberapa sesi kue per laba-laba. |
7 | dont_cache Ini adalah kunci yang digunakan untuk menghindari caching permintaan HTTP dan respon pada setiap kebijakan. |
8 | redirect_urls Ini adalah kunci yang berisi URL yang dilalui permintaan. |
9 | bindaddress Ini adalah IP dari alamat IP keluar yang dapat digunakan untuk melakukan permintaan. |
10 | dont_obey_robotstxt Ini adalah kunci jika disetel ke true, tidak memfilter permintaan yang dilarang oleh standar pengecualian robots.txt, meskipun ROBOTSTXT_OBEY diaktifkan. |
11 | download_timeout Ini digunakan untuk mengatur waktu tunggu (dalam detik) per laba-laba yang pengunduh akan menunggu sebelum waktu habis. |
12 | download_maxsize Ini digunakan untuk mengatur ukuran maksimum (dalam byte) per spider, yang akan diunduh oleh pengunduh. |
13 | proxy Proksi dapat diatur untuk objek Permintaan untuk mengatur proxy HTTP untuk penggunaan permintaan. |
Minta Subclass
Anda dapat mengimplementasikan fungsionalitas kustom Anda sendiri dengan membuat subclass kelas permintaan. Subkelas permintaan bawaan adalah sebagai berikut -
Objek FormRequest
Kelas FormRequest menangani formulir HTML dengan memperluas permintaan dasar. Ini memiliki kelas berikut -
class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body,
cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])
Berikut adalah parameternya -
formdata - Ini adalah kamus yang memiliki data formulir HTML yang ditugaskan ke tubuh permintaan.
Note - Parameter yang tersisa sama dengan kelas permintaan dan dijelaskan di Request Objects bagian.
Metode kelas berikut ini didukung oleh FormRequest objek selain metode permintaan -
classmethod from_response(response[, formname = None, formnumber = 0, formdata = None,
formxpath = None, formcss = None, clickdata = None, dont_click = False, ...])
Tabel berikut menunjukkan parameter kelas di atas -
Sr Tidak | Parameter & Deskripsi |
---|---|
1 | response Ini adalah objek yang digunakan untuk mengisi bidang formulir menggunakan bentuk respons HTML. |
2 | formname Ini adalah string di mana formulir yang memiliki atribut nama akan digunakan, jika ditentukan. |
3 | formnumber Ini adalah bilangan bulat formulir yang akan digunakan jika ada beberapa formulir dalam respons. |
4 | formdata Ini adalah kamus bidang dalam formulir data yang digunakan untuk diganti. |
5 | formxpath Ini adalah string saat ditentukan, formulir yang cocok dengan xpath digunakan. |
6 | formcss Ini adalah string ketika ditentukan, formulir yang cocok dengan pemilih css digunakan. |
7 | clickdata Ini adalah kamus atribut yang digunakan untuk mengamati kontrol yang diklik. |
8 | dont_click Data dari formulir akan dikirimkan tanpa mengklik elemen apa pun, jika disetel ke true. |
Contoh
Berikut adalah beberapa contoh penggunaan permintaan -
Using FormRequest to send data via HTTP POST
Kode berikut menunjukkan bagaimana untuk kembali FormRequest objek ketika Anda ingin menduplikasi bentuk HTML POST di spider Anda -
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
Biasanya, situs web menggunakan elemen yang menyediakan bidang formulir yang telah diisi sebelumnya.
Itu FormRequest.form_response() metode dapat digunakan bila Anda ingin bidang ini terisi secara otomatis saat melakukan scraping.
Contoh berikut menunjukkan hal ini.
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
Objek Respons
Ini adalah objek yang menunjukkan respons HTTP yang diumpankan ke spider untuk diproses. Ini memiliki kelas berikut -
class scrapy.http.Response(url[, status = 200, headers, body, flags])
Tabel berikut menunjukkan parameter objek Respon -
Sr Tidak | Parameter & Deskripsi |
---|---|
1 | url Ini adalah string yang menentukan respons URL. |
2 | status Ini adalah integer yang berisi respons status HTTP. |
3 | headers Ini adalah kamus yang berisi header respons. |
4 | body Ini adalah string dengan tubuh respons. |
5 | flags Ini adalah daftar yang berisi bendera tanggapan. |
Subkelas Respon
Anda dapat mengimplementasikan fungsionalitas kustom Anda sendiri dengan membuat subclass kelas respons. Subkelas respons bawaan adalah sebagai berikut -
TextResponse objects
Objek TextResponse digunakan untuk data biner seperti gambar, suara, dll. Yang memiliki kemampuan untuk menyandikan kelas Respon dasar. Ini memiliki kelas berikut -
class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])
Berikut adalah parameternya -
encoding - Ini adalah string dengan pengkodean yang digunakan untuk menyandikan respons.
Note - Parameter yang tersisa sama dengan kelas respons dan dijelaskan di Response Objects bagian.
Tabel berikut menunjukkan atribut yang didukung oleh objek TextResponse selain metode respons -
Sr Tidak | Atribut & Deskripsi |
---|---|
1 | text Ini adalah badan respons, di mana teks respons dapat diakses beberapa kali. |
2 | encoding Ini adalah string yang berisi pengkodean untuk respons. |
3 | selector Ini adalah atribut yang dipakai pada akses pertama dan menggunakan respons sebagai target. |
Tabel berikut menunjukkan metode yang didukung oleh objek TextResponse selain metode respons -
Sr Tidak | Metode & Deskripsi |
---|---|
1 | xpath (query) Ini adalah jalan pintas ke TextResponse.selector.xpath (query). |
2 | css (query) Ini adalah jalan pintas ke TextResponse.selector.css (query). |
3 | body_as_unicode() Ini adalah tubuh respons yang tersedia sebagai metode, di mana respons.text dapat diakses beberapa kali. |
Objek HtmlResponse
Ini adalah objek yang mendukung pengkodean dan penemuan otomatis dengan melihat atribut meta httpequiv dari HTML. Parameternya sama dengan kelas respons dan dijelaskan di bagian Objek respons. Ini memiliki kelas berikut -
class scrapy.http.HtmlResponse(url[,status = 200, headers, body, flags])
Objek XmlResponse
Ini adalah objek yang mendukung encoding dan penemuan otomatis dengan melihat baris XML. Parameternya sama dengan kelas respons dan dijelaskan di bagian Objek respons. Ini memiliki kelas berikut -
class scrapy.http.XmlResponse(url[, status = 200, headers, body, flags])