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])