Selenium là công cụ khá quen thuộc được sử dụng trong việc test các sản phẩm web hoặc có thể làm công cụ để tự động hóa các thao tác trên website. Selenium hỗ trợ rất nhiều ngôn ngữ lập trình (như Java, C#, Python, Ruby, PHP, Perl, Javascript) cũng như hỗ trợ rất nhiều trình duyệt web (như Firefox, Opera, Chrome, Microsoft Edge, Safari …)
Trong bài viết này, chúng ta sẽ sử dụng Python Selenium để lấy các dữ liệu tweet từ trang web Twitter. Quy trình hoạt động của nó sẽ như sau:
– Mở trình duyệt web (ở đây tôi sử dụng Firefox) để vào trang Twitter search advanced
– Điền vào các tiêu chí để tìm kiếm tweet như: từ ngày, đến ngày, hashtag, …. (Bạn có thể tham khảo form tìm kiếm của Twitter tại đây => https://twitter.com/search-advanced)
– Submit form tìm kiếm, sau đó scroll màn hình web cho đến khi không còn tweet nào được load tiếp nữa.
– Bóc tách HTML từ trang web Twitter và lưu danh sách các tweets vào file .txt hoặc .html
Đoạn code dưới đây sẽ thực hiện các bước trên, do trong code đã comment khá kỹ nên tôi sẽ không giải thích thêm nữa. 😀 . Một số library Python quan trọng được sử dụng trong code là:
– Lxml để bóc tách HTML
– Selenium để điều khiển web browser từ Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | import unittest import time import re from lxml import etree from lxml.html import document_fromstring, fragment_fromstring, tostring from selenium import webdriver from selenium.webdriver.common.keys import Keys class TwitterSearch(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_search_in_python_org(self): driver = self.driver #driver.get("https://twitter.com/hashtag/covfefe?f=tweets&vertical=default") # Go to Twitter search advanced page driver.get("https://twitter.com/search-advanced") # Enter from day input = driver.find_element_by_name("since") input.send_keys('2017-05-25') # Enter to day input = driver.find_element_by_name("until") input.send_keys('2017-05-31') # Enter hash tag and press enter for submit form input = driver.find_element_by_name("tag") input.send_keys('trump') input.send_keys(Keys.ENTER) last_height = driver.execute_script("return document.body.scrollHeight") # Scroll down web browser while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(5) new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height stream = driver.find_element_by_css_selector('div.stream') stream_html = stream.get_attribute('innerHTML') doc = document_fromstring(stream_html) tweets_text = "" for li_js_stream_item in doc.find_class("js-stream-item"): for div_stream_item_header in li_js_stream_item.find_class("stream-item-header"): for strong_fullname in div_stream_item_header.find_class("fullname"): strong_fullname_html = etree.tostring(strong_fullname, pretty_print=False, method="html") strong_fullname_html = strong_fullname_html.decode('utf-8') fullname = re.sub(r'<[^>]*?>', '', strong_fullname_html) fullname = fullname.strip() tweets_text += fullname + "\n" print(fullname) #print("\n") for div_js_tweet_text_container in li_js_stream_item.find_class("js-tweet-text-container"): div_js_tweet_text_container_html = etree.tostring(div_js_tweet_text_container, pretty_print=False, method="html") div_js_tweet_text_container_html = div_js_tweet_text_container_html.decode('utf-8') tweet = re.sub(r'<[^>]*?>', '', div_js_tweet_text_container_html) tweet = tweet.strip() tweets_text += tweet + "\n" print(tweet) tweets_text += "====================\n" print("========================") f = open('tweets_text.html', 'wb') f.write(tweets_text.encode('utf-8')) f.close() #print(stream_html) #driver.implicitly_wait(10) #body.send_keys(Keys.PAGE_DOWN) #def tearDown(self): #self.driver.close() if __name__ == "__main__": unittest.main() |