Saya mencoba mengembangkan pengikis web sederhana. Saya ingin mengekstraksi teks tanpa kode HTML. Sebenarnya, saya mencapai tujuan ini, tetapi saya telah melihat bahwa di beberapa halaman di mana JavaScript dimuat saya tidak mendapatkan hasil yang baik.
Misalnya, jika beberapa kode JavaScript menambahkan beberapa teks, saya tidak dapat melihatnya, karena ketika saya menelepon
response = urllib2.urlopen(request)
Saya mendapatkan teks asli tanpa yang ditambahkan (karena JavaScript dijalankan di klien).
Jadi, saya mencari beberapa ide untuk menyelesaikan masalah ini.
python
web-scraping
python-2.x
urlopen
mocopera
sumber
sumber
Jawaban:
EDIT 30 / Des / 2017: Jawaban ini muncul di hasil pencarian Google teratas, jadi saya memutuskan untuk memperbaruinya. Jawaban lama masih di akhir.
dryscape tidak dipelihara lagi dan perpustakaan dryscape merekomendasikan pengembang adalah Python 2 saja. Saya telah menemukan menggunakan perpustakaan python Selenium dengan Phantom JS sebagai driver web cukup cepat dan mudah untuk menyelesaikan pekerjaan.
Setelah Anda menginstal Phantom JS , pastikan
phantomjs
biner tersedia di jalur saat ini:Contoh
Sebagai contoh, saya membuat halaman contoh dengan kode HTML berikut. ( tautan ):
tanpa javascript dikatakan:
No javascript support
dan dengan javascript:Yay! Supports javascript
Menggores tanpa dukungan JS:
Menggores dengan dukungan JS:
Anda juga dapat menggunakan dryscrape pustaka Python untuk mengikis situs web yang digerakkan oleh javascript.
Menggores dengan dukungan JS:
sumber
@Expenzor
Saya sedang mengerjakan windows. PhantomJS berfungsi dengan baik.Kami tidak mendapatkan hasil yang benar karena konten yang dihasilkan javascript perlu di-render pada DOM. Ketika kami mengambil halaman HTML, kami mengambil yang awal, tidak dimodifikasi oleh javascript, DOM.
Karena itu kita perlu merender konten javascript sebelum kita merayapi halaman.
Karena selenium telah disebutkan berulang kali di utas ini (dan seberapa lambat terkadang juga disebutkan), saya akan mencantumkan dua solusi lain yang mungkin.
Solusi 1: Ini adalah tutorial yang sangat bagus tentang cara menggunakan Scrapy untuk merayapi konten yang dihasilkan javascript dan kami akan mengikuti hal itu.
Apa yang akan kita butuhkan:
Docker dipasang di mesin kami. Ini merupakan nilai tambah dari solusi lain sampai saat ini, karena menggunakan platform OS-independen.
Instal Splash mengikuti instruksi yang tercantum untuk OS kami yang sesuai.
Mengutip dari dokumentasi splash:
Pada dasarnya kita akan menggunakan Splash untuk membuat konten Javascript yang dihasilkan.
Jalankan server percikan:
sudo docker run -p 8050:8050 scrapinghub/splash
.Instal plugin goresan-percikan :
pip install scrapy-splash
Dengan asumsi bahwa kami sudah memiliki proyek Scrapy dibuat (jika tidak, mari kita buat satu ), kami akan mengikuti panduan ini dan memperbarui
settings.py
:Akhirnya, kita dapat menggunakan
SplashRequest
:Solusi 2: Mari kita sebut percobaan ini saat ini (Mei 2018) ...
Solusi ini hanya untuk versi Python 3,6 (saat ini).
Apakah Anda tahu modul permintaan (baik siapa yang tidak)?
Sekarang memiliki web merangkak adik kecil: permintaan-HTML :
Instal permintaan-html:
pipenv install requests-html
Buat permintaan ke url halaman:
Berikan respons untuk mendapatkan bit yang dihasilkan Javascript:
Akhirnya, modul ini tampaknya menawarkan kemampuan mengikis .
Sebagai alternatif, kita dapat mencoba cara terdokumentasi yang baik dalam menggunakan BeautifulSoup dengan
r.html
objek yang baru saja kita buat.sumber
r.html.html
objek.Mungkin selenium bisa melakukannya.
sumber
Jika Anda pernah menggunakan
Requests
modul untuk python sebelumnya, saya baru-baru ini menemukan bahwa pengembang membuat modul baru yang disebutRequests-HTML
sekarang juga memiliki kemampuan untuk membuat JavaScript.Anda juga dapat mengunjungi https://html.python-requests.org/ untuk mempelajari lebih lanjut tentang modul ini, atau jika Anda hanya tertarik tentang rendering JavaScript maka Anda dapat mengunjungi https://html.python-requests.org/?#javascript -dukungan untuk secara langsung belajar bagaimana menggunakan modul untuk membuat JavaScript menggunakan Python.
Pada dasarnya, Setelah Anda menginstal
Requests-HTML
modul dengan benar , contoh berikut, yang ditunjukkan pada tautan di atas , menunjukkan bagaimana Anda dapat menggunakan modul ini untuk mengikis situs web dan membuat JavaScript yang terkandung dalam situs web:Baru-baru ini saya mengetahui hal ini dari video YouTube. Klik disini! untuk menonton video YouTube, yang menunjukkan cara kerja modul.
sumber
Ini tampaknya menjadi solusi yang baik juga, diambil dari posting blog yang bagus
sumber
Kedengarannya seperti data yang benar-benar Anda cari dapat diakses melalui URL sekunder yang disebut oleh beberapa javascript di halaman utama.
Meskipun Anda dapat mencoba menjalankan javascript di server untuk menangani hal ini, pendekatan yang lebih sederhana adalah memuat halaman menggunakan Firefox dan menggunakan alat seperti Charles atau Firebug untuk mengidentifikasi dengan tepat apa itu URL sekunder. Kemudian Anda bisa langsung menanyakan URL itu untuk data yang Anda minati.
sumber
Selenium adalah yang terbaik untuk mengikis konten JS dan Ajax.
Periksa artikel ini untuk mengekstraksi data dari web menggunakan Python
Kemudian unduh driver web Chrome.
Mudah kan?
sumber
Anda juga dapat menjalankan javascript menggunakan webdriver.
atau menyimpan nilai dalam suatu variabel
sumber
driver.title
propertiSaya pribadi lebih suka menggunakan kasar dan selenium dan merendam keduanya dalam wadah terpisah. Dengan cara ini Anda dapat menginstal keduanya dengan kerumitan minimal dan merayapi situs web modern yang hampir semuanya berisi javascript dalam satu bentuk atau lainnya. Ini sebuah contoh:
Gunakan
scrapy startproject
untuk membuat scraper Anda dan tuliskan laba-laba Anda, kerangkanya bisa sesederhana ini:Keajaiban yang sebenarnya terjadi di middlewares.py. Timpa dua metode dalam middleware pengunduh,
__init__
danprocess_request
, dengan cara berikut:Jangan lupa untuk mengaktifkan middlware ini dengan menghapus komentar pada baris berikutnya dalam file settings.py:
Selanjutnya untuk buruh pelabuhan. Buat Anda
Dockerfile
dari gambar yang ringan (Saya menggunakan python Alpine di sini), salin direktori proyek Anda untuk itu, instal persyaratan:Dan akhirnya kumpulkan semuanya dalam
docker-compose.yaml
:Lari
docker-compose up -d
. Jika Anda melakukan ini pertama kali akan butuh waktu cukup lama untuk mengambil selenium / standalone-chrome terbaru dan membuat gambar scraper Anda juga.Setelah selesai, Anda dapat memeriksa apakah wadah Anda berjalan
docker ps
dan juga memeriksa bahwa nama wadah selenium cocok dengan variabel lingkungan yang kami berikan ke wadah scraper kami (di sini, ituSELENIUM_LOCATION=samplecrawler_selenium_1
).Masukkan wadah scraper Anda dengan
docker exec -ti YOUR_CONTAINER_NAME sh
, perintah untuk saya adalahdocker exec -ti samplecrawler_my_scraper_1 sh
, cd ke direktori yang benar dan jalankan scraper Anda denganscrapy crawl my_spider
.Semuanya ada di halaman github saya dan Anda bisa mendapatkannya dari sini
sumber
Perpaduan antara BeautifulSoup dan Selenium sangat baik bagi saya.
PS Anda dapat menemukan lebih banyak kondisi tunggu di sini
sumber
Anda akan ingin menggunakan urllib, permintaan, beautifulSoup, dan driver web selenium di skrip Anda untuk bagian halaman yang berbeda, (untuk beberapa nama).
Terkadang Anda akan mendapatkan apa yang Anda butuhkan hanya dengan salah satu modul ini.
Terkadang Anda membutuhkan dua, tiga, atau semua modul ini.
Terkadang Anda harus mematikan js di browser Anda.
Terkadang Anda membutuhkan info tajuk di skrip Anda.
Tidak ada situs web yang dapat dikikis dengan cara yang sama dan tidak ada situs web yang dapat dikikis dengan cara yang sama selamanya tanpa harus memodifikasi perayap Anda, biasanya setelah beberapa bulan. Tapi mereka semua bisa dikikis! Di mana ada kemauan pasti ada jalan.
Jika Anda membutuhkan data yang tergores secara terus-menerus ke masa depan, cukup gesek semua yang Anda butuhkan dan simpan dalam file dat dengan acar.
Teruslah mencari cara mencoba apa dengan modul ini dan menyalin dan menempel kesalahan Anda ke Google.
sumber
Menggunakan PyQt5
sumber
Saya sudah mencoba menemukan jawaban untuk pertanyaan ini selama dua hari. Banyak jawaban mengarahkan Anda ke masalah yang berbeda. Tetapi jawaban serpentr di atas benar-benar to the point. Ini adalah solusi tersingkat dan paling sederhana. Hanya pengingat kata terakhir "var" mewakili nama variabel , jadi harus digunakan sebagai:
sumber
Saya harus berurusan dengan masalah yang sama pada beberapa proyek pengikisan web saya sendiri. Bagaimana saya mengatasinya adalah dengan menggunakan pustaka permintaan python untuk membuat permintaan http langsung ke API, daripada harus memuat JS.
Pustaka permintaan python berfungsi dengan baik untuk ini, dan Anda dapat melihat permintaan http dengan menggunakan elemen inspeksi dan menavigasi ke tab jaringan.
sumber