SemrushEnterpriseby LionTech · Vietnam PartnerĐăng ký demo ↗
SEO tổng quan

Crawling và Scraping để xây dựng cơ sở dữ liệu Influencer: Python

Tìm hiểu cách xây dựng cơ sở dữ liệu về các influencer trong ngành bằng crawler advertools miễn phí, mã nguồn mở và Python.

Bạn vừa có được một khách hàng lớn với hợp đồng dài hạn. Bạn cần hiểu rõ ngành này, cách ngành được tổ chức và những ai là người dẫn đầu, để giúp khách hàng xây dựng các mối quan hệ bền chặt cũng như khẳng định vị thế dẫn dắt tư tưởng trong ngành.

Một cách để tìm những người này là xem các ấn phẩm trong ngành, nơi giới thiệu những người dẫn đầu đóng góp nội dung về chiến lược và các phương pháp hay nhất trong ngành.

Trong hướng dẫn này, chúng ta sẽ dùng crawling và scraping để tạo nền tảng cho cơ sở dữ liệu như vậy – một danh sách influencer mà bạn có thể tận dụng. Tôi sẽ dùng Python; bạn có thể xem phiên bản tương tác của hướng dẫn này nếu muốn làm theo, chỉnh sửa code hoặc dùng làm mẫu sau này.

Để minh họa bằng một ví dụ quen thuộc, ngành được chọn là marketing trực tuyến và quảng cáo, ấn phẩm là blog SEMrush, còn crawler là công cụ mã nguồn mở advertools crawler.

Tại thời điểm viết bài, blog này có 393 tác giả, mỗi người đều có một trang hồ sơ. Bạn có thể tự sao chép rồi dán tất cả hồ sơ và liên kết của họ, nhưng thời gian của bạn quý giá hơn nhiều.

Chuẩn bị (các trang và thành phần dữ liệu cần trích xuất)

Danh sách đầy đủ các blogger, kèm liên kết đến trang hồ sơ của từng người, có thể tìm thấy trên một số trang theo mẫu sau:

https://www.semrush.com/blog/authors/all/?page={n} — trong đó "n" là một số từ một đến mười bốn.

Trước tiên, chúng ta tạo danh sách các trang đó. Crawler sẽ được hướng dẫn bắt đầu từ đây.

Code tạo danh sách URL chứa liên kết đến hồ sơ của các blogger

Từ những trang này, crawler sẽ lần theo các liên kết và trích xuất một số thành phần chúng ta quan tâm từ mỗi trang hồ sơ bằng CSS selector. Nếu bạn chưa quen với CSS (hoặc XPath) selector, về cơ bản, đây là cách chỉ định những phần cụ thể trên trang bằng một ngôn ngữ rõ ràng và chi tiết hơn, chẳng hạn như "list items", đồng thời tương ứng với cách chúng ta suy nghĩ và quan sát các trang.

Có thể bạn không muốn lấy tất cả liên kết trên một trang. Thông thường, bạn sẽ cần những thứ như "all the links in the top part of the page that have social media icons".

Tôi dùng một công cụ trình duyệt tiện lợi có tên là SelectorGadget để giúp tìm tên các selector. Sau khi bật công cụ, mỗi khi bạn nhấp vào một phần trên trang, phần đó cùng tất cả thành phần tương tự sẽ được tô xanh. Nếu muốn chọn cụ thể hơn, bạn có thể nhấp vào các thành phần khác để bỏ chọn chúng.

Trong ví dụ bên dưới, ban đầu tôi nhấp vào biểu tượng LinkedIn, thao tác này cũng chọn một số liên kết khác trên trang. Sau đó, khi nhấp vào biểu tượng Home, tôi bỏ chọn tất cả các phần tử khác (đó là lý do biểu tượng này hiện có màu đỏ — xem hình bên dưới), và hệ thống hiển thị cho tôi selector tương ứng với phần tử cụ thể này.

Ở cuối trang, bạn có thể thấy .b-social-links__item_ico_linkedin, selector này sẽ xác định chính xác các liên kết LinkedIn trên những trang này. Nếu muốn, bạn cũng có thể nhấp vào nút XPath để lấy mẫu tương đương. Đây là cách chúng ta chỉ định cho crawler những phần tử cần lấy. Hãy gặp A.J., nhà vô địch số 1 mọi thời đại của chúng ta!

Sử dụng selector CSS và/hoặc XPath để trích xuất các phần tử trên trang

Tôi đã làm tương tự với các phần tử khác. Tên của chúng được liệt kê bên dưới trong ánh xạ {key: value} này (Python dictionary).

Bạn có thể đặt tên key tùy ý; chúng sẽ trở thành tên cột trong tệp đầu ra của quá trình crawl. Các value là những gì crawler sẽ trích xuất. Lưu ý rằng các selector kết thúc bằng ::text hoặc ::attr(href). Nếu không chỉ định phần này, bạn vẫn trích xuất được các liên kết, nhưng kết quả sẽ là toàn bộ đối tượng liên kết:

<a href="https://example.com>Link Text</a>. Trong mỗi trường hợp, chúng ta chỉ định muốn lấy thuộc tính href hoặc thuộc tính text .

CSS selector: tên được ánh xạ với các mẫu trích xuất

Vậy là chúng ta đã chuẩn bị xong các trang bắt đầu và xác định được những phần tử cần trích xuất. Để crawl, chúng ta dùng lệnh bên dưới:

Lệnh crawl với các tùy chọn khác nhau

Để tôi giải thích:

  • import advertools as adv: kích hoạt package advertools và dùng bí danh adv để gọi package này dưới dạng viết tắt.
  • crawl là tên hàm dùng để crawl và hàm này nhận một số tham số để tùy chỉnh cách hoạt động.
  • url_list=author_pages: Đây là nơi crawler bắt đầu crawl. author_pages là tên chúng ta đặt cho danh sách gồm mười bốn URL chứa liên kết đến hồ sơ của các blogger.
  • output_file: Đây là nơi chúng ta muốn lưu dữ liệu crawl. Tốt nhất bạn nên đặt tên mô tả rõ nội dung, kèm theo ngày tháng. “.jl” là viết tắt của “jsonlines”, một cách lưu trữ dữ liệu linh hoạt, trong đó dữ liệu của mỗi URL được lưu trên một dòng riêng trong tệp. Chúng ta sẽ nhập dữ liệu dưới dạng DataFrame, sau đó có thể lưu thành định dạng CSV để dễ chia sẻ hơn.
  • follow_links=True: Nếu đặt thành False, crawler chỉ crawl các trang được chỉ định; chế độ này còn gọi là “list mode”. Trong trường hợp này, chúng ta muốn crawler đi theo các liên kết. Nghĩa là với mỗi trang được crawl, crawler sẽ đi theo tất cả liên kết trên trang đó. Vì không muốn crawl toàn bộ website, chúng ta dùng thiết lập sau để giới hạn phạm vi crawl.
  • 'DEPTH_LIMIT': 1: Có, hãy tiếp tục theo các liên kết bạn tìm thấy trên những trang ban đầu và crawl các trang tìm được, nhưng chỉ thêm một cấp sau mười bốn trang ban đầu.
  • selectors: Đề cập đến từ điển chúng ta đã tạo để xác định dữ liệu cần trích xuất.

Có nhiều tùy chọn khác nhau để crawling, và bạn có thể xem tài liệu hướng dẫn nếu muốn biết thêm chi tiết. Quá trình này chỉ mất vài phút, sau đó chúng ta có thể mở tệp bằng hàm pandas read_json, đồng thời chỉ định lines=True (vì đây là jsonlines).

Lệnh mở tệp crawl output bằng pandas

Giờ đây, chúng ta đã định nghĩa biến semrush để tham chiếu đến DataFrame crawl. Trước tiên, hãy xem các cột trong đó. Như bạn thấy bên dưới, có tám mươi ba cột. Phần lớn là cố định, nghĩa là chúng luôn xuất hiện trong mọi tệp crawl (như "title", "h1", "meta_desc", v.v.), còn một số cột thì linh hoạt.

Ví dụ: dữ liệu OpenGraph có thể xuất hiện hoặc không xuất hiện trên một trang, vì vậy một số cột chỉ có mặt khi chúng tồn tại trên trang đó. Các cột mang tên mạng xã hội và những tên chúng ta đã chỉ định ở trên chỉ xuất hiện nếu chúng ta chỉ định rõ, như trong ví dụ này.

Danh sách tất cả các cột trong tệp crawl

Vì đây không phải là một SEO audit, chúng ta chỉ quan tâm đến dữ liệu đã trích xuất liên quan đến các tác giả, nên giờ sẽ tạo một tập con dữ liệu. Về cơ bản, thao tác này cho biết chúng ta muốn tập con của semrush (có tên là authors) trong đó các ô thuộc cột alltime_rank không trống, đồng thời các cột là "h1", "url" hoặc bất kỳ key nào chúng ta đã chỉ định để trích xuất.

Mẫu ngẫu nhiên từ bảng authors (các giá trị được rút gọn để vừa màn hình)

Chúng ta gần hoàn tất. Cần làm sạch dữ liệu một chút.

Làm sạch dữ liệu

Có thể bạn đã nhận thấy các ký tự bổ sung trong cột alltime_rank , cũng như việc cột này chứa hai giá trị: một giá trị cho thứ hạng bài viết và một giá trị cho thứ hạng bình luận. Đoạn code sau tách hai giá trị này và xóa các ký tự thừa.

Code xóa các ký tự không cần thiết khỏi "alltime_rank"

Giờ đây, chúng ta có thể tạo hai cột riêng, mỗi cột chứa một thứ hạng, đồng thời chuyển chúng thành số nguyên để có thể sắp xếp theo các cột đó. Trong một số trường hợp blogger không có thứ hạng bình luận, chúng ta gán thứ hạng bằng 0.

Code tạo hai cột mới từ "alltime_rank"

Còn một bước cuối. Các cột job_title và rank_name có khoảng trắng thừa ở đầu và cuối, nên chúng ta xóa chúng. Chúng ta cũng xóa dấu phân cách xuất hiện trong các cột summary, đó là hai ký tự @ "@@".

Điều này là do nhiều bản tóm tắt có chứa liên kết và chúng được trích xuất thành ba hoặc bốn phần tử, nên chúng tôi loại bỏ dấu phân cách. Cuối cùng, chúng tôi đổi tên "h1" thành "name" và "url" thành "semrush_profile", sắp xếp theo "alltime_rank_posts" và xóa cột "alltime_rank".

Vậy là xong!

Mã để thực hiện các chỉnh sửa cuối cùng và mười blogger hàng đầu (các giá trị đã được rút gọn để vừa màn hình)

Hãy nhanh chóng kiểm tra xem kết quả có vẻ chính xác không. Hãy xem chúng ta có bao nhiêu hàng và cột trong các tác giả:

Lấy kích thước (số hàng và cột) của DataFrame

388 hàng và 13 cột. Không phải là 393 sao?

Đúng vậy. Có vẻ như có năm blogger sở hữu các trang hồ sơ đặc biệt, có cùng dữ liệu nhưng được trình bày theo thiết kế khác (các CSS selector khác nhau). Đây là những "Columnists" của blog. Tôi đã trích xuất dữ liệu của họ theo cách thủ công và thêm vào bảng. Bạn có thể xem bảng cuối cùng trong tệp semrush_blog_authors.csv.

Có lần, một người rất lạc quan tìm thấy một chiếc móng ngựa trên sàn và lập tức nghĩ: "Oh, now I only need three more horseshoes and a horse!"

Danh sách này chỉ là một chiếc móng ngựa.

Con ngựa chính là quá trình thực sự trò chuyện với những người đó, xây dựng các mối quan hệ chân thành và tìm ra cách đóng góp có ý nghĩa cho mạng lưới.

Giờ đây, khi đã có danh sách tất cả tài khoản Twitter, bạn có thể tạo một danh sách để theo dõi những người mà bạn thấy thú vị. Có thể bạn chỉ quan tâm đến một nhóm nhỏ, vì vậy bạn có thể lọc hồ sơ theo chức danh hoặc phần tóm tắt có chứa "content", "SEO", "paid" hoặc bất kỳ nội dung nào bạn quan tâm.

Blog được xuất bản bằng nhiều ngôn ngữ, vì vậy bạn có thể làm tương tự với một ngôn ngữ khác. Với tất cả hồ sơ LinkedIn, bạn có thể cân nhắc tạo hoặc tham gia một nhóm chuyên môn rồi mời mọi người tham gia.

Chúc bạn may mắn!

Nguồn tham khảo

https://www.semrush.com/blog/python-scraping-influencer-database/ ↗

Đưa góc nhìn thành kế hoạch.

Chia sẻ website và mục tiêu để LionTech tư vấn giải pháp phù hợp.

Đăng ký tư vấn ↗
THÊM MỘT GÓC NHÌN CHO THƯƠNG HIỆU

Để lại website và email để LionTech tiếp nhận yêu cầu báo cáo hiện diện AIO.

Bằng việc gửi, bạn đồng ý để LionTech liên hệ qua email về yêu cầu báo cáo.