Hê lô các bạn lâu lắm rồi mới mò vào web . Bỏ bê một thời gian dài vì bận và lười . Đáng ngại hơn nữa là dạo này độ ì của mình tăng cao quá. Mới 3 xich tuổi mà ì thế này thì chết 😀 .Nay được hôm rảnh nên lại lôi python ra nghịch. Cái ngôn ngữ dễ gây nghiện này nghịch được khá nhiều trò hay với nó hehe. Hôm nay mình thử dùng nó để crawl data từ một trang web xem sao.
Mục tiêu mình chọn sẽ là trang waka.vn .Trang này mình cũng hay vào để đọc sách giờ mình thử crawl nó xem sao.
1. Cần chuẩn bị những gì ?
- python đương nhiên rồi và tốt nhất nên dùng python3 đổ lên cho ổn định
- Selenium ( Đương nhiên không phải là một chất hoá học mà là một thư viện giúp ta tự động các hành động trên web như click , scroll vv…)
- chromedriver ( bạn có thể dùng firefox nhưng mình thích dùng chrome hơn, cái này là một tệp thực thi riêng biệt mà selenium dùng để điều khiển chrome)
- Và ta cần 7k trong điện thoại để đăng ký vip 1 tuần đọc sách của waka.
- Xpath generator ( cái này là 1 extension của chrome khá hay để lấy được xpath của web chính xác nhất , các bạn có thể cài tại đây )
2.Phân tích trang mục tiêu
Việc phân tích này nhằm xác định những hành động nào mà ta thực hiện khi vào trang waka từ đó thực hiện y hệt lại trên selenium.Vì trang này một số sách yêu cầu phải gói vip mới cho xem nên mình sẽ dùng 7k kia để đăng ký 1 tuần vip. Để khi thực hiện crawl không gặp bug. Ok thử xem ta phải làm gì khi vào trang waka này nào.
Thường khi vừa vào trang hay có popup quảng cáo hiện lên làm che hết các phần tử trên trang chủ . Vì vậy mình phải thêm một thao tác là cho chuột click ra ngoài vùng quảng cáo để tắt popup.
[code lang=”python”]
driver.find_element_by_xpath(‘//*[@id="popup"]/div/a/div/button’).click()
[/code]
Thi thoảng web không có popup gì nên chạy đến đoạn này hay xảy ra lỗi không tìm thấy phần tử để click. Vì vậy các bạn nhớ đặt try catch đoạn này để tránh bị out khi đang run nhé.Tiếp theo mình cần click vào nút login để dẫn đến trang đăng nhập của waka.
[code lang=”python”]
driver.find_element_by_xpath(‘//*[@id="vlogin"]’).click()
sleep(1)
[/code]
Tiếp theo nhập user và pass vào thôi . Đương nhiên không phải bằng tay rồi =)).Để nhập thông tin vào ô input ta sử dựng send_keys. Câu lệnh implicitly_wait này sẽ bảo Selenium đợi trong một khoản thời gian nhất định trước khi quăng ra lỗi “NoSuchElementExceptions” rằng không thể tìm thấy phần tử trên page.
[code lang=”python”]
driver.implicitly_wait(30)
driver.find_element_by_xpath(‘//*[@id="ctl00_MainContent_txtUserName"]’).send_keys(‘username’)
sleep(1)
driver.find_element_by_xpath(‘//*[@id="ctl00_MainContent_txtPass"]’).send_keys(‘password’)
sleep(1)
driver.find_element_by_xpath(‘//*[@id="ctl00_MainContent_btnDangNhap"]’).click()
sleep(1)
[/code]
Vậy là qua bước đăng nhập.Bây giờ chỉ việc lấy list sách thôi. Ở đây mình lấy list sách theo danh mục nên mình lấy luôn link danh mục để crawl.
[code lang=”python”]
# dùng .get để load link dẫn đến danh mục sách
driver.get("https://waka.vn/the-loai/ky-nang-g9lxW.html")
# ở đây mình cho lấy 100 page
for i in range(0,100):
els = driver.find_elements_by_xpath(‘//a[@class="t-card-book-infor-title"]/h3[1]’)
for elem in els:
href_el = elem.find_element_by_xpath(‘..’)
href = href_el.get_attribute(‘href’)
name = elem.text
link_sach = name+’—-‘+href
# kiểm tra xem có lấy được link không nếu lấy được thì ghi vào file link-sach.txt các bạn có thể tìm hiểu kết nói với mysql để lưu vào cũng được
if href is not None:
print(href)
f= open("link-sach.txt","a+")
f.write(link_sach + ‘\n’)
# chuẩn bị chuyển sang page tiếp theo
url = "https://waka.vn/the-loai/ky-nang-g9lxW.html?page=" + str(i + 1)
driver.get(url)
driver.implicitly_wait(30)
[/code]
Sau khi có được list link sách ở file link-sach.txt . Tiếp theo mình tiến hành đọc nó ra và lần lượt lấy từng sách.
[code lang=”python”]
# Tiến hành đăng nhập như bình thường
driver = webdriver.Chrome(‘./chromedriver’,options=chrome_options)
driver.get("https://waka.vn")
driver.find_element_by_xpath(‘//a[@class="login-btn"]’).click()
driver.implicitly_wait(30)
driver.find_element_by_xpath(‘//*[@id="ctl00_MainContent_txtUserName"]’).send_keys(‘username’)
driver.find_element_by_xpath(‘//*[@id="ctl00_MainContent_txtPass"]’).send_keys(‘password’)
driver.find_element_by_xpath(‘//*[@id="ctl00_MainContent_btnDangNhap"]’).click()
sleep(1)
# đọc list sách từ file list-sach.txt
sach = open("link-sach.txt", "r")
for x in sach:
list_x = x.split("—-")
url = list_x[1]
name = list_x[0]
# load chi tiết sách và cho auto click vào nút đọc sách
driver.get(url)
driver.find_element_by_xpath(‘//a[@class="book-info-link"]’).click()
driver.implicitly_wait(30)
# tạo một file txt để lưu sách
name_file = slugify(name) + ‘.txt’
# Ở đây mình cho lặp 60 trang nhưng có thể sẽ nhiều hơn.
# Đoạn này bạn có thể check lặp đến khi không tìm thấy phần tử nextPage nữa thì thôi.
for x in range(0,60):
# Mỗi lần lặp mình cho click vào nút next 1 lần
driver.find_element_by_xpath(‘//*[@id="nextPage"]’).click()
# Đến đoạn này mình bị mắc một bug là không lấy được content bên trong mặc dù thấy sờ sờ ra đấy.
# Sau mới biết phải switch frame mới lấy được
driver.switch_to.frame(driver.find_element_by_xpath(‘//iframe[@id="__r__"]’))
driver.implicitly_wait(30)
sleep(3)
el = driver.find_element_by_xpath(‘/html/body’)
# print(el.text)
f= open(name_file,"a+")
f.write(el.text)
# Lấy xong nhớ switch lại frame default không là không click vào được nút next cho page tiếp theo đâu.
driver.switch_to_default_content()
driver.implicitly_wait(30)
[/code]
He ! chỉ có vậy thôi . Đừng quên import đủ các package vào nhé.
[code lang=”python”]
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from slugify import slugify
[/code]
Và tạo chrome option như sau.Hoặc bạn có thể config thêm nếu muốn.
[code lang=”python”]
chrome_options = Options()
chrome_options.add_argument("–start-maximized")
chrome_options.add_argument("–disable-infobars")
chrome_options.add_argument("–disable-notifications")
[/code]
Chỉ có thế thôi sau khi crawl về thì làm gì là việc của các bạn hehe. Có thể kết hợp với việc đăng lên blogspot để làm một web sách riêng của các bạn chẳng hạn.
Cảm ơn các bạn đã đọc bài viết của mình.Hôm sau mình sẽ viết một bài nữa crawl sản phẩm trên lazada rồi đăng lên site wordpress có sử dụng woocommerce. Chào :D..