Saya mencoba untuk memberikan argumen yang ditentukan pengguna ke laba-laba scrapy. Adakah yang bisa menyarankan bagaimana melakukan itu?
Saya membaca tentang suatu parameter di -a
suatu tempat tetapi tidak tahu cara menggunakannya.
sumber
Saya mencoba untuk memberikan argumen yang ditentukan pengguna ke laba-laba scrapy. Adakah yang bisa menyarankan bagaimana melakukan itu?
Saya membaca tentang suatu parameter di -a
suatu tempat tetapi tidak tahu cara menggunakannya.
Argumen laba-laba diteruskan dalam crawl
perintah menggunakan -a
opsi. Sebagai contoh:
scrapy crawl myspider -a category=electronics -a domain=system
Spider dapat mengakses argumen sebagai atribut:
class MySpider(scrapy.Spider):
name = 'myspider'
def __init__(self, category='', **kwargs):
self.start_urls = [f'http://www.example.com/{category}'] # py36
super().__init__(**kwargs) # python3
def parse(self, response)
self.log(self.domain) # system
Diambil dari dokumen Scrapy: http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments
Pembaruan 2013 : Tambahkan argumen kedua
Pembaruan 2015 : Sesuaikan kata-kata
Pembaruan 2016 : Gunakan kelas dasar yang lebih baru dan tambahkan super, terima kasih @Birla
Pembaruan 2017 : Gunakan super Python3
# previously
super(MySpider, self).__init__(**kwargs) # python2
Pembaruan 2018 : Seperti yang ditunjukkan @eLRuLL , spider dapat mengakses argumen sebagai atribut
self.domain
, saya masih tidak dapat mengaksesnya di luar__init__
metode. Python memunculkan kesalahan yang tidak ditentukan. BTW, mengapa Anda mengabaikansuper
panggilan? PS. Saya bekerja dengan kelas CrawlSpider__init__
adalah metode kelas spider. Implementasinya tidak dengan sendirinya membuat laba-laba menjadi kurang kuat dan itu termasuk dalam jawaban untuk menunjukkan bahwa Anda dapat mendeklarasikan default untuk argumen kata kunci tetapi seperti yang Anda katakan itu opsional. Seperti yang kami tunjukkan tahun lalu Anda tidak perlu menggunakangetattr
Anda hanya dapat mengakses argumen sebagai atribut, misalnyaself.category
atau seperti yang kita lihat dalam jawabanself.domain
Jawaban sebelumnya benar, tetapi Anda tidak perlu mendeklarasikan konstruktor (
__init__
) setiap kali Anda ingin mengkodekan spider scrapy, Anda dapat menentukan parameter seperti sebelumnya:dan dalam kode laba-laba Anda, Anda bisa menggunakannya sebagai argumen laba-laba:
Dan itu berhasil.
sumber
Untuk meneruskan argumen dengan perintah crawl
Untuk meneruskan argumen agar berjalan di scrapyd, ganti -a dengan -d
Laba-laba akan menerima argumen dalam konstruktornya.
Scrapy menempatkan semua argumen sebagai atribut spider dan Anda dapat melewati metode init sepenuhnya. Hati-hati gunakan metode getattr untuk mendapatkan atribut tersebut sehingga kode Anda tidak rusak.
sumber
Argumen laba-laba diteruskan saat menjalankan perintah perayapan menggunakan opsi -a. Misalnya jika saya ingin memberikan nama domain sebagai argumen untuk laba-laba saya maka saya akan melakukan ini-
Dan menerima argumen di konstruktor laba-laba:
...
itu akan berhasil :)
sumber
Alternatifnya kita bisa menggunakan ScrapyD yang mengekspos API dimana kita bisa meneruskan nama start_url dan spider. ScrapyD memiliki api untuk menghentikan / memulai / status / daftar laba-laba.
scrapyd-deploy
akan menyebarkan laba-laba dalam bentuk telur ke daemon dan bahkan mempertahankan versi laba-laba. Saat memulai laba-laba, Anda dapat menyebutkan laba-laba versi mana yang akan digunakan.curl http://localhost:6800/schedule.json -d project=default -d spider=testspider -d start_urls="https://www.anyurl...|https://www.anyurl2"
Keuntungan tambahannya adalah Anda dapat membangun UI Anda sendiri untuk menerima url dan parameter lain dari pengguna dan menjadwalkan tugas menggunakan API jadwal scrapyd di atas
Lihat dokumentasi API scrapyd untuk lebih jelasnya
sumber