Cách chạy tập lệnh python từ url

Web là một sinh vật sống, đang thở – nó liên tục thích nghi và thay đổi. Trong môi trường năng động này, việc thu thập dữ liệu nhạy cảm với thời gian như danh sách Thương mại điện tử chỉ một lần là vô ích vì nó nhanh chóng trở nên lỗi thời. Để có tính cạnh tranh, bạn phải giữ cho dữ liệu của mình luôn mới và chạy các tập lệnh quét web của bạn nhiều lần và thường xuyên

Cách dễ nhất là chạy tập lệnh trong nền. Nói cách khác, chạy nó như một dịch vụ. May mắn thay, bất kể hệ điều hành đang được sử dụng – Linux hay Windows – bạn đều có những công cụ tuyệt vời để tùy ý sử dụng. Hướng dẫn này sẽ trình bày chi tiết quy trình trong một vài bước đơn giản

Chuẩn bị tập lệnh Python cho Linux

Trong bài viết này, thông tin từ danh sách URL sách sẽ bị loại bỏ. Khi quá trình đến cuối danh sách, nó sẽ lặp lại và làm mới dữ liệu nhiều lần

Đầu tiên, tạo một yêu cầu và truy xuất nội dung HTML của một trang. Sử dụng mô-đun Yêu cầu để làm như vậy

urls = [
'//books.toscrape.com/catalogue/sapiens-a-brief-history-of-humankind_996/index.html',
'//books.toscrape.com/catalogue/shakespeares-sonnets_989/index.html',
'//books.toscrape.com/catalogue/sharp-objects_997/index.html',
]

index = 0
while True:
    url = urls[index % len[urls]]
    index += 1

    print['Scraping url', url]
    response = requests.get[url]

Khi nội dung được truy xuất, hãy phân tích cú pháp bằng thư viện Beautiful Soup

soup = BeautifulSoup[response.content, 'html.parser']
book_name = soup.select_one['.product_main'].h1.text
rows = soup.select['.table.table-striped tr']
product_info = {row.th.text: row.td.text for row in rows}

Đảm bảo rằng thư mục dữ liệu sắp tồn tại của bạn đã tồn tại, sau đó lưu thông tin sách ở đó ở định dạng JSON

tiền boa. đảm bảo sử dụng mô-đun pathlib để tự động chuyển đổi trình phân tách đường dẫn Python thành định dạng tương thích với cả hệ thống Windows và Linux

data_folder = Path['./data']
data_folder.mkdir[parents=True, exist_ok=True]

json_file_name = re.sub['[: ]', '-', book_name]
json_file_path = data_folder / f'{json_file_name}.json'
with open[json_file_path, 'w'] as book_file:
    json.dump[product_info, book_file]

Vì tập lệnh này chạy lâu và không bao giờ thoát, nên bạn cũng phải xử lý mọi yêu cầu từ hệ điều hành đang cố tắt tập lệnh. Bằng cách này, bạn có thể kết thúc lần lặp hiện tại trước khi thoát. Để làm như vậy, bạn có thể định nghĩa một lớp xử lý các tín hiệu của hệ điều hành

class SignalHandler:
    shutdown_requested = False

    def __init__[self]:
        signal.signal[signal.SIGINT, self.request_shutdown]
        signal.signal[signal.SIGTERM, self.request_shutdown]

    def request_shutdown[self, *args]:
        print['Request to shutdown received, stopping']
        self.shutdown_requested = True

    def can_run[self]:
        return not self.shutdown_requested

Thay vì có một điều kiện vòng lặp không bao giờ thay đổi [trong khi Đúng], bạn có thể hỏi SignalHandler mới được tạo xem có nhận được bất kỳ tín hiệu tắt máy nào không

signal_handler = SignalHandler[]

# ...

while signal_handler.can_run[]:
    # run the code only if you don't need to exit

Đây là mã cho đến nay

import json
import re
import signal
from pathlib import Path

import requests
from bs4 import BeautifulSoup

       class SignalHandler:
    shutdown_requested = False

    def __init__[self]:
        signal.signal[signal.SIGINT, self.request_shutdown]
        signal.signal[signal.SIGTERM, self.request_shutdown]

    def request_shutdown[self, *args]:
        print['Request to shutdown received, stopping']
        self.shutdown_requested = True

    def can_run[self]:
        return not self.shutdown_requested


signal_handler = SignalHandler[]
urls = [
    '//books.toscrape.com/catalogue/sapiens-a-brief-history-of-humankind_996/index.html',
    '//books.toscrape.com/catalogue/shakespeares-sonnets_989/index.html',
    '//books.toscrape.com/catalogue/sharp-objects_997/index.html',
]

index = 0
while signal_handler.can_run[]:
    url = urls[index % len[urls]]
    index += 1

    print['Scraping url', url]
    response = requests.get[url]

    soup = BeautifulSoup[response.content, 'html.parser']
    book_name = soup.select_one['.product_main'].h1.text
    rows = soup.select['.table.table-striped tr']
    product_info = {row.th.text: row.td.text for row in rows}

    data_folder = Path['./data']
    data_folder.mkdir[parents=True, exist_ok=True]

    json_file_name = re.sub['[\': ]', '-', book_name]
    json_file_path = data_folder / f'{json_file_name}.json'
    with open[json_file_path, 'w'] as book_file:
        json.dump[product_info, book_file]

Tập lệnh sẽ làm mới các tệp JSON với thông tin sách mới được thu thập

Chạy trình nền Linux

Nếu bạn đang tự hỏi làm thế nào để chạy tập lệnh Python trong Linux, thì có nhiều cách để thực hiện khi khởi động. Nhiều bản phân phối có các công cụ GUI tích hợp cho các mục đích như vậy

Hãy sử dụng một trong những bản phân phối phổ biến nhất, Linux Mint, làm ví dụ. Nó sử dụng môi trường máy tính để bàn có tên Cinnamon cung cấp tiện ích ứng dụng khởi động

Nó cho phép bạn thêm tập lệnh của mình và chỉ định độ trễ khởi động

Tuy nhiên, cách tiếp cận này không cung cấp nhiều quyền kiểm soát hơn đối với tập lệnh. Ví dụ, điều gì xảy ra khi bạn cần khởi động lại nó?

Đây là nơi systemd xuất hiện. Systemd là trình quản lý dịch vụ cho phép bạn quản lý các quy trình của người dùng bằng các tệp cấu hình dễ đọc

Để sử dụng systemd, trước tiên hãy tạo một tệp trong thư mục /etc/systemd/system

cd /etc/systemd/system
touch book-scraper.service

Thêm nội dung sau vào máy cạo sách. tệp dịch vụ bằng trình chỉnh sửa yêu thích của bạn

[Unit]
Description=A script for scraping the book information
After=syslog.target network.target

[Service]
WorkingDirectory=/home/oxylabs/Scraper
ExecStart=/home/oxylabs/Scraper/venv/bin/python3 scrape.py

Restart=always
RestartSec=120

[Install]
WantedBy=multi-user.target

Đây là danh sách cơ bản của các tham số được sử dụng trong tệp cấu hình

  • Sau – đảm bảo bạn chỉ bắt đầu tập lệnh Python của mình sau khi kết nối mạng.  

  • RestartSec – thời gian ngủ trước khi khởi động lại dịch vụ

  • Khởi động lại – mô tả những việc cần làm nếu dịch vụ thoát, bị tắt hoặc hết thời gian chờ.  

  • WorkingDirectory – thư mục làm việc hiện tại của tập lệnh

  • ExecStart – lệnh thực thi

Bây giờ, đã đến lúc nói với systemd về daemon mới được tạo. Chạy lệnh daemon-reload

Sau đó, bắt đầu dịch vụ của bạn

________số 8

Và cuối cùng, hãy kiểm tra xem dịch vụ của bạn có đang chạy không

$  system systemctl status book-scraper
book-scraper.service - A script for scraping the book information
     Loaded: loaded [/etc/systemd/system/book-scraper.service; disabled; vendor preset: enabled]
     Active: active [running] since Thu 2022-09-08 15:01:27 EEST; 16min ago
   Main PID: 60803 [python3]
      Tasks: 1 [limit: 18637]
     Memory: 21.3M
     CGroup: /system.slice/book-scraper.service
             60803 /home/oxylabs/Scraper/venv/bin/python3 scrape.py

Sep 08 15:17:55 laptop python3[60803]: Scraping url //books.toscrape.com/catalogue/shakespeares-sonnets_989/index.html
Sep 08 15:17:55 laptop python3[60803]: Scraping url //books.toscrape.com/catalogue/sharp-objects_997/index.html
Sep 08 15:17:55 laptop python3[60803]: Scraping url //books.toscrape.com/catalogue/sapiens-a-brief-history-of-humankind_996/index.html

tiền boa. sử dụng journalctl -S today -u book-scraper. dịch vụ theo dõi nhật ký của bạn trong thời gian thực

chúc mừng. Bây giờ bạn có thể kiểm soát dịch vụ của mình thông qua systemd

Chạy tập lệnh Python dưới dạng dịch vụ Windows

Chạy tập lệnh Python dưới dạng dịch vụ Windows không đơn giản như người ta mong đợi. Hãy bắt đầu với những thay đổi về kịch bản

Để bắt đầu, hãy thay đổi cách tập lệnh được thực thi dựa trên số lượng đối số mà tập lệnh nhận được từ dòng lệnh.   

Nếu tập lệnh nhận được một đối số duy nhất, giả sử rằng Trình quản lý Dịch vụ Windows đang cố khởi động tập lệnh đó. Điều đó có nghĩa là bạn phải chạy mã khởi tạo. Nếu không có đối số nào được thông qua, hãy in một số thông tin hữu ích bằng cách sử dụng win32serviceutil. Xử LýLệnhDòng

soup = BeautifulSoup[response.content, 'html.parser']
book_name = soup.select_one['.product_main'].h1.text
rows = soup.select['.table.table-striped tr']
product_info = {row.th.text: row.td.text for row in rows}
0

Tiếp theo, mở rộng lớp tiện ích đặc biệt và đặt một số thuộc tính. Tất cả tên dịch vụ, tên hiển thị và mô tả sẽ hiển thị trong tiện ích dịch vụ Windows [dịch vụ. msc] sau khi dịch vụ của bạn được thiết lập và chạy

soup = BeautifulSoup[response.content, 'html.parser']
book_name = soup.select_one['.product_main'].h1.text
rows = soup.select['.table.table-striped tr']
product_info = {row.th.text: row.td.text for row in rows}
1

Cuối cùng, triển khai các phương thức SvcDoRun và SvcStop để bắt đầu và dừng dịch vụ. Đây là kịch bản cho đến nay

soup = BeautifulSoup[response.content, 'html.parser']
book_name = soup.select_one['.product_main'].h1.text
rows = soup.select['.table.table-striped tr']
product_info = {row.th.text: row.td.text for row in rows}
2

Bây giờ bạn đã có tập lệnh, hãy mở một thiết bị đầu cuối Windows theo sở thích của bạn

tiền boa. nếu bạn đang sử dụng Powershell, hãy đảm bảo bao gồm một. exe khi chạy các tệp nhị phân để tránh các lỗi không mong muốn

Khi thiết bị đầu cuối được mở, hãy thay đổi thư mục thành vị trí của tập lệnh của bạn bằng môi trường ảo chẳng hạn

Tiếp theo, cài đặt mô-đun tiện ích mở rộng Windows Python thử nghiệm, pypiwin32. Bạn cũng sẽ cần chạy tập lệnh sau khi cài đặt

soup = BeautifulSoup[response.content, 'html.parser']
book_name = soup.select_one['.product_main'].h1.text
rows = soup.select['.table.table-striped tr']
product_info = {row.th.text: row.td.text for row in rows}
3

Thật không may, nếu bạn cố gắng cài đặt tập lệnh Python của mình dưới dạng dịch vụ Windows với thiết lập hiện tại, bạn sẽ gặp lỗi sau

soup = BeautifulSoup[response.content, 'html.parser']
book_name = soup.select_one['.product_main'].h1.text
rows = soup.select['.table.table-striped tr']
product_info = {row.th.text: row.td.text for row in rows}
4

Tuy nhiên, nếu bạn làm theo hướng dẫn của đầu ra lỗi, bạn sẽ gặp sự cố mới khi cố khởi chạy tập lệnh của mình

soup = BeautifulSoup[response.content, 'html.parser']
book_name = soup.select_one['.product_main'].h1.text
rows = soup.select['.table.table-striped tr']
product_info = {row.th.text: row.td.text for row in rows}
5

Để giải quyết vấn đề này, bạn có thể thêm các thư viện Python và trình thông dịch vào đường dẫn Windows. Ngoài ra, hãy gói tập lệnh của bạn và tất cả các phần phụ thuộc của nó vào một tệp thực thi bằng cách sử dụng trình cài đặt pyinstaller

soup = BeautifulSoup[response.content, 'html.parser']
book_name = soup.select_one['.product_main'].h1.text
rows = soup.select['.table.table-striped tr']
product_info = {row.th.text: row.td.text for row in rows}
6

Tùy chọn --hiddenimport win32timezone rất quan trọng vì mô-đun win32timezone không được nhập rõ ràng nhưng vẫn cần thiết để tập lệnh chạy

Cuối cùng, hãy cài đặt tập lệnh dưới dạng dịch vụ và chạy nó bằng cách gọi tệp thực thi mà bạn đã tạo trước đó

soup = BeautifulSoup[response.content, 'html.parser']
book_name = soup.select_one['.product_main'].h1.text
rows = soup.select['.table.table-striped tr']
product_info = {row.th.text: row.td.text for row in rows}
7

Và đó là nó. Bây giờ, bạn có thể mở tiện ích dịch vụ Windows và xem dịch vụ mới của mình đang chạy

tiền boa. bạn có thể đọc thêm về các chức năng Windows API cụ thể tại đây

Dịch vụ mới được tạo đang chạy

Làm cho cuộc sống của bạn dễ dàng hơn bằng cách sử dụng NSSM trên Windows

Rõ ràng, bạn có thể sử dụng win32serviceutil để phát triển dịch vụ Windows. Nhưng quá trình này chắc chắn không đơn giản – thậm chí có thể nói nó tệ. Chà, đây là lúc NSSM [Trình quản lý dịch vụ không hút] phát huy tác dụng

Hãy đơn giản hóa tập lệnh bằng cách chỉ giữ lại mã thực hiện quét web

soup = BeautifulSoup[response.content, 'html.parser']
book_name = soup.select_one['.product_main'].h1.text
rows = soup.select['.table.table-striped tr']
product_info = {row.th.text: row.td.text for row in rows}
8

Tiếp theo, tạo tệp nhị phân bằng pyinstaller

soup = BeautifulSoup[response.content, 'html.parser']
book_name = soup.select_one['.product_main'].h1.text
rows = soup.select['.table.table-striped tr']
product_info = {row.th.text: row.td.text for row in rows}
9

Bây giờ bạn đã có tệp nhị phân, đã đến lúc cài đặt NSSM bằng cách truy cập trang web chính thức. Giải nén nó vào một thư mục bạn chọn và thêm thư mục vào biến môi trường PATH của bạn để thuận tiện

Sau đó, chạy thiết bị đầu cuối với tư cách quản trị viên

Khi thiết bị đầu cuối được mở, hãy thay đổi thư mục thành vị trí tập lệnh của bạn

Cuối cùng, cài đặt tập lệnh bằng NSSM và bắt đầu dịch vụ

data_folder = Path['./data']
data_folder.mkdir[parents=True, exist_ok=True]

json_file_name = re.sub['[: ]', '-', book_name]
json_file_path = data_folder / f'{json_file_name}.json'
with open[json_file_path, 'w'] as book_file:
    json.dump[product_info, book_file]
0

tiền boa. nếu bạn gặp sự cố, hãy chuyển hướng đầu ra lỗi tiêu chuẩn của dịch vụ của bạn sang một tệp để xem điều gì đã xảy ra

data_folder = Path['./data']
data_folder.mkdir[parents=True, exist_ok=True]

json_file_name = re.sub['[: ]', '-', book_name]
json_file_path = data_folder / f'{json_file_name}.json'
with open[json_file_path, 'w'] as book_file:
    json.dump[product_info, book_file]
1

NSSM đảm bảo rằng một dịch vụ đang chạy ở chế độ nền và nếu không, thì ít nhất bạn cũng biết lý do tại sao

Phần kết luận

Bất kể hệ điều hành là gì, bạn có nhiều tùy chọn khác nhau để thiết lập tập lệnh Python cho các tác vụ quét web định kỳ. Cho dù bạn cần khả năng định cấu hình của systemd, tính linh hoạt của các dịch vụ Windows hay tính đơn giản của NSSM, hãy đảm bảo làm theo hướng dẫn đã được thử nghiệm và chân thực này khi bạn điều hướng các tính năng của chúng

Nếu bạn quan tâm đến các giải pháp tự động hóa Python hơn cho các ứng dụng quét web hoặc muốn làm mới những điều cơ bản, hãy xem blog của chúng tôi để biết các hướng dẫn khác nhau về tất cả mọi thứ về quét web

Mọi người cũng hỏi

hệ thống là gì?

Systemd là một công cụ mạnh mẽ để quản lý các quy trình. Nó cũng cung cấp quản lý ghi nhật ký và phụ thuộc, ví dụ, chỉ bắt đầu các quy trình khi có mạng hoặc khi một dịch vụ trước đó đã được bắt đầu

Sự khác biệt giữa systemd và systemctl là gì?

Systemctl là một tiện ích và là một phần của systemd. Trong số những thứ khác, nó cho phép bạn quản lý các dịch vụ và kiểm tra trạng thái của chúng

Tôi có thể sử dụng cron thay vì systemd không?

Bạn chắc chắn có thể nếu nó phù hợp với nhu cầu của bạn. Tuy nhiên, nếu bạn cần kiểm soát nhiều hơn đối với dịch vụ, systemd là cách tốt nhất. Nó cho phép bạn bắt đầu các dịch vụ dựa trên các điều kiện nhất định và hoàn hảo để xử lý các tập lệnh chạy dài. Nó thậm chí còn cho phép bạn chạy các tập lệnh theo cách tương tự như crontab bằng cách sử dụng bộ hẹn giờ

Sự khác biệt giữa daemon và dịch vụ là gì?

Từ daemon xuất phát từ Dự án MAC của MIT, lần đầu tiên đặt ra thuật ngữ này vào năm 1963. Theo định nghĩa, nó là một tác nhân hoạt động không mệt mỏi trong nền. Sau đó, Windows và Linux đã sử dụng thuật ngữ này làm tên thay thế. Do đó, bài viết này sử dụng các từ daemon và dịch vụ thay thế cho nhau

Giới thiệu về tác giả

Augustas Pelakauskas

Copywriter cao cấp

Augustas Pelakauskas là một Copywriter cao cấp tại Oxylabs. Xuất thân từ nền tảng nghệ thuật, anh ấy đầu tư sâu vào nhiều dự án sáng tạo khác nhau - dự án gần đây nhất là viết lách. Sau khi kiểm tra khả năng của mình trong lĩnh vực báo chí tự do, anh chuyển sang sáng tạo nội dung công nghệ. Khi thoải mái, anh ấy thích ngoài trời đầy nắng và hoạt động giải trí tích cực. Hóa ra, chiếc xe đạp của anh ấy là người bạn thân thứ tư của anh ấy

Tất cả thông tin trên Blog Oxylabs được cung cấp trên cơ sở "nguyên trạng" và chỉ dành cho mục đích thông tin. Chúng tôi không đại diện và từ chối mọi trách nhiệm liên quan đến việc bạn sử dụng bất kỳ thông tin nào có trên Oxylabs Blog hoặc bất kỳ trang web của bên thứ ba nào có thể được liên kết trong đó. Trước khi tham gia vào các hoạt động cạo dưới bất kỳ hình thức nào, bạn nên tham khảo ý kiến ​​​​của cố vấn pháp lý của mình và đọc kỹ các điều khoản dịch vụ của trang web cụ thể hoặc nhận giấy phép cạo

Bạn có thể chạy tập lệnh Python trên trang web không?

Với PyScript, bạn có thể nhúng mã Python vào HTML hoặc liên kết tới tệp Python và mã sẽ thực thi trong trình duyệt — mà không cần chạy Python trong phần phụ trợ.

Làm cách nào để sử dụng URL trong Python?

Các bước được đánh dấu bên dưới. .
Nhập thư viện urllib
Xác định mục tiêu chính
Khai báo biến webUrl, sau đó sử dụng hàm urlopen của thư viện URL lib
URL chúng tôi sẽ truy cập là www. con trăn. tổ chức
Sau đó, chúng tôi sẽ in mã kết quả

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

Đang tìm nạp URL .
nhập urllib. yêu cầu với urllib. yêu cầu. urlopen['http. //trăn. org/'] làm phản hồi. html = phản hồi. .
nhập Shutil nhập tempfile nhập urllib. yêu cầu với urllib. yêu cầu. urlopen['http. //trăn. org/'] làm phản hồi. với tệp tạm thời. .
nhập urllib. yêu cầu req = urllib. yêu cầu

Chủ Đề