Hướng dẫn how to scrape url in python - cách cạo url trong python

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để làm sâu sắc thêm sự hiểu biết của bạn: Web Scraping với Soup và Python tuyệt đẹp This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Web Scraping With Beautiful Soup and Python

Số lượng dữ liệu đáng kinh ngạc trên Internet là một nguồn tài nguyên phong phú cho bất kỳ lĩnh vực nghiên cứu hoặc lợi ích cá nhân nào. Để thu hoạch hiệu quả dữ liệu đó, bạn sẽ cần phải có kỹ năng trong việc cạo web. Các thư viện Python

https://au.indeed.com/jobs?q=developer&l=perth
5 và súp đẹp là những công cụ mạnh mẽ cho công việc. Nếu bạn thích học với các ví dụ thực hành và có sự hiểu biết cơ bản về Python và HTML, thì hướng dẫn này là dành cho bạn.web scraping. The Python libraries
https://au.indeed.com/jobs?q=developer&l=perth
5 and Beautiful Soup are powerful tools for the job. If you like to learn with hands-on examples and have a basic understanding of Python and HTML, then this tutorial is for you.

Trong hướng dẫn này, bạn sẽ học cách:

  • Kiểm tra cấu trúc HTML của trang web mục tiêu của bạn với các công cụ phát triển trình duyệt của bạnHTML structure of your target site with your browser’s developer tools
  • Giải mã dữ liệu được mã hóa trong URLURLs
  • Sử dụng
    https://au.indeed.com/jobs?q=developer&l=perth
    
    5 và súp đẹp để cạo và phân tích dữ liệu từ webscraping and parsing data from the Web
  • Bước qua một đường ống quét web từ đầu đến cuốiweb scraping pipeline from start to finish
  • Xây dựng một tập lệnh tìm kiếm công việc cung cấp từ web và hiển thị thông tin liên quan trong bảng điều khiển của bạn that fetches job offers from the Web and displays relevant information in your console

Làm việc thông qua dự án này sẽ cung cấp cho bạn kiến ​​thức về quy trình và các công cụ bạn cần để loại bỏ bất kỳ trang web tĩnh nào trên web trên toàn thế giới. Bạn có thể tải xuống mã nguồn dự án bằng cách nhấp vào liên kết bên dưới:

Bắt đầu nào!

Web Scraping là gì?

Quét web là quá trình thu thập thông tin từ Internet. Ngay cả việc sao chép và dán lời bài hát yêu thích của bạn là một hình thức quét web! Tuy nhiên, các từ trên web Scraping, thường đề cập đến một quy trình liên quan đến tự động hóa. Một số trang web không thích nó khi máy quét tự động thu thập dữ liệu của họ, trong khi những trang web khác không có tâm trí. is the process of gathering information from the Internet. Even copying and pasting the lyrics of your favorite song is a form of web scraping! However, the words “web scraping” usually refer to a process that involves automation. Some websites don’t like it when automatic scrapers gather their data, while others don’t mind.

Nếu bạn đang cạo một trang một cách tôn trọng cho mục đích giáo dục, thì bạn không có khả năng gặp vấn đề gì. Tuy nhiên, đó là một ý tưởng tốt để tự mình thực hiện một số nghiên cứu và đảm bảo rằng bạn không vi phạm bất kỳ điều khoản dịch vụ nào trước khi bạn bắt đầu một dự án quy mô lớn.

Lý do để quét web

Nói rằng bạn là một người lướt sóng, cả trực tuyến và ngoài đời, và bạn đang tìm kiếm việc làm. Tuy nhiên, bạn không tìm kiếm bất kỳ công việc nào. Với tư duy lướt sóng, bạn đã chờ đợi cơ hội hoàn hảo để lăn lộn!

Có một trang web việc làm cung cấp chính xác các loại công việc bạn muốn. Thật không may, một vị trí mới chỉ xuất hiện một lần trong một mặt trăng xanh và trang web không cung cấp dịch vụ thông báo email. Bạn nghĩ về việc kiểm tra nó mỗi ngày, nhưng điều đó không giống như cách thú vị và hiệu quả nhất để dành thời gian của bạn.

Rất may, thế giới cung cấp các cách khác để áp dụng suy nghĩ của người lướt sóng đó! Thay vì nhìn vào trang web việc làm mỗi ngày, bạn có thể sử dụng Python để giúp tự động hóa các bộ phận lặp đi lặp lại tìm kiếm công việc của bạn. Tự động cạo web có thể là một giải pháp để tăng tốc quá trình thu thập dữ liệu. Bạn viết mã của mình một lần và nó sẽ nhận được thông tin bạn muốn nhiều lần và từ nhiều trang.Automated web scraping can be a solution to speed up the data collection process. You write your code once, and it will get the information you want many times and from many pages.

Ngược lại, khi bạn cố gắng lấy thông tin bạn muốn theo cách thủ công, bạn có thể dành nhiều thời gian để nhấp, cuộn và tìm kiếm, đặc biệt nếu bạn cần một lượng lớn dữ liệu từ các trang web thường xuyên được cập nhật với nội dung mới. Thủ công trên web có thể mất rất nhiều thời gian và sự lặp lại.

Có rất nhiều thông tin trên web và thông tin mới liên tục được thêm vào. Bạn có thể quan tâm đến ít nhất một số dữ liệu đó, và phần lớn nó chỉ là ngoài đó để thực hiện. Cho dù bạn thực sự đang đi săn công việc hay bạn muốn tải xuống tất cả lời bài hát của nghệ sĩ yêu thích của bạn, việc quét web tự động có thể giúp bạn hoàn thành mục tiêu của mình.

Những thách thức của việc quét web

Web đã phát triển hữu cơ từ nhiều nguồn. Nó kết hợp nhiều công nghệ, phong cách và tính cách khác nhau, và nó tiếp tục phát triển cho đến ngày nay. Nói cách khác, web là một mớ hỗn độn nóng bỏng! Bởi vì điều này, bạn sẽ gặp phải một số thách thức khi quét web:

  • Variety: Mỗi trang web là khác nhau. Mặc dù bạn sẽ gặp các cấu trúc chung lặp lại, mỗi trang web là duy nhất và sẽ cần điều trị cá nhân nếu bạn muốn trích xuất thông tin liên quan. Every website is different. While you’ll encounter general structures that repeat themselves, each website is unique and will need personal treatment if you want to extract the relevant information.

  • Độ bền: Các trang web liên tục thay đổi. Giả sử bạn đã xây dựng một máy cạo web mới sáng bóng, tự động chọn những gì bạn muốn từ tài nguyên quan tâm của bạn. Lần đầu tiên bạn chạy tập lệnh của mình, nó hoạt động hoàn hảo. Nhưng khi bạn chạy cùng một kịch bản chỉ một thời gian ngắn sau đó, bạn sẽ chạy vào một đống tracebacks đáng kinh ngạc và dài! Websites constantly change. Say you’ve built a shiny new web scraper that automatically cherry-picks what you want from your resource of interest. The first time you run your script, it works flawlessly. But when you run the same script only a short while later, you run into a discouraging and lengthy stack of tracebacks!

Các kịch bản không ổn định là một kịch bản thực tế, vì nhiều trang web đang được phát triển tích cực. Khi cấu trúc trang web đã thay đổi, cào của bạn có thể không thể điều hướng chính xác sơ đồ trang web hoặc tìm thông tin liên quan. Tin tốt là nhiều thay đổi đối với các trang web là nhỏ và gia tăng, do đó, bạn có thể có thể cập nhật cào của mình chỉ với những điều chỉnh tối thiểu.

Tuy nhiên, hãy nhớ rằng vì internet rất năng động, nên những bộ dụng cụ mà bạn xây dựng có thể sẽ yêu cầu bảo trì liên tục. Bạn có thể thiết lập tích hợp liên tục để chạy các bài kiểm tra quét định kỳ để đảm bảo rằng tập lệnh chính của bạn không bị phá vỡ mà không có kiến ​​thức của bạn.

Một giải pháp thay thế cho việc quét web: API

Một số nhà cung cấp trang web cung cấp giao diện lập trình ứng dụng (API) cho phép bạn truy cập dữ liệu của họ theo cách được xác định trước. Với API, bạn có thể tránh phân tích cú pháp HTML. Thay vào đó, bạn có thể truy cập dữ liệu trực tiếp bằng các định dạng như JSON và XML. HTML chủ yếu là một cách để trình bày nội dung cho người dùng một cách trực quan.

Khi bạn sử dụng API, quy trình thường ổn định hơn so với thu thập dữ liệu thông qua việc cạo web. Điều đó bởi vì các nhà phát triển tạo ra API để được tiêu thụ bởi các chương trình hơn là bằng mắt người.

Việc trình bày mặt trước của một trang web có thể thay đổi thường xuyên, nhưng sự thay đổi như vậy trong trang web Thiết kế của bạn không ảnh hưởng đến cấu trúc API của nó. Cấu trúc của API thường là vĩnh viễn hơn, điều đó có nghĩa là nó là một nguồn đáng tin cậy hơn của dữ liệu trang web.

Tuy nhiên, API cũng có thể thay đổi. Những thách thức của cả sự đa dạng và độ bền áp dụng cho API giống như chúng đối với các trang web. Ngoài ra, nó rất khó kiểm tra cấu trúc của API nếu tài liệu được cung cấp thiếu chất lượng.

Cách tiếp cận và công cụ bạn cần thu thập thông tin bằng API nằm ngoài phạm vi của hướng dẫn này. Để tìm hiểu thêm về nó, hãy xem tích hợp API trong Python.

Cạo các trang web công việc python giả mạo

Trong hướng dẫn này, bạn sẽ xây dựng một máy cạo Web tìm kiếm danh sách công việc của nhà phát triển phần mềm Python từ trang web Python Jobs giả. Nó là một trang web ví dụ với các bài đăng công việc giả mà bạn có thể tự do cào để đào tạo kỹ năng của mình. Máy cạo web của bạn sẽ phân tích HTML trên trang web để chọn thông tin liên quan và lọc nội dung đó cho các từ cụ thể.

Bạn có thể cạo bất kỳ trang web nào trên internet mà bạn có thể xem, nhưng khó khăn khi làm như vậy phụ thuộc vào trang web. Hướng dẫn này cung cấp cho bạn một giới thiệu về việc cạo web để giúp bạn hiểu được quy trình tổng thể. Sau đó, bạn có thể áp dụng quy trình tương tự này cho mọi trang web mà bạn sẽ muốn cạo.

Trong suốt hướng dẫn, bạn cũng sẽ gặp một vài khối tập thể dục. Bạn có thể nhấp để mở rộng chúng và thử thách bản thân bằng cách hoàn thành các nhiệm vụ được mô tả ở đó.exercise blocks. You can click to expand them and challenge yourself by completing the tasks described there.

Bước 1: Kiểm tra nguồn dữ liệu của bạn

Trước khi bạn viết bất kỳ mã Python nào, bạn cần tìm hiểu trang web mà bạn muốn cạo. Đó phải là bước đầu tiên của bạn cho bất kỳ dự án quét web nào bạn muốn giải quyết. Bạn cần phải hiểu cấu trúc trang web để trích xuất thông tin mà liên quan đến bạn. Bắt đầu bằng cách mở trang web bạn muốn cạo với trình duyệt yêu thích của bạn.

Khám phá trang web

Nhấp qua trang web và tương tác với nó giống như bất kỳ người tìm kiếm công việc điển hình nào. Ví dụ: bạn có thể cuộn qua trang chính của trang web:

Hướng dẫn how to scrape url in python - cách cạo url trong python

Bạn có thể thấy nhiều bài đăng công việc ở định dạng thẻ và mỗi người trong số họ có hai nút. Nếu bạn nhấp vào Áp dụng, thì bạn sẽ thấy một trang mới chứa các mô tả chi tiết hơn về công việc đã chọn. Bạn cũng có thể nhận thấy rằng URL trong thanh địa chỉ trình duyệt của bạn thay đổi khi bạn tương tác với trang web.

Giải mã thông tin trong URLS

Một lập trình viên có thể mã hóa nhiều thông tin trong URL. Hành trình quét web của bạn sẽ dễ dàng hơn nhiều nếu lần đầu tiên bạn làm quen với cách các URL hoạt động và những gì họ đã tạo ra. Ví dụ: bạn có thể thấy mình trên trang chi tiết có URL sau:

https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html

Bạn có thể giải mã URL trên thành hai phần chính:

  1. URL cơ sở đại diện cho đường dẫn đến chức năng tìm kiếm của trang web. Trong ví dụ trên, URL cơ sở là
    https://au.indeed.com/jobs?q=developer&l=perth
    
    7.
    represents the path to the search functionality of the website. In the example above, the base URL is
    https://au.indeed.com/jobs?q=developer&l=perth
    
    7.
  2. Vị trí trang web cụ thể kết thúc bằng
    https://au.indeed.com/jobs?q=developer&l=perth
    
    8 là đường dẫn đến tài nguyên độc đáo của mô tả công việc.
    that ends with
    https://au.indeed.com/jobs?q=developer&l=perth
    
    8 is the path to the job description’s unique resource.

Bất kỳ công việc được đăng trên trang web này sẽ sử dụng cùng một URL cơ sở. Tuy nhiên, vị trí tài nguyên độc đáo của bạn sẽ khác nhau tùy thuộc vào công việc cụ thể mà bạn đang xem.

URL có thể chứa nhiều thông tin hơn chỉ là vị trí của một tệp. Một số trang web sử dụng các tham số truy vấn để mã hóa các giá trị mà bạn gửi khi thực hiện tìm kiếm. Bạn có thể nghĩ về chúng như các chuỗi truy vấn mà bạn gửi đến cơ sở dữ liệu để truy xuất các bản ghi cụ thể.query parameters to encode values that you submit when performing a search. You can think of them as query strings that you send to the database to retrieve specific records.

Bạn sẽ tìm thấy các tham số truy vấn ở cuối URL. Ví dụ: nếu bạn thực sự đi đến và tìm kiếm nhà phát triển phần mềm trên mạng, ở Úc, thông qua thanh tìm kiếm của họ, bạn sẽ thấy rằng URL thay đổi để bao gồm các giá trị này dưới dạng tham số truy vấn:

https://au.indeed.com/jobs?q=software+developer&l=Australia

Các tham số truy vấn trong URL này là

https://au.indeed.com/jobs?q=developer&l=perth
9. Các tham số truy vấn bao gồm ba phần:

  1. Bắt đầu: Bắt đầu của các tham số truy vấn được biểu thị bằng dấu câu hỏi (
    $ python -m pip install requests
    
    0).
    The beginning of the query parameters is denoted by a question mark (
    $ python -m pip install requests
    
    0).
  2. Thông tin: Các mẩu thông tin cấu thành một tham số truy vấn được mã hóa trong các cặp giá trị khóa, trong đó các khóa và giá trị liên quan được nối với nhau bằng một dấu bằng (
    $ python -m pip install requests
    
    1).
    The pieces of information constituting one query parameter are encoded in key-value pairs, where related keys and values are joined together by an equals sign (
    $ python -m pip install requests
    
    1).
  3. Dấu tách: Mỗi URL có thể có nhiều tham số truy vấn, được phân tách bằng ký hiệu ampersand và (
    $ python -m pip install requests
    
    2).
    Every URL can have multiple query parameters, separated by an ampersand symbol (
    $ python -m pip install requests
    
    2).

Được trang bị thông tin này, bạn có thể chọn các tham số truy vấn URL URL thành hai cặp giá trị khóa:

  1. $ python -m pip install requests
    
    3 chọn loại công việc.
    selects the type of job.
  2. $ python -m pip install requests
    
    4 chọn vị trí của công việc.
    selects the location of the job.

Cố gắng thay đổi các tham số tìm kiếm và quan sát làm thế nào điều đó ảnh hưởng đến URL của bạn. Đi trước và nhập các giá trị mới trong thanh tìm kiếm lên trên:

Hướng dẫn how to scrape url in python - cách cạo url trong python
Thay đổi các giá trị này để quan sát các thay đổi trong URL.

Tiếp theo, hãy cố gắng thay đổi các giá trị trực tiếp trong URL của bạn. Xem điều gì xảy ra khi bạn dán URL sau vào thanh địa chỉ trình duyệt của bạn:

https://au.indeed.com/jobs?q=developer&l=perth

Nếu bạn thay đổi và gửi các giá trị trong hộp tìm kiếm của trang web, thì nó sẽ được phản ánh trực tiếp trong các tham số truy vấn URL URL và ngược lại. Nếu bạn thay đổi một trong số chúng, thì bạn sẽ thấy các kết quả khác nhau trên trang web.

Như bạn có thể thấy, việc khám phá các URL của một trang web có thể cung cấp cho bạn cái nhìn sâu sắc về cách lấy dữ liệu từ máy chủ trang web.

Quay trở lại với các công việc Python giả và tiếp tục khám phá nó. Trang web này là một trang web hoàn toàn tĩnh mà không hoạt động trên cơ sở dữ liệu, đó là lý do tại sao bạn giành chiến thắng phải làm việc với các tham số truy vấn trong hướng dẫn cạo này.

Kiểm tra trang web bằng các công cụ phát triển

Tiếp theo, bạn sẽ muốn tìm hiểu thêm về cách cấu trúc dữ liệu để hiển thị. Bạn cần phải hiểu cấu trúc trang để chọn những gì bạn muốn từ phản hồi HTML mà bạn sẽ thu thập trong một trong các bước sắp tới.

Các công cụ phát triển có thể giúp bạn hiểu cấu trúc của một trang web. Tất cả các trình duyệt hiện đại đi kèm với các công cụ phát triển được cài đặt. Trong phần này, bạn sẽ thấy cách làm việc với các công cụ phát triển trong Chrome. Quá trình này sẽ rất giống với các trình duyệt hiện đại khác. can help you understand the structure of a website. All modern browsers come with developer tools installed. In this section, you’ll see how to work with the developer tools in Chrome. The process will be very similar to other modern browsers.

Trong Chrome on macOS, bạn có thể mở các công cụ nhà phát triển thông qua menu bằng cách chọn Xem → Nhà phát triển → Công cụ nhà phát triển. Trên Windows và Linux, bạn có thể truy cập chúng bằng cách nhấp vào nút Menu trên cùng bên phải (

$ python -m pip install requests
5) và chọn thêm công cụ → Công cụ nhà phát triển. Bạn cũng có thể truy cập các công cụ nhà phát triển của mình bằng cách nhấp chuột phải vào trang và chọn tùy chọn kiểm tra hoặc sử dụng phím tắt:

  • Mac:Cmd+Alt+I Cmd+Alt+I
  • Windows/Linux:Ctrl+Shift+I Ctrl+Shift+I

Các công cụ phát triển cho phép bạn khám phá tương tác mô hình đối tượng tài liệu trang web (DOM) để hiểu rõ hơn về nguồn của bạn. Để đào sâu vào trang của bạn DOM DOM, chọn tab các phần tử trong các công cụ của nhà phát triển. Bạn sẽ thấy một cấu trúc với các phần tử HTML có thể nhấp. Bạn có thể mở rộng, sụp đổ và thậm chí chỉnh sửa các yếu tố ngay trong trình duyệt của bạn:

Hướng dẫn how to scrape url in python - cách cạo url trong python
HTML ở bên phải đại diện cho cấu trúc của trang bạn có thể thấy ở bên trái.

Bạn có thể nghĩ về văn bản được hiển thị trong trình duyệt của bạn dưới dạng cấu trúc HTML của trang đó. Nếu bạn quan tâm, thì bạn có thể đọc thêm về sự khác biệt giữa DOM và HTML trên CSS-Tricks.

Khi bạn nhấp chuột phải vào các phần tử trên trang, bạn có thể chọn Kiểm tra để phóng to vị trí của chúng trong DOM. Bạn cũng có thể di chuột qua văn bản HTML ở bên phải và thấy các yếu tố tương ứng sáng lên trên trang.

Bấm để mở rộng khối tập thể dục cho một nhiệm vụ cụ thể để thực hành bằng các công cụ phát triển của bạn:

Tìm một bài đăng công việc duy nhất. Nó được gói trong phần tử HTML nào, và nó chứa các yếu tố HTML nào khác?

Chơi xung quanh và khám phá! Bạn càng biết nhiều trang mà bạn làm việc, thì càng dễ dàng cạo nó. Tuy nhiên, don lồng bị choáng ngợp với tất cả các văn bản HTML đó. Bạn sẽ sử dụng sức mạnh của lập trình để bước qua mê cung và anh đào này đã chọn thông tin mà liên quan đến bạn.

Bước 2: Nội dung HTML Scrape từ một trang

Bây giờ bạn có một ý tưởng về những gì bạn làm việc, đã đến lúc bắt đầu sử dụng Python. Đầu tiên, bạn sẽ muốn đưa mã HTML của trang web vào tập lệnh Python của bạn để bạn có thể tương tác với nó. Đối với nhiệm vụ này, bạn sẽ sử dụng thư viện Python từ ____25.

Tạo một môi trường ảo cho dự án của bạn trước khi bạn cài đặt bất kỳ gói bên ngoài nào. Kích hoạt môi trường ảo mới của bạn, sau đó nhập lệnh sau vào thiết bị đầu cuối của bạn để cài đặt thư viện

https://au.indeed.com/jobs?q=developer&l=perth
5 bên ngoài:

$ python -m pip install requests

Sau đó mở một tệp mới trong trình soạn thảo văn bản yêu thích của bạn. Tất cả những gì bạn cần để truy xuất HTML là một vài dòng mã:

import requests

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

print(page.text)

Mã này đưa ra yêu cầu HTTP

$ python -m pip install requests
8 cho URL đã cho. Nó lấy dữ liệu HTML mà máy chủ gửi lại và lưu trữ dữ liệu đó trong một đối tượng Python.

Nếu bạn in thuộc tính

$ python -m pip install requests
9 của
import requests

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

print(page.text)
0, thì bạn sẽ nhận thấy rằng nó trông giống như HTML mà bạn đã kiểm tra trước đó với các công cụ phát triển trình duyệt của bạn. Bạn đã tìm được thành công nội dung trang web tĩnh từ Internet! Bây giờ bạn có quyền truy cập vào trang web HT HTML từ trong tập lệnh Python của bạn.

Trang web tĩnh

Trang web mà bạn đang quét trong hướng dẫn này phục vụ nội dung HTML tĩnh. Trong kịch bản này, máy chủ lưu trữ trang web sẽ gửi lại các tài liệu HTML đã chứa tất cả dữ liệu mà bạn sẽ thấy như một người dùng.static HTML content. In this scenario, the server that hosts the site sends back HTML documents that already contain all the data that you’ll get to see as a user.

Khi bạn đã kiểm tra trang với các công cụ phát triển trước đó, bạn đã phát hiện ra rằng việc đăng công việc bao gồm HTML dài và lộn xộn sau đây:

<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>

Nó có thể là một thách thức để quấn đầu của bạn xung quanh một khối dài mã HTML. Để làm cho nó dễ đọc hơn, bạn có thể sử dụng một định dạng HTML để tự động làm sạch nó. Khả năng đọc tốt giúp bạn hiểu rõ hơn về cấu trúc của bất kỳ khối mã nào. Mặc dù nó có thể hoặc không thể giúp cải thiện định dạng HTML, nhưng nó luôn luôn đáng để thử.

HTML mà bạn gặp phải đôi khi sẽ khó hiểu. May mắn thay, HTML của bảng công việc này có tên lớp mô tả về các yếu tố mà bạn quan tâm:class names on the elements that you’re interested in:

  • import requests
    
    URL = "https://realpython.github.io/fake-jobs/"
    page = requests.get(URL)
    
    print(page.text)
    
    1 chứa tiêu đề của bài đăng công việc.
    contains the title of the job posting.
  • import requests
    
    URL = "https://realpython.github.io/fake-jobs/"
    page = requests.get(URL)
    
    print(page.text)
    
    2 chứa tên của công ty cung cấp vị trí.
    contains the name of the company that offers the position.
  • import requests
    
    URL = "https://realpython.github.io/fake-jobs/"
    page = requests.get(URL)
    
    print(page.text)
    
    3 chứa vị trí nơi bạn đang làm việc.
    contains the location where you’d be working.

Trong trường hợp bạn bị lạc trong một đống HTML lớn, hãy nhớ rằng bạn luôn có thể quay lại trình duyệt của mình và sử dụng các công cụ nhà phát triển để khám phá thêm cấu trúc HTML tương tác.

Đến bây giờ, bạn đã khai thác thành công thiết kế năng lượng và thân thiện với người dùng của thư viện Python từ ____25. Chỉ với một vài dòng mã, bạn đã quản lý để xóa nội dung HTML tĩnh khỏi web và cung cấp nó để xử lý thêm.

Tuy nhiên, có nhiều tình huống khó khăn hơn mà bạn có thể gặp phải khi bạn thực hiện các trang web. Trước khi bạn tìm hiểu cách chọn thông tin liên quan từ HTML mà bạn vừa cạo, bạn sẽ xem nhanh hai trong số những tình huống khó khăn hơn này.

Trang web ẩn

Một số trang chứa thông tin mà ẩn ẩn đằng sau một đăng nhập. Điều đó có nghĩa là bạn sẽ cần một tài khoản để có thể cạo bất cứ thứ gì từ trang. Quá trình thực hiện yêu cầu HTTP từ tập lệnh Python của bạn khác với cách bạn truy cập một trang từ trình duyệt của bạn. Chỉ vì bạn có thể đăng nhập vào trang thông qua trình duyệt của bạn không có nghĩa là bạn sẽ có thể cạo nó bằng tập lệnh Python của bạn.

Tuy nhiên, thư viện

https://au.indeed.com/jobs?q=developer&l=perth
5 đi kèm với khả năng tích hợp để xử lý xác thực. Với các kỹ thuật này, bạn có thể đăng nhập vào các trang web khi thực hiện yêu cầu HTTP từ tập lệnh Python của bạn và sau đó xóa thông tin mà ẩn ẩn đằng sau việc đăng nhập. Bạn đã giành chiến thắng cần phải đăng nhập để truy cập thông tin bảng công việc, đó là lý do tại sao hướng dẫn này đã giành được xác thực.

Trang web năng động

Trong hướng dẫn này, bạn sẽ học cách cạo một trang web tĩnh. Các trang web tĩnh rất đơn giản để hoạt động vì máy chủ gửi cho bạn một trang HTML đã chứa tất cả thông tin trang trong phản hồi. Bạn có thể phân tích phản hồi HTML đó và ngay lập tức bắt đầu chọn dữ liệu liên quan.

Mặt khác, với một trang web động, máy chủ có thể không gửi lại bất kỳ HTML nào. Thay vào đó, bạn có thể nhận mã JavaScript dưới dạng phản hồi. Mã này sẽ trông hoàn toàn khác với những gì bạn đã thấy khi bạn kiểm tra trang với các công cụ phát triển trình duyệt của bạn.dynamic website, the server might not send back any HTML at all. Instead, you could receive JavaScript code as a response. This code will look completely different from what you saw when you inspected the page with your browser’s developer tools.

Những gì xảy ra trong trình duyệt không giống như những gì xảy ra trong tập lệnh của bạn. Trình duyệt của bạn sẽ siêng năng thực hiện mã JavaScript mà nó nhận được từ một máy chủ và tạo DOM và HTML cho bạn cục bộ. Tuy nhiên, nếu bạn yêu cầu một trang web động trong tập lệnh Python của bạn, thì bạn đã giành được nội dung trang HTML.

Khi bạn sử dụng

https://au.indeed.com/jobs?q=developer&l=perth
5, bạn chỉ nhận được những gì máy chủ gửi lại. Trong trường hợp của một trang web động, bạn sẽ kết thúc với một số mã JavaScript thay vì HTML. Cách duy nhất để đi từ mã JavaScript bạn nhận được cho nội dung mà bạn quan tâm là thực thi mã, giống như trình duyệt của bạn. Thư viện
https://au.indeed.com/jobs?q=developer&l=perth
5 có thể làm điều đó cho bạn, nhưng có những giải pháp khác có thể.execute the code, just like your browser does. The
https://au.indeed.com/jobs?q=developer&l=perth
5 library can’t do that for you, but there are other solutions that can.

Ví dụ:

import requests

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

print(page.text)
8 là một dự án được tạo bởi tác giả của thư viện
https://au.indeed.com/jobs?q=developer&l=perth
5 cho phép bạn hiển thị JavaScript bằng cách sử dụng cú pháp tương tự như cú pháp trong
https://au.indeed.com/jobs?q=developer&l=perth
5. Nó cũng bao gồm các khả năng phân tích dữ liệu bằng cách sử dụng súp đẹp dưới mui xe.Beautiful Soup under the hood.

Bạn đã giành chiến thắng đi sâu hơn vào việc quét nội dung được tạo ra một cách động trong hướng dẫn này. Hiện tại, nó đủ để nhớ xem xét một trong những tùy chọn được đề cập ở trên nếu bạn cần cạo một trang web năng động.

Bước 3: Mã HTML Parse với Súp đẹp

Bạn đã thực hiện thành công một số HTML từ Internet, nhưng khi bạn nhìn vào nó, nó có vẻ như là một mớ hỗn độn lớn. Có rất nhiều phần tử HTML ở đây và ở đó, hàng ngàn thuộc tính nằm rải rác xung quanh, và có phải là một số JavaScript được trộn lẫn không? Đó là thời gian để phân tích phản hồi mã dài này với sự trợ giúp của Python để làm cho nó dễ tiếp cận hơn và chọn dữ liệu bạn muốn.

Súp đẹp là một thư viện Python để phân tích dữ liệu có cấu trúc. Nó cho phép bạn tương tác với HTML theo cách tương tự như cách bạn tương tác với một trang web bằng các công cụ phát triển. Thư viện phơi bày một vài chức năng trực quan mà bạn có thể sử dụng để khám phá HTML bạn nhận được. Để bắt đầu, hãy sử dụng thiết bị đầu cuối của bạn để cài đặt súp đẹp:parsing structured data. It allows you to interact with HTML in a similar way to how you interact with a web page using developer tools. The library exposes a couple of intuitive functions you can use to explore the HTML you received. To get started, use your terminal to install Beautiful Soup:

$ python -m pip install beautifulsoup4

Sau đó, nhập thư viện vào tập lệnh Python của bạn và tạo ra một đối tượng súp đẹp:

import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")

Khi bạn thêm hai dòng mã được tô sáng, bạn tạo ra một đối tượng súp đẹp lấy

<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
1, đó là nội dung HTML bạn đã cạo trước đó, làm đầu vào của nó.

Đối số thứ hai,

<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
2, đảm bảo rằng bạn sử dụng trình phân tích cú pháp thích hợp cho nội dung HTML.

Tìm các yếu tố bằng ID

Trong một trang web HTML, mọi phần tử có thể có thuộc tính

<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
3 được gán. Như tên đã gợi ý, thuộc tính
<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
3 làm cho phần tử có thể nhận dạng duy nhất trên trang. Bạn có thể bắt đầu phân tích trang của mình bằng cách chọn một phần tử cụ thể bằng ID của nó.

Chuyển trở lại các công cụ phát triển và xác định đối tượng HTML chứa tất cả các bài đăng công việc. Khám phá bằng cách lơ lửng trên các phần của trang và sử dụng nhấp chuột phải để kiểm tra.

Phần tử mà bạn đang tìm kiếm là một

<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
5 với thuộc tính
<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
3 có giá trị
<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
7. Nó cũng có một số thuộc tính khác, nhưng dưới đây là ý chính của những gì bạn đang tìm kiếm:

<div id="ResultsContainer">
  
div>

Súp đẹp cho phép bạn tìm thấy phần tử HTML cụ thể đó bằng ID của nó:

results = soup.find(id="ResultsContainer")

Để xem dễ dàng hơn, bạn có thể nuôi bất kỳ đối tượng súp đẹp nào khi bạn in nó ra. Nếu bạn gọi

<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
8 trên biến
<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
9 mà bạn vừa gán ở trên, thì bạn sẽ thấy tất cả các HTML có trong
<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
5:

https://au.indeed.com/jobs?q=software+developer&l=Australia
0

Khi bạn sử dụng ID phần tử, bạn có thể chọn một phần tử trong số các phần còn lại của HTML. Bây giờ bạn chỉ có thể làm việc với phần cụ thể này của trang HTML. Có vẻ như món súp chỉ có một chút mỏng hơn! Tuy nhiên, nó vẫn còn khá dày đặc.

Tìm các phần tử theo tên lớp HTML

Bạn đã thấy rằng mỗi bài đăng công việc được bọc trong một yếu tố

<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
5 với lớp
$ python -m pip install beautifulsoup4
2. Bây giờ bạn có thể làm việc với đối tượng mới của bạn có tên là
<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
9 và chỉ chọn các bài đăng công việc trong đó. Rốt cuộc, đây là những phần của HTML mà bạn quan tâm! Bạn có thể làm điều này trong một dòng mã:

https://au.indeed.com/jobs?q=software+developer&l=Australia
1

Tại đây, bạn gọi

$ python -m pip install beautifulsoup4
4 trên một đối tượng súp tuyệt đẹp, trả về một điều không thể có tất cả HTML cho tất cả các danh sách công việc được hiển thị trên trang đó.

Hãy xem tất cả chúng:

https://au.indeed.com/jobs?q=software+developer&l=Australia
2

Điều đó đã khá gọn gàng, nhưng vẫn còn rất nhiều HTML! Bạn đã thấy trước đó rằng trang của bạn có tên lớp mô tả trên một số yếu tố. Bạn có thể chọn ra những yếu tố trẻ em đó từ mỗi công việc đăng bài với

$ python -m pip install beautifulsoup4
5:

https://au.indeed.com/jobs?q=software+developer&l=Australia
3

Mỗi

$ python -m pip install beautifulsoup4
6 là một đối tượng
$ python -m pip install beautifulsoup4
7 khác. Do đó, bạn có thể sử dụng các phương thức tương tự trên nó như bạn đã làm trên phần tử cha của nó,
<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
9.

Với đoạn mã này, bạn sẽ ngày càng gần gũi hơn với dữ liệu mà bạn thực sự quan tâm. Tuy nhiên, vẫn còn rất nhiều điều xảy ra với tất cả các thẻ và thuộc tính HTML đó trôi nổi xung quanh:

https://au.indeed.com/jobs?q=software+developer&l=Australia
4

Tiếp theo, bạn sẽ học cách thu hẹp đầu ra này để chỉ truy cập vào nội dung văn bản mà bạn quan tâm.

Tìm các yếu tố theo tên lớp và nội dung văn bản

Không phải tất cả các danh sách công việc là công việc của nhà phát triển. Thay vì in ra tất cả các công việc được liệt kê trên trang web, trước tiên bạn sẽ lọc chúng bằng các từ khóa.

Bạn biết rằng các tiêu đề công việc trong trang được giữ trong các yếu tố

$ python -m pip install beautifulsoup4
9. Để chỉ lọc cho các công việc cụ thể, bạn có thể sử dụng đối số
import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
0:

https://au.indeed.com/jobs?q=software+developer&l=Australia
5

Mã này tìm thấy tất cả các phần tử

$ python -m pip install beautifulsoup4
9 trong đó chuỗi chứa khớp chính xác. Lưu ý rằng bạn trực tiếp gọi phương thức trên biến
<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
9 đầu tiên của bạn. Nếu bạn đi trước và
import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
4 đầu ra của đoạn mã trên vào bảng điều khiển của bạn, thì bạn có thể thất vọng vì nó sẽ trống:

>>>

https://au.indeed.com/jobs?q=software+developer&l=Australia
6

Có một công việc Python trong kết quả tìm kiếm, vậy tại sao nó không hiển thị?

Khi bạn sử dụng

import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
5 như bạn đã làm ở trên, chương trình của bạn tìm kiếm chính xác chuỗi đó. Bất kỳ sự khác biệt nào trong chính tả, viết hoa hoặc khoảng trắng sẽ ngăn yếu tố phù hợp. Trong phần tiếp theo, bạn sẽ tìm thấy một cách để làm cho chuỗi tìm kiếm của bạn tổng quát hơn.

Chuyển một chức năng cho một phương pháp súp đẹp

Ngoài các chuỗi, đôi khi bạn có thể chuyển các chức năng như là đối số cho các phương pháp súp đẹp. Thay vào đó, bạn có thể thay đổi dòng mã trước đó để sử dụng chức năng: thay vào đó:

https://au.indeed.com/jobs?q=software+developer&l=Australia
7

Bây giờ bạn đã chuyển một chức năng ẩn danh cho đối số

import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
5. Hàm Lambda nhìn vào văn bản của mỗi phần tử
$ python -m pip install beautifulsoup4
9, chuyển đổi nó thành chữ thường và kiểm tra xem phần phụ
import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
8 có được tìm thấy ở bất cứ đâu không. Bạn có thể kiểm tra xem bạn có quản lý để xác định tất cả các công việc Python với phương pháp này không:anonymous function to the
import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
5 argument. The lambda function looks at the text of each
$ python -m pip install beautifulsoup4
9 element, converts it to lowercase, and checks whether the substring
import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
8 is found anywhere. You can check whether you managed to identify all the Python jobs with this approach:

>>>

https://au.indeed.com/jobs?q=software+developer&l=Australia
8

Chương trình của bạn đã tìm thấy

import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
9 Các bài đăng công việc phù hợp bao gồm từ
import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
8 trong tiêu đề công việc của họ!

Tìm các yếu tố tùy thuộc vào nội dung văn bản của họ là một cách mạnh mẽ để lọc phản hồi HTML của bạn để biết thông tin cụ thể. Súp đẹp cho phép bạn sử dụng các chuỗi hoặc chức năng chính xác làm đối số để lọc văn bản trong các đồ vật súp đẹp.

Tuy nhiên, khi bạn cố gắng chạy cạp của mình để in thông tin của các công việc Python được lọc, bạn sẽ gặp lỗi:

https://au.indeed.com/jobs?q=software+developer&l=Australia
9

Thông báo này là một lỗi phổ biến mà bạn sẽ gặp rất nhiều khi bạn lấy thông tin từ Internet. Kiểm tra HTML của một phần tử trong danh sách

<div id="ResultsContainer">
  
div>
1 của bạn. Nó trông như thế nào? Bạn nghĩ rằng lỗi đến từ đâu?

Xác định các điều kiện lỗi

Khi bạn nhìn vào một yếu tố duy nhất trong

<div id="ResultsContainer">
  
div>
1, bạn sẽ thấy rằng nó chỉ bao gồm phần tử
$ python -m pip install beautifulsoup4
9 chứa tiêu đề công việc:

https://au.indeed.com/jobs?q=developer&l=perth
0

Khi bạn xem lại mã bạn đã sử dụng để chọn các mục, bạn sẽ thấy rằng đó là những gì bạn nhắm mục tiêu. Bạn chỉ lọc cho các yếu tố tiêu đề

$ python -m pip install beautifulsoup4
9 của các bài đăng công việc có chứa từ
import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
8. Như bạn có thể thấy, những yếu tố này don don bao gồm phần còn lại của thông tin về công việc.

Thông báo lỗi bạn nhận được trước đó có liên quan đến điều này:

https://au.indeed.com/jobs?q=software+developer&l=Australia
9

Bạn đã cố gắng tìm tiêu đề công việc, tên công ty và vị trí công việc trong mỗi yếu tố trong

<div id="ResultsContainer">
  
div>
1, nhưng mỗi yếu tố chỉ chứa văn bản tiêu đề công việc.

Thư viện phân tích cú pháp siêng năng của bạn vẫn tìm kiếm những người khác, và trả về

<div id="ResultsContainer">
  
div>
7 vì nó có thể tìm thấy chúng. Sau đó,
import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
4 không thành công với thông báo lỗi đã hiển thị khi bạn cố gắng trích xuất thuộc tính
$ python -m pip install requests
9 từ một trong các đối tượng
<div id="ResultsContainer">
  
div>
7 này.

Văn bản mà bạn đang tìm kiếm được lồng trong các yếu tố anh chị em của các yếu tố

$ python -m pip install beautifulsoup4
9 mà bộ lọc của bạn đã trả về. Súp đẹp có thể giúp bạn chọn các yếu tố anh chị em, trẻ em và cha mẹ của từng đối tượng súp đẹp.

Truy cập các yếu tố cha mẹ

Một cách để có được quyền truy cập vào tất cả các thông tin bạn cần là bước lên trong hệ thống phân cấp của DOM bắt đầu từ các yếu tố

$ python -m pip install beautifulsoup4
9 mà bạn đã xác định. Hãy xem một cái nhìn khác về HTML của một bài đăng một công việc. Tìm phần tử
$ python -m pip install beautifulsoup4
9 chứa tiêu đề công việc cũng như phần tử cha gần nhất của nó chứa tất cả thông tin mà bạn quan tâm:

https://au.indeed.com/jobs?q=developer&l=perth
2

Phần tử

<div class="card">
  <div class="card-content">
    <div class="media">
      <div class="media-left">
        <figure class="image is-48x48">
          <img
            src="https://files.realpython.com/media/real-python-logo-thumbnail.7f0db70c2ed2.jpg"
            alt="Real Python Logo"
          />
        figure>
      div>
      <div class="media-content">
        <h2 class="title is-5">Senior Python Developerh2>
        <h3 class="subtitle is-6 company">Payne, Roberts and Davish3>
      div>
    div>

    <div class="content">
      <p class="location">Stewartbury, AAp>
      <p class="is-small has-text-grey">
        <time datetime="2021-04-08">2021-04-08time>
      p>
    div>
    <footer class="card-footer">
      <a
        href="https://www.realpython.com"
        target="_blank"
        class="card-footer-item"
        >Learna
      >
      <a
        href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
        target="_blank"
        class="card-footer-item"
        >Applya
      >
    footer>
  div>
div>
5 với lớp
$ python -m pip install beautifulsoup4
2 chứa tất cả thông tin bạn muốn. Nó có một phụ huynh cấp ba của phần tử tiêu đề
$ python -m pip install beautifulsoup4
9 mà bạn tìm thấy bằng bộ lọc của mình.

Với thông tin này, giờ đây bạn có thể sử dụng các yếu tố trong

<div id="ResultsContainer">
  
div>
1 và lấy các yếu tố ông cố của chúng để có quyền truy cập vào tất cả thông tin bạn muốn:

https://au.indeed.com/jobs?q=developer&l=perth
3

Bạn đã thêm một danh sách hiểu biết hoạt động trên từng phần tử tiêu đề

$ python -m pip install beautifulsoup4
9 trong
<div id="ResultsContainer">
  
div>
1 mà bạn có bằng cách lọc với biểu thức Lambda. Bạn có thể chọn phần tử cha của phần tử cha của phần tử cha của mỗi phần tử tiêu đề
$ python -m pip install beautifulsoup4
9. Đó là ba thế hệ lên!

Khi bạn đang xem HTML của một bài đăng công việc, bạn đã xác định rằng phần tử phụ huynh cụ thể này với tên lớp

$ python -m pip install beautifulsoup4
2 chứa tất cả thông tin bạn cần.

Bây giờ bạn có thể điều chỉnh mã trong vòng lặp

https://au.indeed.com/jobs?q=software+developer&l=Australia
02 của mình để lặp lại qua các yếu tố cha mẹ thay thế:

https://au.indeed.com/jobs?q=developer&l=perth
4

Khi bạn chạy tập lệnh của mình vào một lần khác, bạn sẽ thấy mã của bạn một lần nữa có quyền truy cập vào tất cả các thông tin liên quan. Điều đó bởi vì bạn hiện đang lặp lại các yếu tố

https://au.indeed.com/jobs?q=software+developer&l=Australia
03 thay vì chỉ các yếu tố tiêu đề
$ python -m pip install beautifulsoup4
9.

Sử dụng thuộc tính

https://au.indeed.com/jobs?q=software+developer&l=Australia
05 mà mỗi đối tượng súp đẹp đi kèm với bạn một cách trực quan để bước qua cấu trúc DOM của bạn và giải quyết các yếu tố bạn cần. Bạn cũng có thể truy cập các yếu tố trẻ em và các yếu tố anh chị em theo cách tương tự. Đọc về điều hướng cây để biết thêm thông tin.

Tiếp tục tập luyện

Nếu bạn đã viết mã cùng với hướng dẫn này, thì bạn có thể chạy tập lệnh của mình như hiện tại và bạn sẽ thấy thông tin công việc giả mạo xuất hiện trong thiết bị đầu cuối của bạn. Bước tiếp theo của bạn là giải quyết một bảng công việc ngoài đời thực! Để tiếp tục thực hành các kỹ năng mới của bạn, hãy xem lại quy trình cạo web bằng bất kỳ hoặc tất cả các trang web sau:real-life job board! To keep practicing your new skills, revisit the web scraping process using any or all of the following sites:

  • Pythonjobs
  • Remote(dot)co
  • Thật

Các trang web được liên kết trả về kết quả tìm kiếm của họ dưới dạng phản hồi HTML tĩnh, tương tự như bảng công việc Python giả. Do đó, bạn có thể cạo chúng chỉ bằng cách sử dụng

https://au.indeed.com/jobs?q=developer&l=perth
5 và súp đẹp.

Bắt đầu đi qua hướng dẫn này một lần nữa từ đầu bằng một trong những trang web khác này. Bạn có thể thấy rằng mỗi cấu trúc của trang web là khác nhau và bạn sẽ cần xây dựng lại mã theo một cách hơi khác nhau để tìm nạp dữ liệu bạn muốn. Giải quyết thử thách này là một cách tuyệt vời để thực hành các khái niệm mà bạn vừa học. Mặc dù nó có thể khiến bạn đổ mồ hôi thường xuyên, nhưng kỹ năng mã hóa của bạn sẽ mạnh hơn cho nó!

Trong nỗ lực thứ hai của bạn, bạn cũng có thể khám phá các tính năng bổ sung của súp đẹp. Sử dụng tài liệu làm sách hướng dẫn và cảm hứng của bạn. Thực hành thêm sẽ giúp bạn trở nên thành thạo hơn khi sử dụng Python,

https://au.indeed.com/jobs?q=developer&l=perth
5 và súp đẹp.

Để kết thúc hành trình của bạn vào việc quét web, sau đó bạn có thể cung cấp cho mã của mình một trang điểm cuối cùng và tạo ứng dụng giao diện dòng lệnh (CLI) để loại bỏ một trong các bảng công việc và lọc kết quả bằng một từ khóa mà bạn có thể nhập vào mỗi lần thực hiện . Công cụ CLI của bạn có thể cho phép bạn tìm kiếm các loại công việc hoặc công việc cụ thể ở các địa điểm cụ thể.command-line interface (CLI) app that scrapes one of the job boards and filters the results by a keyword that you can input on each execution. Your CLI tool could allow you to search for specific types of jobs or jobs in particular locations.

Nếu bạn quan tâm đến việc học cách điều chỉnh tập lệnh của mình như một giao diện dòng lệnh, thì hãy xem cách xây dựng các giao diện dòng lệnh trong Python với Argparse.

Sự kết luận

Thư viện

https://au.indeed.com/jobs?q=developer&l=perth
5 cung cấp cho bạn một cách thân thiện với người dùng để tìm nạp HTML tĩnh từ Internet bằng Python. Sau đó, bạn có thể phân tích HTML với một gói khác gọi là Soup xinh đẹp. Cả hai gói đều là những người bạn đồng hành đáng tin cậy và hữu ích cho những cuộc phiêu lưu trên web của bạn. Bạn có thể thấy rằng súp đẹp sẽ phục vụ cho hầu hết các nhu cầu phân tích cú pháp của bạn, bao gồm cả điều hướng và tìm kiếm nâng cao.

Trong hướng dẫn này, bạn đã học cách cạo dữ liệu từ web bằng Python,

https://au.indeed.com/jobs?q=developer&l=perth
5 và súp đẹp. Bạn đã xây dựng một tập lệnh tìm kiếm các bài đăng công việc từ Internet và trải qua quá trình cạo hoàn toàn từ đầu đến cuối.

Bạn đã học được cách:

  • Bước qua một đường ống quét web từ đầu đến cuốiweb scraping pipeline from start to finish
  • Kiểm tra cấu trúc HTML của trang web mục tiêu của bạn với các công cụ phát triển trình duyệt của bạnHTML structure of your target site with your browser’s developer tools
  • Giải mã dữ liệu được mã hóa trong URLURLs
  • Tải xuống trang HTML HTML bằng thư viện Python từ
    https://au.indeed.com/jobs?q=developer&l=perth
    
    5HTML content using Python’s
    https://au.indeed.com/jobs?q=developer&l=perth
    
    5 library
  • Phân tích HTML đã tải xuống với súp đẹp để trích xuất thông tin liên quan the downloaded HTML with Beautiful Soup to extract relevant information
  • Xây dựng một tập lệnh tìm kiếm công việc cung cấp từ web và hiển thị thông tin liên quan trong bảng điều khiển của bạn that fetches job offers from the Web and displays relevant information in your console

Với đường ống rộng này trong tâm trí và hai thư viện mạnh mẽ trong bộ công cụ của bạn, bạn có thể đi ra ngoài và xem những trang web khác mà bạn có thể cạo. Hãy vui vẻ, và luôn nhớ được tôn trọng và sử dụng các kỹ năng lập trình của bạn một cách có trách nhiệm.

Bạn có thể tải xuống mã nguồn cho tập lệnh mẫu mà bạn đã xây dựng trong hướng dẫn này bằng cách nhấp vào liên kết bên dưới:

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để làm sâu sắc thêm sự hiểu biết của bạn: Web Scraping với Soup và Python tuyệt đẹp This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Web Scraping With Beautiful Soup and Python

Bạn có thể cạo các trang web với Python không?

Thay vì nhìn vào trang web việc làm mỗi ngày, bạn có thể sử dụng Python để giúp tự động hóa các bộ phận lặp đi lặp lại của tìm kiếm việc làm.Tự động cạo web có thể là một giải pháp để tăng tốc quá trình thu thập dữ liệu.Bạn viết mã của mình một lần và nó sẽ nhận được thông tin bạn muốn nhiều lần và từ nhiều trang.you can use Python to help automate your job search's repetitive parts. Automated web scraping can be a solution to speed up the data collection process. You write your code once, and it will get the information you want many times and from many pages.

Làm thế nào để bạn quét dữ liệu từ một danh sách các URL trong Python?

Phương thức này diễn ra như sau: Tạo một vòng lặp For For For Crypt tất cả các thuộc tính HREF (và vì vậy các URL) cho tất cả các trang chúng tôi muốn.Làm sạch dữ liệu và tạo một danh sách chứa tất cả các URL được thu thập.Tạo một vòng lặp mới đi qua danh sách các URL để xóa tất cả các thông tin cần thiết.

Làm cách nào để cạo một url hình ảnh trong Python?

Trong bài viết này, chúng ta sẽ xem cách cạo hình ảnh từ các trang web bằng Python ...
Nhập mô -đun ..
Thực hiện các yêu cầu và chuyển vào URL ..
Chuyển các yêu cầu vào một hàm đẹp () ..
Sử dụng thẻ 'IMG' để tìm tất cả chúng ('src').