Trích xuất url từ html python

Tiết lộ. Bài đăng này có thể chứa các liên kết liên kết, nghĩa là khi bạn nhấp vào liên kết và mua hàng, chúng tôi sẽ nhận được hoa hồng

Trích xuất tất cả các liên kết của một trang web là một nhiệm vụ phổ biến giữa những người quét web. Thật hữu ích khi xây dựng các công cụ dọn dẹp nâng cao thu thập dữ liệu mọi trang của một trang web nhất định để trích xuất dữ liệu. Nó cũng có thể được sử dụng cho quy trình chẩn đoán SEO hoặc thậm chí là giai đoạn thu thập thông tin cho người kiểm tra thâm nhập

Trong hướng dẫn này, bạn sẽ tìm hiểu cách xây dựng công cụ trích xuất liên kết trong Python từ đầu chỉ bằng các yêu cầu và thư viện BeautifulSoup

Lưu ý rằng có rất nhiều công cụ trích xuất liên kết ngoài kia, chẳng hạn như Trình trích xuất liên kết của Sitechecker. Mục tiêu của hướng dẫn này là tự xây dựng một cái bằng ngôn ngữ lập trình Python

Được. Ethical Hacking với sách điện tử Python

Hãy cài đặt các phụ thuộc

pip3 install requests bs4 colorama

Chúng tôi sẽ sử dụng các yêu cầu để thực hiện các yêu cầu HTTP một cách thuận tiện, BeautifulSoup để phân tích cú pháp HTML và colorama để thay đổi màu văn bản

Mở một tệp Python mới và làm theo. Hãy nhập các mô-đun chúng ta cần

import requests
from urllib.parse import urlparse, urljoin
from bs4 import BeautifulSoup
import colorama

Chúng tôi sẽ sử dụng colorama chỉ để sử dụng các màu khác nhau khi in, để phân biệt giữa các liên kết bên trong và bên ngoài

# init the colorama module
colorama.init()
GREEN = colorama.Fore.GREEN
GRAY = colorama.Fore.LIGHTBLACK_EX
RESET = colorama.Fore.RESET
YELLOW = colorama.Fore.YELLOW

Chúng tôi sẽ cần hai biến toàn cục, một cho tất cả các liên kết nội bộ của trang web và biến còn lại cho tất cả các liên kết bên ngoài

# initialize the set of links (unique links)
internal_urls = set()
external_urls = set()
  • Liên kết nội bộ là các URL liên kết đến các trang khác của cùng một trang web
  • Liên kết ngoài là các URL liên kết đến các trang web khác

Vì không phải tất cả các liên kết trong thẻ liên kết (thẻ a) đều hợp lệ (tôi đã thử nghiệm với điều này), một số là liên kết đến các phần của trang web và một số là javascript, vì vậy hãy viết một hàm để xác thực URL

def is_valid(url):
    """
    Checks whether `url` is a valid URL.
    """
    parsed = urlparse(url)
    return bool(parsed.netloc) and bool(parsed.scheme)

Điều này sẽ đảm bảo rằng một sơ đồ thích hợp (giao thức, e. g http hoặc https) và tên miền tồn tại trong URL

Bây giờ hãy xây dựng một hàm để trả về tất cả các URL hợp lệ của một trang web

def get_all_website_links(url):
    """
    Returns all URLs that is found on `url` in which it belongs to the same website
    """
    # all URLs of `url`
    urls = set()
    # domain name of the URL without the protocol
    domain_name = urlparse(url).netloc
    soup = BeautifulSoup(requests.get(url).content, "html.parser")

Đầu tiên, tôi đã khởi tạo biến bộ url;

Thứ hai, tôi đã trích xuất tên miền từ URL. Chúng tôi sẽ cần nó để kiểm tra xem liên kết mà chúng tôi lấy là bên ngoài hay bên trong

Thứ ba, tôi đã tải xuống nội dung HTML của trang web và bọc nó bằng một đối tượng

import requests
from urllib.parse import urlparse, urljoin
from bs4 import BeautifulSoup
import colorama
3 để dễ dàng phân tích cú pháp HTML

Hãy lấy tất cả các thẻ HTML a (các thẻ neo chứa tất cả các liên kết của trang web)

    for a_tag in soup.findAll("a"):
        href = a_tag.attrs.get("href")
        if href == "" or href is None:
            # href empty tag
            continue

Vì vậy, chúng tôi lấy thuộc tính href và kiểm tra xem có thứ gì ở đó không. Nếu không, chúng tôi chỉ tiếp tục đến liên kết tiếp theo

Vì không phải tất cả các liên kết đều tuyệt đối nên chúng tôi sẽ cần nối các URL tương đối với tên miền của chúng (e. g khi href là "/search" và url là "google. com", kết quả sẽ là "google. com/tìm kiếm")

________số 8

Bây giờ chúng ta cần xóa các tham số HTTP GET khỏi các URL, vì điều này sẽ gây ra sự dư thừa trong tập hợp, đoạn mã dưới đây xử lý điều đó

        parsed_href = urlparse(href)
        # remove URL GET parameters, URL fragments, etc.
        href = parsed_href.scheme + "://" + parsed_href.netloc + parsed_href.path

Hãy kết thúc chức năng

import requests
from urllib.parse import urlparse, urljoin
from bs4 import BeautifulSoup
import colorama
0

Có liên quan. Ethical Hacking với sách điện tử Python

Tất cả những gì chúng tôi đã làm ở đây là kiểm tra

  • Nếu URL không hợp lệ, hãy tiếp tục đến liên kết tiếp theo
  • Nếu URL đã có trong internal_urls, thì chúng tôi cũng không cần
  • Nếu URL là một liên kết bên ngoài, hãy in nó bằng màu xám và thêm nó vào bộ external_urls toàn cầu của chúng tôi và tiếp tục đến liên kết tiếp theo

Cuối cùng, sau tất cả các bước kiểm tra, URL sẽ là một liên kết nội bộ, chúng tôi in nó ra và thêm nó vào bộ url và internal_urls của chúng tôi

Hàm trên chỉ lấy link của 1 trang cụ thể, nếu muốn lấy tất cả link của cả website thì làm thế nào?

import requests
from urllib.parse import urlparse, urljoin
from bs4 import BeautifulSoup
import colorama
0

Hàm này thu thập trang web, có nghĩa là nó lấy tất cả các liên kết của trang đầu tiên và sau đó tự gọi đệ quy để theo dõi tất cả các liên kết được trích xuất trước đó. Tuy nhiên, điều này có thể gây ra một số vấn đề; . com. Kết quả là tôi đã thêm một tham số max_urls để thoát khi chúng tôi kiểm tra đến một số URL nhất định

Được rồi, hãy kiểm tra điều này; . Nếu không, tôi không chịu trách nhiệm cho bất kỳ tác hại nào bạn gây ra

import requests
from urllib.parse import urlparse, urljoin
from bs4 import BeautifulSoup
import colorama
1

Nhận -35 GIẢM GIÁ. Ethical Hacking với sách điện tử Python

Tôi đang thử nghiệm trên trang web này. Tuy nhiên, tôi rất khuyến khích bạn không làm điều đó;

Đây là một phần của đầu ra

Trích xuất url từ html python

Sau khi quá trình thu thập thông tin kết thúc, nó sẽ in tổng số liên kết được trích xuất và thu thập thông tin

import requests
from urllib.parse import urlparse, urljoin
from bs4 import BeautifulSoup
import colorama
2

Tuyệt vời, phải không?

Có một số trang web tải hầu hết nội dung của họ bằng JavaScript. Do đó, thay vào đó, chúng tôi cần sử dụng thư viện request_html, thư viện này cho phép chúng tôi thực thi Javascript bằng Chromium; . Kiểm tra nó

Yêu cầu cùng một trang web nhiều lần trong một khoảng thời gian ngắn có thể khiến trang web chặn địa chỉ IP của bạn. Trong trường hợp đó, bạn cần sử dụng máy chủ proxy cho các mục đích đó

Thay vào đó, nếu bạn quan tâm đến việc chụp ảnh, hãy xem hướng dẫn này. Cách tải xuống tất cả hình ảnh từ một trang web bằng Python hoặc nếu bạn muốn trích xuất các bảng HTML, hãy xem hướng dẫn này

Tôi đã chỉnh sửa mã một chút để bạn có thể lưu các URL đầu ra trong một tệp và chuyển các URL từ các đối số dòng lệnh. Tôi thực sự khuyên bạn nên kiểm tra mã hoàn chỉnh tại đây

Trong Ethical Hacking with Python EBook, chúng tôi đã sử dụng mã này để xây dựng một trình thu thập email nâng cao đi vào mọi liên kết được trích xuất và tìm kiếm địa chỉ email. Hãy chắc chắn để kiểm tra nó ở đây

Bạn muốn tìm hiểu thêm về Web Scraping?

Cuối cùng, nếu bạn muốn tìm hiểu sâu hơn về web scraping với các thư viện Python khác nhau, không chỉ BeautifulSoup, các khóa học dưới đây chắc chắn sẽ có giá trị cho bạn

Làm cách nào để trích xuất URL từ tệp HTML bằng Python?

Mã sử ​​dụng hàm find_all với bộ lọc thẻ để chỉ truy xuất các URL. .
nhập trích xuất bs def (nội dung). links = [] soup = BeautifulSoup(content, 'lxml') cho thẻ trong soup. .
nhập trích xuất bs def (nội dung). links = [] soup = BeautifulSoup(content, 'lxml') cho thẻ trong soup. .
nhập lxml

Làm cách nào để trích xuất dữ liệu từ URL trong Python?

Để trích xuất dữ liệu bằng cách sử dụng quét web với python, bạn cần làm theo các bước cơ bản sau. .
Tìm URL mà bạn muốn cạo
Kiểm tra Trang
Tìm dữ liệu bạn muốn trích xuất
Viết mã
Chạy mã và giải nén dữ liệu
Lưu trữ dữ liệu ở định dạng cần thiết

Làm cách nào tôi có thể nhận được các liên kết HREF từ HTML bằng Python?

Bạn có thể sử dụng mô-đun HTMLParser. Ghi chú. Mô-đun HTMLParser đã được đổi tên thành html. trình phân tích cú pháp trong Python 3. 0. .
BeautifulSoup không thể tự động đóng thẻ meta chẳng hạn. .
một vấn đề khác với bsoup là định dạng của liên kết sẽ thay đổi so với ban đầu. .
Không phải tất cả các liên kết đều chứa http