Saya baru-baru ini belajar Python dan sedang mencelupkan tangan saya ke dalam membangun web-scraper. Tidak ada yang mewah sama sekali; satu-satunya tujuan adalah untuk mendapatkan data dari situs web taruhan dan meminta data ini dimasukkan ke dalam Excel.
Sebagian besar masalah dapat dipecahkan dan saya mengalami sedikit kekacauan. Namun saya memukul rintangan besar atas satu masalah. Jika sebuah situs memuat tabel kuda dan mencantumkan harga taruhan saat ini, informasi ini tidak ada dalam file sumber apa pun. Petunjuknya adalah bahwa data ini kadang-kadang hidup, dengan angka yang diperbarui jelas dari beberapa server jarak jauh. HTML di PC saya hanya memiliki lubang di mana server mereka mendorong melalui semua data menarik yang saya butuhkan.
Sekarang pengalaman saya dengan konten web dinamis rendah, jadi hal ini adalah sesuatu yang saya mengalami kesulitan dalam menggerakkan kepala.
Saya pikir Java atau Javascript adalah kunci, ini sering muncul.
Scraper hanyalah sebuah mesin pembanding peluang. Beberapa situs memiliki API tetapi saya membutuhkan ini untuk mereka yang tidak. Saya menggunakan perpustakaan kotor dengan Python 2.7
Saya minta maaf jika pertanyaan ini terlalu terbuka. Singkatnya, pertanyaan saya adalah: bagaimana goresan dapat digunakan untuk mengikis data dinamis ini sehingga saya dapat menggunakannya? Sehingga saya dapat mengikis data peluang taruhan ini secara waktu nyata?
sumber
Firefox
ekstensi sepertihttpFox
atauliveHttpHeaders
dan muat halaman yang menggunakan permintaan ajax. Scrapy tidak secara otomatis mengidentifikasi permintaan ajax, Anda harus mencari secara manual URL ajax yang sesuai dan kemudian melakukan permintaan dengan itu.Jawaban:
Browser berbasis webkit (seperti Google Chrome atau Safari) memiliki alat pengembang bawaan. Di Chrome Anda dapat membukanya
Menu->Tools->Developer Tools
. TheNetwork
tab memungkinkan Anda untuk melihat semua informasi tentang setiap permintaan dan respon:Di bagian bawah gambar Anda dapat melihat bahwa saya telah memfilter permintaan ke
XHR
- ini adalah permintaan yang dibuat oleh kode javascript.Tip: log dihapus setiap kali Anda memuat halaman, di bagian bawah gambar, tombol titik hitam akan menyimpan log.
Setelah menganalisis permintaan dan tanggapan, Anda dapat mensimulasikan permintaan ini dari perayap web dan mengekstrak data berharga. Dalam banyak kasus akan lebih mudah untuk mendapatkan data Anda daripada parsing HTML, karena data itu tidak mengandung logika presentasi dan diformat untuk diakses oleh kode javascript.
Firefox memiliki ekstensi yang serupa, disebut firebug . Beberapa orang akan berpendapat bahwa firebug bahkan lebih kuat tetapi saya suka kesederhanaan webkit.
sumber
Berikut adalah contoh sederhana
scrapy
dengan permintaan AJAX. Coba lihat situs rubin-kazan.ru .Semua pesan dimuat dengan permintaan AJAX. Tujuan saya adalah mengambil pesan ini dengan semua atributnya (penulis, tanggal, ...):
Ketika saya menganalisis kode sumber halaman saya tidak dapat melihat semua pesan ini karena halaman web menggunakan teknologi AJAX. Tapi saya bisa dengan Firebug dari Mozilla Firefox (atau alat yang setara di browser lain) untuk menganalisis permintaan HTTP yang menghasilkan pesan di halaman web:
Itu tidak memuat ulang seluruh halaman tetapi hanya bagian-bagian dari halaman yang berisi pesan. Untuk tujuan ini saya klik nomor halaman yang sewenang-wenang di bagian bawah:
Dan saya mengamati permintaan HTTP yang bertanggung jawab untuk isi pesan:
Setelah selesai, saya menganalisis tajuk permintaan (saya harus mengutip bahwa URL ini akan saya ekstrak dari halaman sumber dari bagian var, lihat kode di bawah ini):
Dan isi data formulir permintaan (metode HTTP adalah "Posting"):
Dan konten respon, yang merupakan file JSON:
Yang menyajikan semua informasi yang saya cari.
Mulai sekarang, saya harus menerapkan semua pengetahuan ini dengan kasar. Mari kita tentukan laba-laba untuk tujuan ini:
Dalam
parse
fungsi saya mendapat respons untuk permintaan pertama. DalamRubiGuessItem
Saya memiliki file JSON dengan semua informasi.sumber
re
modul (ekspresi reguler), ia mencari string'url_list_gb_messages="(.*)"'
dan mengisolasi konten tanda kurung dalam variabel nama yang sama. Ini adalah pengantar yang bagus: guru99.com/python- regularSering kali ketika perayapan kami mengalami masalah di mana konten yang dirender pada halaman dihasilkan dengan Javascript dan karenanya tidak dapat menjelajah untuk itu (mis. Permintaan ajax, kegilaan jQuery).
Namun, jika Anda menggunakan Scrapy bersama dengan kerangka pengujian web Selenium maka kami dapat merayapi apa pun yang ditampilkan di browser web normal.
Beberapa hal yang perlu diperhatikan:
Anda harus menginstal Selthon RC versi Python agar bisa berfungsi, dan Anda harus mengatur Selenium dengan benar. Juga ini hanya perayap templat. Anda bisa menjadi lebih gila dan lebih maju dengan hal-hal tetapi saya hanya ingin menunjukkan ide dasar. Sebagai kode berdiri sekarang Anda akan melakukan dua permintaan untuk setiap url yang diberikan. Satu permintaan dibuat oleh Scrapy dan yang lainnya dibuat oleh Selenium. Saya yakin ada beberapa cara untuk mengatasi hal ini sehingga Anda mungkin bisa membuat Selenium melakukan satu-satunya permintaan, tetapi saya tidak repot-repot mengimplementasikannya dan dengan melakukan dua permintaan, Anda bisa menjelajah halaman dengan Scrapy juga.
Ini cukup kuat karena sekarang Anda memiliki seluruh DOM yang disediakan untuk Anda jelajahi dan Anda masih dapat menggunakan semua fitur perayapan yang bagus di Scrapy. Ini akan membuat perayapan lebih lambat tentu saja, tetapi tergantung pada seberapa banyak Anda membutuhkan DOM yang diberikan, mungkin layak untuk ditunggu.
Referensi: http://snipplr.com/view/66998/
sumber
selenium=3.3.1
danpython=2.7.10
, galat ketika mengimpor selenium dari seleniumfrom selenium import webdriver
atauchromedriver
atau apa pun yang Anda kebetulan menggunakan. Docs EDIT: Tambahkan referensi dokumentasi dan ubah tata bahasa saya yang mengerikan!Solusi lain adalah dengan mengimplementasikan download handler atau mengunduh handler middleware. (lihat dokumen kasar untuk informasi lebih lanjut tentang middleware pengunduh) Berikut ini adalah contoh kelas menggunakan selenium dengan webdriver phantomjs tanpa kepala:
1) Tentukan kelas dalam
middlewares.py
skrip.2) Tambahkan
JsDownload()
kelas ke variabelDOWNLOADER_MIDDLEWARE
dalamsettings.py
:3) Mengintegrasikan ke
HTMLResponse
dalamyour_spider.py
. Mendekode badan respons akan memberikan Anda hasil yang diinginkan.Addon Opsional:
Saya ingin kemampuan untuk memberitahu laba-laba berbeda yang middleware gunakan sehingga saya mengimplementasikan pembungkus ini:
agar pembungkus berfungsi, semua laba-laba harus memiliki minimum:
untuk memasukkan middleware:
Keuntungan: Keuntungan
utama untuk menerapkannya dengan cara ini daripada dalam laba-laba adalah bahwa Anda hanya membuat satu permintaan. Dalam solusi AT, misalnya: Handler unduhan memproses permintaan dan kemudian memberikan respons terhadap laba-laba. Laba-laba kemudian membuat permintaan baru di fungsi parse_page - Dua permintaan untuk konten yang sama.
sumber
process_requests
,if spider.name in ['spider1', 'spider2']
bukan dekoratorSaya menggunakan middleware pengunduh khusus, tetapi tidak terlalu senang dengannya, karena saya tidak berhasil membuat cache berfungsi dengannya.
Pendekatan yang lebih baik adalah menerapkan handler unduhan khusus.
Ada contoh kerja di sini . Ini terlihat seperti ini:
Misalkan scraper Anda disebut "scraper". Jika Anda memasukkan kode yang disebutkan di dalam file yang disebut handlers.py di root folder "scraper", maka Anda dapat menambahkan ke settings.py Anda:
Dan voila, JS parsing DOM, dengan cache kotor, coba lagi, dll.
sumber
Saya heran mengapa tidak ada yang memposting solusi menggunakan Scrapy saja.
Lihat pos blog dari tim Scrapy SCRAPING INFINITE PAGRING SCROLLING . Contohnya memo situs web http://spidyquotes.herokuapp.com/scroll yang menggunakan pengguliran tak terbatas.
Idenya adalah untuk menggunakan Alat Pengembang browser Anda dan perhatikan permintaan AJAX, kemudian berdasarkan informasi itu buat permintaan untuk Scrapy .
sumber
ya, Scrapy dapat memo situs web dinamis, situs web yang dirender melalui javaScript.
Ada dua pendekatan untuk menggagalkan situs web semacam ini.
Pertama,
Anda dapat menggunakan
splash
untuk membuat kode Javascript dan kemudian menguraikan HTML yang diberikan. Anda dapat menemukan dokumen dan proyek di sini Scash splash, gitKedua,
Karena semua orang menyatakan, dengan memonitor
network calls
, ya, Anda dapat menemukan panggilan api yang mengambil data dan mengejek panggilan itu di laba-laba Anda yang kasar dapat membantu Anda mendapatkan data yang diinginkan.sumber
Saya menangani permintaan ajax dengan menggunakan Selenium dan driver web Firefox. Ini tidak secepat jika Anda memerlukan crawler sebagai daemon, tetapi jauh lebih baik daripada solusi manual. Saya menulis tutorial singkat di sini untuk referensi
sumber