setelah sekian lama dan hampir lupa kalo punya web kecil untuk catatan. untuk kesempatan kali ini saya mau share lagi cara Scraping biar makin jago srap nya dan di jamin pasti bisa !!!!!. untuk yang masih belum bisa dan gagal ngambil data dari element. saya kasih sedikit perbedaan. yang kalian harus tau adalah site Dynamic dan site Static. google ya buat perbedaan nya, kalo secara simple nya, Web yang ga pake Javascript buat manipulasi element ya bisa di sebut site Static dan sebalik nya.
Sesuai dengan judul, kita Scraping masih dengan Python dan modul Beautifulsoup4. lansung aja, kali ini saya akan kasih contoh Scraping site Static. oia, kali ini target saya https://stackoverflow.com/ . kamu siapin dulu data apa aja yang akan kalian scrap dan link halaman nya. saya akan ambil data
- https://stackoverflow.com/questions/tagged/python (Python == argv)
- Index / Container Element (array)
- Judul pertanyaan (string)
- Nama TS (string)
- Photo TS (string)
- Tags Pertanyaan (array)
argv itu maksud nya bisa di ganti dan di jadikan query selain python dengan hasil halaman yang sama tanpa harus mencari dan merubah element baru. dan Container itu element untuk memfilter element yang kita butuhkan.
setelah itu sekarang kita cari nama / class element itu di link yang kita targetkan. saya kasih gambar agar mudah di pahamin.
- Warna Orange itu Container Parent Element Class (".mln24")
- Warna Kuning itu Title dan Url saya pilih tag (“h3”)
- Warna Ungu itu Class Tags (".post-tag")
- Warna Hijau class (".gravatar-wrapper-32") dan (".user-details")
Oke, gimana kalo nama class nya ganti nama setiap reload ??? easyy boyss, tinggal pilih element tag nya aja dan main index setiap element nya. tapi saya belum pernah nemuin yang class name ganti ganti, hahaha. langsung aja ya code nya di copy di text editor favorite kalian. buat yang belum install Python dan Beauitulshop bisa cek di halaman ini
1#!/usr/bin/python
2import requests, json
3from bs4 import BeautifulSoup
4
5stackoverflow = "https://stackoverflow.com/questions/tagged/python" #target
6res = requests.get(stackoverflow) # otw target
7soup = BeautifulSoup(res.content, "html.parser") # ambil respon
8
9index = soup.select(".mln24")
10# karena index hasil respone nya array maka kita butuh loop
11data = []
12for el in index:
13 tags = []
14 judul = el.select_one("h3").text
15 url = el.select_one("h3").select_one("a").get("href")
16 img = el.select_one(".gravatar-wrapper-32").select_one("img").get("src")
17 nama = el.select_one(".user-details").select_one("a").text
18
19 for tag in el.select(".post-tag"):
20 tags.append(tag.text)
21 #agar rapih result nya kita bikin JSON
22 tmp = {
23 "judul" : judul,
24 "link" : url
25 "nama" : nama,
26 "img" : img,
27 "tags" : tags,
28 }
29 #tambahkan result ke array
30 data.append(tmp)
31# convert array to json
32json_cool = json.dumps(data)
33print(json_cool)
Penjelasan
Nahloh, sekarang kenapa ada select
kepana ga find
dan find_all
, UPDATE GAN !!! biar makin simple macam kek jekueri, itu feature terbaru dari Bs4 4.7.1
ya walapun sama aja, cuma lebih easy kalo menurut saya. INGET
select
itu hasil Object nya array, harus di loop atau bisa di via indexselect_one
sama seperti nama nya, hasil 1 Object jadi bisa langsung di ambil Text atau element Tag value nya
nah langsung coba kalian jalanin, kalo error berarti sudah update nama class nya. hahha namun saat saya nulis ini, work 100%