01/10/2018, 09:54

Encode URL, chuyển url thành file name, đọc được trên Linux và windows

Mình muốn lưu nội dung một trang web vào một file có tên là URL của chính trang web đó.
Yêu cầu là tên file đọc đươc cả trên windows và Linux.
Một số vấn đề như sau:

  • ký tụ maximum trong windows là 255 trong khi URL trên trình duyệt cho phép đến 2000
  • Hạn chế một số ký tự đặt biệt khi đăt tên file và thư mục của 1 số OS. (ví dụ #{ơ|ế$&@ v.v)
  • tên file có thể đọc được bởi người dùng. (Bởi vì hiện tại mình đang dùng base64 để encode url, chính vì lý do không thể đọc được tên file bằng mắt nên mình mới làm lại)

Mình có functions như thế này

save_url(path_to_folder, url, content_of_url)
read_url(path_to_folder, url)

Mình cần 1 module cho phép chuyển đổi từ filename sang url và url sang filename, bijective, có nghĩa là cho phép chuyển đổi 2 chiều

url == filename2url(url2filename(url))
True

Mình đang hướng đến percent encode và cắt url thành nhiều thư mục.

Nếu ai có ý tưởng hay hơn hoặc có kinh nghiệm về vấn đề này thì giúp mình với.
Mình code bằng python, nhưng nếu mọi người có code hoặc thuật toán của ngôn ngũ khác thì cũng được.
Có 1 phần mềm HTTRACK có thể đã giải quyết tốt vấn đề này, nhưng mình không có thời gian để đọc hết code sources của nó. Bởi vì phần chuyển đổi tên chỉ là 1 phần rất nhỏ của httrack, nếu ai biết họ làm như thế nào và chỉ cho mình thì mình rất cảm ơn.

Dark.Hades viết 11:56 ngày 01/10/2018

Ý tưởng của mình:
Tạo 1 file dạng .info, trong đó lưu info của url dạng json,… gì đó mà bạn cảm thấy hợp lí, rồi khi ứng dụng đọc thì duyệt file này để lấy thông tin
2. Chia thành thư mục như httrack…

NG viết 11:56 ngày 01/10/2018

Không phải vấn đề của dạng file hay lưu trữ mà là tên file bạn ơi.

Đào An viết 12:00 ngày 01/10/2018

Sao ko lưu vào database, 1 cột là url, 1 cột là source code vừa đọc được url vừa đọc được source
Dùng sqlite thì cài http://sqlitebrowser.org/ là đọc được

NG viết 12:03 ngày 01/10/2018

Đây là 1 project cho nhiều bộ phận và thành phần, mỗi nơi có OS và code riêng của mình, nên không dùng database được. Lấy ví dụ mình kéo nội dung 1 trang web về, mình xài python, linux nhưng bên sử dụng thì xài windows và C. Nếu như mình dùng database để lưu thì bên sử dụng sẽ rất bị động, bởi vì họ phải cần cấu trúc database của mình và phải cài database tương ứng. đây là vấn đề hiệu suất.
p/s
Thêm nũa là có thể sử dụng bằng tay, lấy ví dụ người kia cần mở trang daynhauhoc.com thì chỉ cần mở thư mục mình đua và double click vào file tương úng là đc. đó là vấn đề tại sao mình cần tên file có thể đọc hiểu đc bằng mắt thường

Đào An viết 12:07 ngày 01/10/2018

Thấy google cloud, google driver cho lưu trên file có ký tự đặc biệt , b thử xem sao nhé.

NG viết 12:07 ngày 01/10/2018

Cám ơn bạn nhưng vì lý do an toàn, công ty có mạng nội bộ và server riêng, không xài clouds của mà cung cấp khác. Cái nũa là lưu trữ đa số là local, và mình phải bảo đảm tên file có thể đc chấp nhận trên mọi hệ thống.

Thành Phạm viết 11:57 ngày 01/10/2018

Kiểu này được không? Ví dụ load trang này về

https://daynhauhoc.com/t/encode-url-chuyen-url-thanh-file-name-doc-duoc-tren-linux-va-windows/47492

Thì để vào 1 thư mục có tên là:

https___daynhauhoc_com_t_encode-url-chuyen-url-thanh-file-name-doc-duoc-tren-linux-va-windows_47492

(Kiểu replace hết kí tự lạ thành _)

Trong thư mục đó có 1 file là data chứa nội dung của trang web và 1 file text, tên là url.txt chứa nội dung:

https://daynhauhoc.com/t/encode-url-chuyen-url-thanh-file-name-doc-duoc-tren-linux-va-windows/47492

Như vậy filename2url với url2filename thì chỉ cần dựa vào tên thư mục với file url.txt trong thư mục đó là được

Dark.Hades viết 11:57 ngày 01/10/2018

Cách này của bạn chỉ hiệu quả với file có độ dài dưới 255 kí tự thôi.

List max-length cho file name với từng cấu trúc:

BTRFS   255 bytes
exFAT   255 UTF-16 characters
ext2    255 bytes
ext3    255 bytes
ext3cow 255 bytes
ext4    255 bytes
FAT32   8.3 (255 UCS-2 code units with VFAT LFNs)
NTFS    255 characters
XFS     255 bytes
Thành Phạm viết 11:54 ngày 01/10/2018

:V dài quá thì cắt đi, link thật nằm trong file url.txt mà

Dark.Hades viết 12:04 ngày 01/10/2018

#2 mình cũng khuyên thớt tạo 1 file dạng .info như bạn để lưu thông tin đầy đủ của file đó (dạng json) nhưng thớt bảo không hợp lí rồi.

Còn cắt link thì lại không hợp lí, nếu link bị cắt nó gồm nhiều link con thì sao, lại phải thêm _1, _2,…, không khác gì để nguyên mã hóa base64.

Với bài toán này thực sự thớt nếu không dùng cách mã hóa url thành SHA1 or MD5 or mã băm, sau đó lưu vào file dạng database thì không thể giải được rồi

NG viết 11:55 ngày 01/10/2018

@thanhmssl10 Chuyện ký tự đặc biệt mình sẽ dùng percent encode để giải quyết, lấy ví dụ chuyển ‘/’ thành %2F
vấn đề cần giải quyết tiếp theo là độ dài < 255, có lẽ mình sẽ cắt đường link thành nhiều thư mục con.
Cắt link cũng tốt, để prefix là tên 1 thư mục, đoạn còn lại là file chứa dữ liệu, cái này giải quyết dc nhiều link con có cùng prefix.

https://
  |_daynhauhoc.com/
  |        |_t/
  |        |    |_encode-url-chuyen-url-thanh-file-name-doc-duoc-tren-linux-va-windows
  |        |    |              |_47492.txt
  |        |    |_ ...

Nếu tên thư mục dài quá 255 thì mình sẽ cắt bớt tạo thêm 1 thư mục.
Mình không muốn lưu url hay data trên bất kỳ file nào khác, vì mình chỉ muốn đọc file 1 lân thôi. Có nghĩa là xử lý từ string url để cho ra đường dẫn tới file mà không cần đọc bất kỳ file dữ liệu nào khác.

NG viết 11:59 ngày 01/10/2018

Đi ngang quăng cái project đã hoàn thành sơ bộ vào, cảm ơn mọi người cho ý kiến.

GitHub

hailuan/urlquote

urlquote - transform a url to a file path and upside down


3 def sử dụng chính:

urlquote.url2filename
urlquote.filename2url
urlquote.percent_quote

filename là local nhé.
doctest mình chỉ create cho Linux

Vô Thin viết 12:08 ngày 01/10/2018

Chuyển URL thành file name không có ý nghĩa gì hết, ở người có thể đọc được càng buồn cười hơn. Lý do là vì không phải địa chỉ trang web nào cũng đọc được, có đến 50% trang web có địa chỉ URL là không đẹp như các ví dụ bàn nãy giờ, chưa kể những URL chỉ có đúng tên miền do trang đó dùng Ajax.

Mà nói thật là địa chỉ URL nó dài kinh dị luôn, trong khi đó hơn 7 cấp thư mục là Windows bó tay, rồi còn phải xử lý việc URL nó đã sẵn ở dạng “giun dế” thì cũng hết đọc luôn.

Do vậy, cách làm là tạo ra các file .html và tên file là tiêu đề của trang web. Ví dụ luôn cho topic này thì sẽ có file là “Encode URL chuyển url thành file name đọc được trên Linux và Windows.html”, những ký tự nào hệ điều hành không cho phép (nếu có) trong tiêu đề thì sẽ thay bằng ký tự dấu trừ hay khoảng trắng gì đó người vẫn đọc được mà hệ điều hành cũng không… la làng.

Rồi sao? Nội dung file HTML đó chính là nội dung trang web mà ta lấy về. Chèn thêm lên đầu trang đó một đoạn:

<h1>Xem nội dung gốc click <a href="URL của trang web save về">vào đây</a></h1>

Làm vậy dễ hơn. Còn các bộ phận khác không phải mở thủ công mà lập trình thì họ cũng chỉ “bóc tách” lấy mỗi URL ở đầu trang.

Việc save URL thành tên file gần như không khả thi bởi vì có nhiều ký tự hệ đều hành không chấp nhận, chưa kể URL ngày nay có dạng biến hóa, nhìn vô thấy không giống nhưng hóa ra nó lại giống hoặc nhìn vô khác nhưng nội dung hoàn toàn giống. Cách tiếp cận vấn đề nên theo cách khác thay vì khăng khăng, nó sẽ mất thời gia và bí đường.

NG viết 12:04 ngày 01/10/2018

Không có gì là buồn cười hết thưa anh !
Mỗi một yêu cầu đều có ý nghĩa của nó hết.
Tôi có một hàm get = requests.get
Tôi muốn hạn chế tải nhiều lần 1 nội dung của 1 url

try:
    get_from_my_store(url2filename(url))
except FileNotExistError:
    get(url)

ít nhất khi nhìn cái file name, người đọc có thể hình dung được cái url ban đầu; chứ không phải là muốn người đọc và hiểu. Hết

Bài liên quan
0