Cara menggunakan requests-html vs selenium

The example below "finds" an HTML element (with id="demo"), and changes the element content (innerHTML) to "Hello JavaScript":

Example

document.getElementById("demo").innerHTML = "Hello JavaScript";

Try it Yourself »

JavaScript accepts both double and single quotes:

Example

document.getElementById('demo').innerHTML = 'Hello JavaScript';

Try it Yourself »


JavaScript Can Change HTML Attribute Values

In this example JavaScript changes the value of the src (source) attribute of an

Cara menggunakan requests-html vs selenium
Cara menggunakan requests-html vs selenium
Cara menggunakan requests-html vs selenium

Untuk mengikis komentar ini, kita perlu menemukan mereka pada halaman pertama.

Lihat sumber halaman

Setiap browser sejak waktu fajar (1990-an) telah mendukung kemampuan untuk melihat HTML halaman aktif. Berikut adalah potongan dari view source pengenalan gelandangan yang dimulai dengan sepotong besar JavaScript minified dan uglified yang berkaitan dengan artikel itu sendiri. Berikut adalah sebagian kecil dari itu:

Cara menggunakan requests-html vs selenium
Cara menggunakan requests-html vs selenium
Cara menggunakan requests-html vs selenium

Berikut adalah beberapa HTML yang sebenarnya dari halaman:

Cara menggunakan requests-html vs selenium
Cara menggunakan requests-html vs selenium
Cara menggunakan requests-html vs selenium

Ini terlihat cukup berantakan, tapi apa yang mengejutkan adalah bahwa Anda tidak akan menemukan Disqus komentar dalam sumber halaman.

Frame Inline Perkasa

Ternyata bahwa halaman mashup, dan Disqus komentar tertanam sebagai elemen (inline frame) iframe. Anda dapat mengetahui ini dengan mengklik kanan pada area komentar, dan Anda akan melihat bahwa ada kerangka informasi dan sumber tidak:

Cara menggunakan requests-html vs selenium
Cara menggunakan requests-html vs selenium
Cara menggunakan requests-html vs selenium

Itu masuk akal. Melekatkan konten pihak ketiga sebagai sebuah iframe adalah salah satu alasan utama untuk menggunakan iframes. Mari kita menemukan

>>> r = requests.get('http://www.c2.com/no-such-page')
52tag kemudian dalam sumber halaman utama. Digagalkan lagi! Ada tidak ada
>>> r = requests.get('http://www.c2.com/no-such-page')
52tag di halaman utama sumber.

JavaScript yang dihasilkan Markup

Alasan untuk kelalaian ini adalah bahwa

>>> r = requests.get('http://www.c2.com/no-such-page')
54 menampilkan konten yang diambil dari server. Tapi akhir DOM (dokumen object model) yang akan diberikan oleh browser mungkin sangat berbeda. JavaScript tendangan dan dapat memanipulasi DOM di akan. Iframe tidak dapat ditemukan, karena itu tidak ada di sana ketika halaman yang Diperoleh dari server.

Statis Scraping vs Scraping dinamis

Scraping statis mengabaikan JavaScript. Itu mengambil halaman web dari server tanpa bantuan browser. Anda mendapatkan apa yang Anda lihat di "Lihat sumber halaman", dan kemudian Anda mengiris dan dadu itu. Jika Anda sedang mencari konten tersedia, Anda perlu tidak maju lebih jauh. Namun, jika konten adalah sesuatu seperti Disqus komentar iframe, Anda perlu scraping dinamis.

Scraping dinamis menggunakan browser yang sebenarnya (atau browser tanpa kepala) dan memungkinkan JavaScript melakukan nya hal. Kemudian, itu query DOM untuk mengekstrak konten mencari. Kadang-kadang Anda perlu untuk mengotomatisasi browser dengan mensimulasikan pengguna untuk mendapatkan konten yang Anda butuhkan.

Statis gesekan dengan permintaan dan BeautifulSoup

Mari kita lihat bagaimana statis karya mengerik menggunakan dua mengagumkan Python paket: permintaan untuk mengambil halaman web dan BeautifulSoup untuk parsing halaman HTML.

Menginstal permintaan dan BeautifulSoup

Install pipenv terlebih dahulu, dan kemudian:

>>> r = requests.get('http://www.c2.com/no-such-page')
55

Ini akan menciptakan lingkungan virtual untuk Anda juga. Jika Anda menggunakan kode dari gitlab, Anda dapat

>>> r = requests.get('http://www.c2.com/no-such-page')
56

Mengambil halaman

Mengambil halaman dengan permintaan adalah sebuah satu kapal:

>>> r = requests.get('http://www.c2.com/no-such-page')
57

Objek respon memiliki banyak atribut. Yang paling penting

>>> r = requests.get('http://www.c2.com/no-such-page')
58 dan
>>> r = requests.get('http://www.c2.com/no-such-page')
59. Jika permintaan gagal maka
>>> r = requests.get('http://www.c2.com/no-such-page')
60 akan palsu dan
>>> r = requests.get('http://www.c2.com/no-such-page')
61akan berisi kesalahan. Konten adalah aliran byte. Hal ini biasanya lebih baik untuk memecahkan kode ke utf-8 ketika berhadapan dengan teks:

1
>>> r = requests.get('http://www.c2.com/no-such-page')
2
>>> r.ok
3
False
4
>>> print(r.content.decode('utf-8'))
5
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
>>> r = requests.get('http://www.c2.com/no-such-page')
0
>>> r = requests.get('http://www.c2.com/no-such-page')
1
>>> r = requests.get('http://www.c2.com/no-such-page')
2
>>> r = requests.get('http://www.c2.com/no-such-page')
3
>>> r = requests.get('http://www.c2.com/no-such-page')
4
>>> r = requests.get('http://www.c2.com/no-such-page')
5
>>> r = requests.get('http://www.c2.com/no-such-page')
6
>>> r = requests.get('http://www.c2.com/no-such-page')
7
>>> r = requests.get('http://www.c2.com/no-such-page')
8
>>> r = requests.get('http://www.c2.com/no-such-page')
9
2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7
2
8
2
9

Jika semuanya OK lalu

>>> r = requests.get('http://www.c2.com/no-such-page')
61 akan berisi halaman web yang diminta (sama seperti Lihat sumber halaman).

Menemukan unsur dengan BeautifulSoup

Fungsi

>>> r = requests.get('http://www.c2.com/no-such-page')
63 di bawah ini mengambil halaman web dengan URL, decode ke UTF-8, dan mem-parsing itu ke sebuah objek BeautifulSoup yang menggunakan HTML parser.

1
>>> r.ok
1
2
>>> r.ok
3
3
>>> r.ok
5
4
>>> r.ok
7

Setelah kita memiliki sebuah objek BeautifulSoup, kita dapat mulai mengekstrak informasi dari halaman. BeautifulSoup menyediakan banyak menemukan fungsi menemukan unsur-unsur di dalam halaman dan menelusuri dalam elemen bersarang.

Tuts + Halaman pengarang yang berisi beberapa tutorial. Berikut adalah halaman penulis saya. Pada setiap halaman, ada tutorial sampai 12. Jika Anda memiliki lebih dari 12 tutorial maka Anda dapat menavigasi ke halaman berikutnya. HTML untuk setiap artikel tertutup dalam

>>> r = requests.get('http://www.c2.com/no-such-page')
64tag. Fungsi berikut menemukan semua elemen artikel pada halaman, latihan ke link mereka, dan ekstrak href atribut untuk mendapatkan URL tutorial:</article>

1
>>> r.ok
9
2
3
1
3
3
3
4
3
5

Kode berikut akan semua artikel dari halaman dan cetakan mereka (tanpa awalan umum):

1
3
7
2
3
9
3
False
1
4
False
3
5
False
5
>>> r = requests.get('http://www.c2.com/no-such-page')
0
False
7
>>> r = requests.get('http://www.c2.com/no-such-page')
2
False
9
>>> r = requests.get('http://www.c2.com/no-such-page')
4
>>> r = requests.get('http://www.c2.com/no-such-page')
6
4
2
>>> r = requests.get('http://www.c2.com/no-such-page')
8
4
4
2
0
4
6
2
2
4
8
2
4
>>> print(r.content.decode('utf-8'))
0
2
6
>>> print(r.content.decode('utf-8'))
2
2
8
>>> print(r.content.decode('utf-8'))
4
>>> print(r.content.decode('utf-8'))
5
>>> print(r.content.decode('utf-8'))
6
>>> print(r.content.decode('utf-8'))
7
>>> print(r.content.decode('utf-8'))
8
>>> print(r.content.decode('utf-8'))
9
5
0
5
1
5
2
5
3
5
4

Dinamis Scraping dengan Selenium

Scraping statis adalah cukup baik untuk mendapatkan daftar artikel, tapi seperti yang kita lihat sebelumnya, Disqus komentar tertanam sebagai elemen iframe oleh JavaScript. Untuk panen komentar, kita akan perlu untuk mengotomatisasi browser dan berinteraksi dengan DOM secara interaktif. Salah satu alat terbaik untuk pekerjaan adalah Selenium.

Selenium terutama diarahkan otomatis pengujian aplikasi web, tapi bagus sebagai alat Otomasi peramban untuk keperluan umum.

Menginstal Selenium

Ketik perintah ini untuk menginstal Selenium:

>>> r = requests.get('http://www.c2.com/no-such-page')
65

Memilih Driver Web Anda

Selenium kebutuhan sopir web (browser mengotomatisasi). Untuk web gesekan, itu biasanya tidak masalah driver yang Anda pilih. Saya lebih suka pengandar Chrome. Ikuti petunjuk dalam .

Chrome vs PhantomJS

Dalam beberapa kasus Anda mungkin lebih memilih untuk menggunakan browser tanpa kepala, yang berarti tidak ada UI dipajangkan. Secara teoritis, PhantomJS adalah hanya salah satu web driver. Namun, dalam prakteknya, orang melaporkan masalah mana Selenium bekerja dengan baik dengan Chrome atau Firefox dan kadang-kadang gagal dengan PhantomJS. Saya lebih suka untuk menghilangkan variabel ini dari persamaan dan menggunakan driver web browser yang sebenarnya.

Menghitung Disqus komentar

Mari kita lakukan beberapa gesekan dinamis dan menggunakan Selenium untuk menghitung Disqus komentar pada Tuts + tutorial. Berikut adalah impor diperlukan.

1
5
6
2
5
8
3
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
0
4
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
2
5
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
4

Fungsi

>>> r = requests.get('http://www.c2.com/no-such-page')
66menerima Selenium driver dan URL. Menggunakan yang
>>> r = requests.get('http://www.c2.com/no-such-page')
67metode driver untuk mengambil URL. Hal ini mirip dengan
>>> r = requests.get('http://www.c2.com/no-such-page')
68, tetapi perbedaan adalah objek sopir berhasil representasi hidup DOM.

Kemudian, ia mendapat gelar tutorial dan menempatkan Disqus iframe menggunakan id orang tua yang

>>> r = requests.get('http://www.c2.com/no-such-page')
69 dan kemudian iframe itu sendiri:

1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
6
2
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
8
3
>>> r = requests.get('http://www.c2.com/no-such-page')
00
4
>>> r = requests.get('http://www.c2.com/no-such-page')
02
5
>>> r = requests.get('http://www.c2.com/no-such-page')
04
>>> r = requests.get('http://www.c2.com/no-such-page')
0
>>> r = requests.get('http://www.c2.com/no-such-page')
06
>>> r = requests.get('http://www.c2.com/no-such-page')
2
>>> r = requests.get('http://www.c2.com/no-such-page')
08

Langkah berikutnya adalah untuk mengambil isi dari iframe itu sendiri. Perhatikan bahwa kita menunggu untuk elemen

>>> r = requests.get('http://www.c2.com/no-such-page')
70 yang akan hadir karena komentar yang dimuat secara dinamis dan tidak selalu tersedia belum.

1
>>> r = requests.get('http://www.c2.com/no-such-page')
10
2
>>> r = requests.get('http://www.c2.com/no-such-page')
12
3
>>> r = requests.get('http://www.c2.com/no-such-page')
14
4
>>> r = requests.get('http://www.c2.com/no-such-page')
16
5
>>> r = requests.get('http://www.c2.com/no-such-page')
18
>>> r = requests.get('http://www.c2.com/no-such-page')
0
>>> r = requests.get('http://www.c2.com/no-such-page')
2
>>> r = requests.get('http://www.c2.com/no-such-page')
21
>>> r = requests.get('http://www.c2.com/no-such-page')
4
>>> r = requests.get('http://www.c2.com/no-such-page')
23
>>> r = requests.get('http://www.c2.com/no-such-page')
6
>>> r = requests.get('http://www.c2.com/no-such-page')
25

Bagian terakhir adalah untuk kembali komentar terakhir jika itu tidak dibuat oleh saya. Idenya adalah untuk mendeteksi komentar saya tidak menanggapi belum.

1
>>> r = requests.get('http://www.c2.com/no-such-page')
27
2
>>> r = requests.get('http://www.c2.com/no-such-page')
29
3
>>> r = requests.get('http://www.c2.com/no-such-page')
31
4
>>> r = requests.get('http://www.c2.com/no-such-page')
33
5
>>> r = requests.get('http://www.c2.com/no-such-page')
35
>>> r = requests.get('http://www.c2.com/no-such-page')
0
>>> r = requests.get('http://www.c2.com/no-such-page')
37
>>> r = requests.get('http://www.c2.com/no-such-page')
2
>>> r = requests.get('http://www.c2.com/no-such-page')
39
>>> r = requests.get('http://www.c2.com/no-such-page')
4
>>> r = requests.get('http://www.c2.com/no-such-page')
41
>>> r = requests.get('http://www.c2.com/no-such-page')
6
>>> r = requests.get('http://www.c2.com/no-such-page')
43
>>> r = requests.get('http://www.c2.com/no-such-page')
8
>>> r = requests.get('http://www.c2.com/no-such-page')
45
2
0
>>> r = requests.get('http://www.c2.com/no-such-page')
47
2
2
>>> r = requests.get('http://www.c2.com/no-such-page')
49
2
4
>>> r = requests.get('http://www.c2.com/no-such-page')
51

Kesimpulan

Web scarpping adalah praktek yang berguna ketika informasi yang Anda butuhkan dapat diakses melalui aplikasi web yang tidak memberikan sebuah API yang sesuai. Dibutuhkan beberapa pekerjaan non-sepele untuk mengekstrak data dari aplikasi modern web, tapi alat-alat yang matang dan dirancang dengan baik seperti permintaan, BeautifulSoup, dan Selenium membuatnya berharga.

Selain itu, jangan ragu untuk melihat apa yang kita telah tersedia untuk dijual dan untuk studi di pasar Envato, dan jangan ragu untuk mengajukan pertanyaan dan memberikan umpan balik Anda berharga menggunakan feed di bawah ini.