Mạng xã hội cung cấp nguồn dữ liệu tuyệt vời để thu thập, cho dù là mục đích nghiên cứu hay thương mại. Và Instagram có lẽ là nền tảng sinh lợi nhất hiện nay. Tuy nhiên, nó cũng rất khó để thực hiện scraping, cả do những thách thức về kỹ thuật và pháp lý. Trong hướng dẫn này, chúng ta sẽ tìm hiểu những dữ liệu Instagram nào bạn có thể quét mà không gặp rắc rối và bạn nên chọn công cụ nào để tránh bị cấm địa chỉ IP. Ngoài ra, bạn sẽ được chia sẻ hướng dẫn từng bước để xây dựng công cụ Instagram Scraping cơ bản bằng Selenium. Hãy cùng theo dõi!
Instagram Scraping là gì?
Instagram Scraping là quá trình tự động thu thập dữ liệu có sẵn công khai từ nền tảng truyền thông xã hội này. Tùy thuộc vào kiến thức lập trình của bạn, nó được thực hiện bằng cách sử dụng các công cụ quét được tạo sẵn hoặc các công cụ dọn dẹp web được tạo tùy chỉnh. Chỉ bằng cách thu thập thông tin từ các tag (#) hoặc bài đăng, bạn có thể thực hiện phân tích thị trường, theo dõi thương hiệu trực tuyến hoặc tìm những người có ảnh hưởng cho doanh nghiệp của mình.
Cách thực hiện Instagram Scraping một cách hợp pháp
Web Scraping vẫn là một lĩnh vực hợp pháp. Instagram Scraping cũng không ngoại lệ. Miễn là bạn thực hiện nó một cách cẩn thận có chọn lọc. Tuy nhiên, nếu có một điều bạn không nên làm, thì đó là thu thập dữ liệu sau khi đăng nhập. Cuối cùng, luật áp đặt các tiêu chuẩn khác nhau dựa trên trường hợp sử dụng. Ví dụ: bạn sẽ mất nhiều thời gian hơn nếu thu thập thông tin cho mục đích nghiên cứu hơn là cho mục đích thương mại. Bạn nên tìm hiểu thật kĩ về các quy định và điều khoản nếu bạn không chắc chắn về hoàn cảnh của mình.
Vì dữ liệu nào bạn có thể quét mà không cần đăng nhập? Có ba loại chính của dữ liệu có sẵn công khai:
- Hashtag: URL bài đăng, URL phương tiện, ID, Tác giả bài đăng.
- Hồ sơ: bài đăng mới nhất, URL bên ngoài, lượt thích, hình ảnh, nhận xét, số lượt thích trên mỗi bài đăng và người theo dõi.
- Bài đăng: bài đăng mới nhất, ngày tháng, URL, nhận xét, lượt thích, ID tác giả.
Nhưng hãy nhớ rằng Instagram thường xuyên thay đổi các quy tắc, vì vậy bạn nên kiểm tra những gì bạn có thể thu thập trước khi thực sự làm như vậy.
=>> Screen Scraping là gì – Tối ưu hóa Screen Scraping với Proxy dân cư xoay IP
Chọn công cụ quét Instagram của bạn
Nhìn chung, có ba loại công cụ bạn có thể sử dụng để quét Instagram:
1) Công cụ quét web được tạo tùy chỉnh.
2) API tìm kiếm web.
3) Công cụ quét web tạo sẵn.
Nếu có kiến thức về lập trình, bạn có thể thử xây dựng trình quét web của riêng mình bằng cách sử dụng các khung quét web như Selenium hoặc Playwright. Nó có thể xử lý quá trình tự động hóa phức tạp và vì bạn là người chăm sóc bot scraping của mình nên bạn có thể điều chỉnh nó cho phù hợp với tất cả các thay đổi về cấu trúc mà Instagram thực hiện theo cách của bạn.
Instagram không còn có API chính thức của riêng mình nữa. Tuy nhiên, có rất nhiều nhà cung cấp đáng tin cậy cung cấp API thu thập dữ liệu trên web. Ví dụ: Apify cung cấp các API khác nhau để thu thập các điểm dữ liệu Instagram khác nhau, chẳng hạn như trình quét hồ sơ Instagram và trình quét bài đăng. Hoặc, bạn có thể sử dụng các trình quét web có mục đích chung dựa trên một nhóm proxy lớn như proxy của ZingProxy.
Nếu không có bất kỳ kỹ năng lập trình nào, bạn có thể mua các công cụ sẵn như Parsehub, Octopude. Những công cụ này cho phép bạn trích xuất dữ liệu bằng cách nhấp trực tiếp vào dữ liệu hoặc sử dụng các mẫu.
=>> Bot là gì – Mua Proxy dân cư để chạy Bot
Cách Scraping hồ sơ công khai trên Instagram bằng Selenium
Sử dụng Selenium để khởi chạy phiên bản Headless Chrome. Selenium mô phỏng trình duyệt – nó mở ra và chuyển đến trang web. Quét bằng Selenium sẽ mang lại cho bạn tỉ lệ thành công cao hơn. Nếu muốn bắt đầu tìm kiếm Instagram một cách an toàn, bạn cũng phải cân nhắc việc ẩn địa chỉ IP của mình vì nền tảng này giới hạn lượng thông tin mà một người có thể truy cập mà không cần đăng nhập. Cách tốt nhất để làm như vậy là sử dụng một máy chủ proxy xoay IP. Tùy thuộc vào nhà cung cấp proxy của bạn, nó sẽ cung cấp cho bạn một IP khác sau mỗi một khoảng thời gian nhất định.
Đây là một ví dụ thực tế về sử dụng proxy. Chúng tôi sẽ xóa tên người dùng Instagram bằng tham số __a=1 có thể biến bất kỳ trang nào thành định dạng JSON. Trong hướng dẫn này, tham số sẽ trả về nội dung từ trang tiểu sử.
Bước 1.
Bắt đầu bằng cách cài đặt Selenium, Chromedriver và Selenium-Stealth.
1) Đầu tiên, nhập webdriver từ mô-đun Selenium.
from selenium import webdriver
2) Sau đó, nhập trình điều khiển web bằng mô-đun bộ chọn By từ Selenium để đơn giản hóa việc lựa chọn
from selenium.webdriver.common.by import By
3) In ra kết quả để định dạng đầu ra của bàn điều khiển.
from selenium.webdriver.common.by import By
Khi chúng tôi sẽ sử dụng mô-đun JSON, bạn cũng sẽ cần nhập mô-đun đó.
import json
4) Sau đó, nhập Selenium-Stealth để có một trình duyệt trông giống thật hơn.
from selenium_stealth import stealth
Bước 2.
Thiết lập tên người dùng của các cấu hình Instagram mà bạn muốn xóa.
usernames = ["jlo", "shakira", "beyonce", "katyperry"]
Tạo một biến cho proxy của bạn, nó sẽ giúp bạn đạt được tỷ lệ thành công cao hơn.
proxy = "server:port"
Bạn có thể tạo một biến mới để lưu trữ các kết quả đã loại bỏ.
output = {}
Bước 3.
Sau đó, viết phần đầu của mã, gọi hàm main() và thêm một dòng khác để in ra kết quả bản ghi của bạn sau khi hoàn tất.
if __name__ == '__main__':
main()
pprint(output)
Viết mã để lặp lại tên người dùng mà bạn sẽ quét. Hàm main() sẽ lặp qua danh sách tên người dùng Instagram và gửi nó đến một hàm khác.
def main():
for username in usernames:
scrape(username)
Bước 4.
Tiếp theo, bạn sẽ cần xác định chức năng bằng cách thực hiện theo các bước sau:
1) Tạo một chức năng mới. Nó sẽ cho phép bạn thực hiện các thay đổi đối với cài đặt trình duyệt trước mỗi lần quét, chẳng hạn như thay đổi tác nhân người dùng hoặc xoay proxy.
def prepare_browser():
2) Khởi tạo tùy chọn Chrome.
chrome_options = webdriver.ChromeOptions()
3) Thêm proxy vào tùy chọn trình duyệt.
chrome_options.add_argument(f'--proxy-server={proxy}')
4) Bây giờ, hãy chỉ định các cài đặt cần thiết để Selenium-Stealth hoạt động:
chrome_options.add_argument("start-maximized")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
5) Tạo trình duyệt Chrome với các tùy chọn bạn đã đặt trước đó.
driver = webdriver.Chrome(options= chrome_options)
6) Áp dụng nhiều cài đặt Selenium-Stealth hơn. Để ẩn danh thêm, bạn có thể xoay dấu vân tay kỹ thuật số hoặc tác nhân người dùng của mình.
stealth(driver,
user_agent= 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36',
languages= ["en-US", "en"],
vendor= "Google Inc.",
platform= "Win32",
webgl_vendor= "Intel Inc.",
renderer= "Intel Iris OpenGL Engine",
fix_hairline= False,
run_on_insecure_origins= False,
)
7) Trở lại trình điều khiển Chrome với tất cả các tùy chọn và cài đặt bạn đã thiết lập cho đến nay.
return driver
Bước 5.
Bây giờ hãy chuyển sang phần quét.
1) Tạo một chức năng mới. Hàm scrape() chỉ yêu cầu một đối số duy nhất – tên người dùng mà bạn đã chuyển từ vòng lặp trong hàm main().
def scrape(username):
2) Xây dựng một URL. Việc thêm ?__a=1&__d=dis vào cuối cho phép bạn nhận phản hồi trực tiếp từ chương trình phụ trợ của Instagram mà không cần phân tích cú pháp nội dung HTML.
url = f'https://instagram.com/{username}/?__a=1&__d=dis'
3) Sau đó gọi hàm prepare_browser() và gán trình điều khiển cho một biến.
chrome = prepare_browser()
4) Mở trình duyệt và đưa ra yêu cầu.
chrome.get(url)
5) Để biết liệu yêu cầu có thất bại hay không, bạn cần kiểm tra xem bạn có được chuyển hướng đến thông tin đăng nhập hay không. Bạn có thể làm điều đó bằng cách xem chuỗi đăng nhập – nếu chuỗi đó xuất hiện trong URL thì yêu cầu không thành công. Chức năng thử lại bổ sung có thể được thêm vào đây để thử xóa tên người dùng sau này.
print (f"Attempting: {chrome.current_url}")
if "login" in chrome.current_url:
print ("Failed/ redir to login")
chrome.quit()
6) Nếu không, yêu cầu đã thành công. Điều này có nghĩa là chúng ta có thể trích xuất nội dung văn bản từ phản hồi và phân tích cú pháp dưới dạng JSON. Sau đó, kết quả có thể được chuyển đến hàm parse_data() cùng với tên người dùng Instagram mà bạn đã thu thập.
else:
print ("Success")
resp_body = chrome.find_element(By.TAG_NAME, "body").text
data_json = json.loads(resp_body)
user_data = data_json['graphql']['user']
parse_data(username, user_data)
chrome.quit()
Bước 6.
Hãy chuyển sang phân tích dữ liệu. Tạo hàm parse_data() đã đề cập để lấy dữ liệu bạn muốn từ phản hồi JSON.
def parse_data(username, user_data):
Ví dụ: bạn có thể lấy một số chú thích bài đăng từ các bài đăng công khai.
captions = []
if len(user_data['edge_owner_to_timeline_media']['edges']) > 0:
for node in user_data['edge_owner_to_timeline_media']['edges']:
if len(node['node']['edge_media_to_caption']['edges']) > 0:
if node['node']['edge_media_to_caption']['edges'][0]['node']['text']:
captions.append(
node['node']['edge_media_to_caption']['edges'][0]['node']['text']
)
Ngoài chú thích bài đăng, bạn có thể biết tên đầy đủ của người dùng, danh mục họ thuộc về và số lượng người theo dõi họ có. Tất cả thông tin này cuối cùng có thể được ghi vào từ điển đầu ra.
output[username] = {
'name': user_data['full_name'],
'category': user_data['category_name'],
'followers': user_data['edge_followed_by']['count'],
'posts': captions,
}
Đây là đầu ra của tập lệnh:
from selenium import webdriver
from selenium.webdriver.common.by import By
from pprint import pprint
import json
from selenium_stealth import stealth
usernames = ["jlo", "shakira", "beyonce", "katyperry"]
output = {}
def prepare_browser():
chrome_options = webdriver.ChromeOptions()
proxy = "server:port"
chrome_options.add_argument(f'--proxy-server={proxy}')
chrome_options.add_argument("start-maximized")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options= chrome_options)
stealth(driver,
user_agent= 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36',
languages= ["en-US", "en"],
vendor= "Google Inc.",
platform= "Win32",
webgl_vendor= "Intel Inc.",
renderer= "Intel Iris OpenGL Engine",
fix_hairline= False,
run_on_insecure_origins= False,
)
return driver
def parse_data(username, user_data):
captions = []
if len(user_data['edge_owner_to_timeline_media']['edges']) > 0:
for node in user_data['edge_owner_to_timeline_media']['edges']:
if len(node['node']['edge_media_to_caption']['edges']) > 0:
if node['node']['edge_media_to_caption']['edges'][0]['node']['text']:
captions.append(
node['node']['edge_media_to_caption']['edges'][0]['node']['text']
)
output[username] = {
'name': user_data['full_name'],
'category': user_data['category_name'],
'followers': user_data['edge_followed_by']['count'],
'posts': captions,
}
def scrape(username):
url = f'https://instagram.com/{username}/?__a=1&__d=dis'
chrome = prepare_browser()
chrome.get(url)
print (f"Attempting: {chrome.current_url}")
if "login" in chrome.current_url:
print ("Failed/ redir to login")
chrome.quit()
else:
print ("Success")
resp_body = chrome.find_element(By.TAG_NAME, "body").text
data_json = json.loads(resp_body)
user_data = data_json['graphql']['user']
parse_data(username, user_data)
chrome.quit()
def main():
for username in usernames:
scrape(username)
if __name__ == '__main__':
main()
pprint(output)
Với 6 bước chi tiết ở trên, bạn có thể thực hiện việc thu thập dữ liệu về profile của các tài khoản Instagram bằng Selenium. Có thể thấy việc Instagram Scraping nếu sử dụng đúng công cụ, thu thập đúng loại dữ liệu được cho phép sẽ hoàn toàn không gây ra bất kì vấn đề nào. Hãy chia sẻ về quá trình trải nghiệm scraping của bạn trong phần bình luận của bài viết này. Chúc các bạn thành công!