Hướng dẫn code crawl đơn giản trên python năm 2024

Trước tiên, chúng ta cần cài đặt Python trên máy tính. Hoặc bạn có thể sử dụng Jupyter Notebook thì càng tiện. Trong bài này mình không nhắc lại cách cài đặt hai cái trên nữa.

Bài này thực hành cách crawl dữ liệu phim từ IMDB

1. Chuẩn bị thư viện

Chúng ta sẽ sử dụng thư viện request để lấy toàn bộ dữ liệu 1 trang web về, sau đó sử dụng Beautifulsoup để định dạng, chuẩn hóa và trích xuất các nội dung mình cần. Cuối cùng là sử dụng pandas để trình bày dữ liệu và lưu ra tập tin csv phục vụ cho khoa học dữ liệu.

Ta cài đặt thư viện để sử dụng cho bài này bằng lệnh sau:

pip install pandas requests bs4

2. Import thư viện

Sau khi cài đặt ta import thư viện để sử dụng

import bs4 import pandas import requests

3. scrape dữ liệu của IMDb

Ta sử dụng hàm request.get để lấy dữ liệu từ trang IMDb về. Thư viện request sẽ tạo một yêu cầu GET cho máy chủ web để tải xuống nội dung HTML của một trang web nhất định cho chúng ta.

url = '<https://www.imdb.com/search/title/?count=100&groups=top%5F1000&sort=user%5Frating%27>' # các bạn thay link của trang mình cần lấy dữ liệu tại đâydef get_page_content(url): page = requests.get(url,headers={"Accept-Language":"en-US"}) return bs4.BeautifulSoup(page.text,"html.parser")soup = get_page_content(url)

Sau khi hoàn tất, chúng ta sẽ có một đối tượng Response. Đối tượng này có thuộc tính status_code để anh em kiểm tra xem việc download dữ liệu thành công hay không.

Khi mã status_code trả về kết quả 200 thì anh em có thể in ra nội dung HTML bằng cách sử dụng thuộc tính content

4. Trích xuất từng dữ liệu thô

Ta sẽ trích xuất từng dữ liệu thô của trang như: tên phim, năm phát hành, điểm đánh giá, số lượt bình chọn…

Việc chúng ta muốn lấy trường nào trong số dữ liệu crawl về được thì các anh em chỉ cần chuột phải vào trang web → chọn Inspect element. Sau đó tìm đến thuộc tính tương ứng.

Ở đây chúng ta lựa chọn class làm giá trị tìm kiếm và lưu chúng vào các biến tương ứng.

— Update 29/10/2020 from Son Nguyen

Phần crawl data runtime, certificate và genre có thể ko tồn tại nên sẽ dẫn tới lỗi ko tạo đc pandas DataFrame. Mình góp code chỉnh lại như sau để đảm bảo data crawl cho từng trường ko bị lộn:

certificate = []runtime = []genre = []for movie in soup.findAll('p',class_='text-muted'):if ((not movie.findAll('span',class_='certificate')) &(not movie.findAll('span',class_='runtime')) &(not movie.findAll('span',class_='genre'))):continuecertificate.append('' if not [ce.text for ce in movie.findAll('span',class_='certificate')] else[ce.text for ce in movie.findAll('span',class_='certificate')][0])runtime.append('' if not [rt.text for rt in movie.findAll('span',class_='runtime')] else[rt.text for rt in movie.findAll('span',class_='runtime')][0])genre.append('' if not [gr.text for gr in movie.findAll('span',class_="genre")] else[rt.text for rt in movie.findAll('span',class_='genre')][0])

— Updated: Đoạn code dưới đây có thể không hoạt động trong nhiều tình huống, vậy hãy sử dụng đoạn code bên trên. Thanks

movies = soup.findAll('h3', class_='lister-item-header')titles = [movie.find('a').text for movie in movies]release = [rs.find('span',class_="lister-item-year text-muted unbold").text for rs in movies]rate = movie.find('div', 'inline-block ratings-imdb-rating')['data-value']certificate = [ce.text for ce in soup.findAll('span',class_='certificate')]runtime = [rt.text for rt in soup.findAll('span',class_='runtime')]genre = [gr.text for gr in soup.findAll('span',class_="genre")]rates = [rate['data-value'] for rate in soup.findAll('div',class_='inline-block ratings-imdb-rating')]

5. Trình bày dữ liệu với Pandas

Chúng ta sử dụng pandas để trình diễn dữ liệu nhìn cho trực quan. Đơn giản chỉ cần pandas.DataFrame() là đủ

pandas.DataFrame({'titles':titles,

              'release':release,   
              'certificate':certificate,  
              'runtime':runtime,  
              'genre': genre,  
              'rates': rates})
Hy vọng những dòng viết trên đây sẽ giúp được một số bạn trong việc tiếp cận Python và thu thập dữ liệu đơn giản.

Hướng dẫn cách lấy dữ liệu từ web bằng python dễ hiểu, sử dụng module request và tạo hàm để tái sử dụng khi cần

Hiện nay hầu hết các doanh nghiệp, tổ chức kinh doanh đều có nhiều hoạt động mạnh mẽ trên các nền tảng website và điều đó dẫn tới việc một khối lượng rất lớn dữ liệu được liên tục tạo ra trên nền tảng website. Để phục vụ việc học tập nghiên cứu cũng như phân tích dữ liệu cho quá trình đưa ra các quyết định kinh doanh, bạn có thể lấy dữ liệu từ web bằng python theo các bước dưới đây:

Bước 1: Cài đặt module (hướng dẫn cho cmd Window)

Để lấy dữ liệu từ web bằng python, đầu tiên bạn cần cài đặt Requests:

pip install requests (hoặc python –m pip install requests)​

Cài đặt Pilow:

pip install Pillow (hoặc python –m pip install Pillow)​

*Lưu ý: Nếu bạn đang dùng PIP cũ thì hãy update lên pip mới trước khi cài Pillow với cú pháp như sau nhé: Update PIP:

pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)

Bước 2: Crawl dữ liệu từ danh sách tin tức mới nhất

Lấy dữ liệu

Hiểu một cách đơn giản thì Module Request dùng để gửi HTTP request, điều này cũng giống như thao tác bạn thường làm khi tìm kiếm thứ gì đó trên mạng: Vào trình duyệt, gõ vào thanh tìm kiếm “mcivietnam” và enter, bạn sẽ nhận được giao diện của trang web MCI hoặc một dạng dữ liệu khác trả về. Để lấy được dữ liệu trả về chúng ta phải sử dụng một module để hỗ trợ và Request sẽ giúp bạn thực hiện việc đó.

requests.method(url, params, data, json, headers, cookies, files, auth, timeout, allowredirects, proxies, verify, stream, cert)

Đoạn code này có vẻ khá phức tạp đúng không? Thực ra thì chúng ta không cần nhiều tham số đến vậy, bạn có thể sửa lại theo cách này để đoạn mã nhìn “đẹp” hơn:

import requests response = requests.get("https://tuoitre.vn/tin-moi-nhat.htm") print(response)

Những, bạn sẽ nhận được kết quả trả về như thế này:

<Response [200]>

Đây không phải là dữ liệu mà chúng ta cần, vì vậy, phải thêm một vài thuộc tính nữa để lấy dữ liệu từ web như mong muốn của chúng ta:

print(response.content)

Đây là kết quả trả về:

<!DOCTYPE html>\r\n    <html id="mainHtml" lang="vi" xmlns="http://www.w3.org/1999/xhtml">\r\n  _<head prefix="og:&

32;http://ogp.me/ns#&

32;fb:&

32;http://ogp.me/ns/fb#&

32;website:&

32;http://ogp.me/ns/website#">_

<link rel="dns-prefetch" href="https://cdn.tuoitre.vn" /><link rel="dns-prefetch" href="https://cdn1.tuoitre.vn" /> <link rel="dns-prefetch" href="https://statictuoitre.mediacdn.vn" /> <title>Tin m\xe1\xbb\x9bi nh\xe1\xba\xa5t - Tu\xe1\xbb\x95i tr\xe1\xba\xbb Online</title><meta name="keywords" content="Tin m\xe1\xbb\x9bi nh\xe1\xba\xa5t - Tu\xe1\xbb\x95i tr\xe1\xba\xbb Online" /><meta name="newskeywords" content="Tin m\xe1\xbb\x9bi nh\xe1\xba\xa5t - Tu\xe1\xbb\x95i tr\xe1\xba\xbb Online" /><meta name="description" content="" /><meta id="metaRobots" name="robots" content="index,follow,all" /><meta name="viewport" _content="width=device-width,&

32;initial-scale=1.0,&

32;maximum-scale=1.0,&

32;user-scalable=1" />_

<meta name="author" content="TUOI TRE ONLINE" /><meta name="copyright" content="Copyright \xc2\xa9 2020 by TUOITRE.VN" /> <meta name="RATING" content="GENERAL" /> …(còn nữa>…

Tách dữ liệu crawl được từ web

Sau khi đã lấy được dữ liệu, việc tiếp theo cần làm là phải tách các dữ liệu ra thành dạng cây để thuận tiện hơn cho quá trình truy xuất dữ liệu. Các phổ biến là dùng module BeautifulSoup4. Cú pháp cài đặt module:

pip install beautifulsoup4 (hoặc python –m pip install beautifulsoup4

Sau đó, BeautifulSoup4 sẽ giúp bạn phân tích dữ liệu HTML, XML thành dạng cây với cú pháp như sau:

import requests from bs4 import BeautifulSoup

pip install Pillow (hoặc python –m pip install Pillow)​

0

Phân tích dữ liệu

Sau khi đã hoàn thành, bước tiếp theo bạn cần làm là phân tích xem dữ liệu đang cần có thể lấy được ở đâu. Ví dụ bạn cần lấy chi tiết về một bài viết cụ thể, bạn cần biết liên kết để truy cập đến bài viết đó. Bạn có thể tìm kiếm thông tin đó bằng cách ấn F12 và tìm xem link bài báo ở đâu. Ví dụ chúng ta tìm thấy link bài báo ở trong thẻ <a></a>, nằm trong thẻ h3 và có class là “title-news”. Vậy chúng ra cần phải lọc tất cả thẻ h3 có class “title-news” và lấy thẻ a trong đó, đoạn mã cần thiết được xây dựng là:

pip install Pillow (hoặc python –m pip install Pillow)​

1

Kết quả sẽ trả về cho chúng ta một mảng các thẻ h3 là tiêu đề của các bài báo. Tiếp theo chúng ta cần lấy link của các bài viết đó:

pip install Pillow (hoặc python –m pip install Pillow)​

2

Kết quả trả về:

pip install Pillow (hoặc python –m pip install Pillow)​

3

Lấy dữ liệu chi tiết của từng bài

Ở bước trước, chúng ta đã có được danh sách các thẻ h3 là tiêu đề của các bài báo, giờ chúng ta cần truy cập vào từng bài viết, lấy 1 ảnh đại diện và 1 đoạn trích trong bài viết đó, đoạn code được thực hiện như sau:

pip install Pillow (hoặc python –m pip install Pillow)​

4

Bingo, vậy là bạn đã hoàn thành xong phần crawl dữ liệu từ web bằng python rồi. Chúng tôi sẽ giải thích thêm một chút về các đoạn code: Đầu tiên chúng ta sử dụng một vòng for-loop để duyệt qua tất cả các link và sau đó truy cập vào các link đó, lưu ý do href của thẻ a không có link gốc (dạng “/router-ne”) nên chúng ta cần chèn thêm BASE URL vào:

pip install Pillow (hoặc python –m pip install Pillow)​

5

Ở bước lấy tiêu đề, đoạn tóm tắt và ảnh đại diện. Bạn bật f12 lên tìm hiểu. Còn phần content mình cần tìm 2 thẻ p con chỉ dưới

pip install Pillow (hoặc python –m pip install Pillow)​

6

một cấp nên ta sẽ có tham số recursive như sau:

pip install Pillow (hoặc python –m pip install Pillow)​

7

Tạo hàm để tái sử dụng trong python

Sau khi hoàn thành các bước, bạn có thể tạo một hàm trong python với tên gọi Crawnewsdata() để thuận tiện sử dụng cho những lần sau, hàm này sẽ nhận vào url gốc, url đến nơi lấy bài và trả về một list các bài viết gồm tiêu đề, đoạn tóm tắt, nội dung và một hình ảnh đại diện.