Bạn đang gặp khó khăn khi tải và lưu file PDF từ website bằng thư viện scrapling trong Python? Bài viết này sẽ hướng dẫn bạn từng bước, giúp bạn khắc phục các lỗi thường gặp và đảm bảo file PDF được lưu trữ chính xác trên máy tính của bạn. Chúng ta sẽ cùng tìm hiểu cách xử lý vấn đề mã hóa phổ biến và đảm bảo tính toàn vẹn của file PDF sau khi tải về.
Một vấn đề thường gặp khi sử dụng scrapling để tải file PDF là file được lưu trữ bị lỗi, không thể mở được hoặc hiển thị nội dung không chính xác. Điều này thường xảy ra do cách scrapling xử lý dữ liệu trả về từ website. Theo mặc định, page.body trả về một chuỗi (string), trong khi file PDF cần được lưu dưới dạng byte.
Hãy xem xét đoạn code ban đầu thường gây ra lỗi:
from scrapling.fetchers import Fetcher
url = 'https://www.website.com/document'
page = Fetcher.get(url, stealthy_headers=True, follow_redirects=True)
print(page.body)
with open('file.pdf', 'wb') as f:
f.write(page.body)
Đoạn code này có thể không hoạt động đúng vì page.body trả về một chuỗi, và việc ghi trực tiếp chuỗi này vào file ở chế độ 'wb' (write binary) sẽ dẫn đến file PDF bị hỏng.
Để khắc phục vấn đề này, chúng ta cần chuyển đổi chuỗi trả về từ page.body sang dạng byte trước khi ghi vào file. Một phương pháp hiệu quả là sử dụng mã hóa 'latin1'. Mã hóa 'latin1' đảm bảo rằng mỗi ký tự trong chuỗi được ánh xạ trực tiếp đến một byte, giữ nguyên dữ liệu gốc mà không bị thay đổi.
Đây là đoạn code đã được sửa đổi:
from scrapling.fetchers import Fetcher
url = 'https://www.website.com/document'
page = Fetcher.get(url, stealthy_headers=True, follow_redirects=True)
# Nếu body là string, chuyển đổi sang bytes sử dụng mã hóa latin1
if isinstance(page.body, str):
# Giữ nguyên giá trị byte không thay đổi
body_bytes = page.body.encode('latin1')
else:
body_bytes = page.body
with open('file.pdf', 'wb') as file:
file.write(body_bytes)
Trong đoạn code này, chúng ta kiểm tra xem page.body có phải là một chuỗi hay không. Nếu đúng, chúng ta sử dụng .encode('latin1') để chuyển đổi nó thành một chuỗi byte. Nếu không, chúng ta sử dụng trực tiếp page.body (giả sử nó đã là byte). Sau đó, chúng ta ghi chuỗi byte này vào file PDF.
Mã hóa 'latin1' (còn được gọi là ISO-8859-1) là một bảng mã ký tự đơn giản, ánh xạ mỗi ký tự tới một byte duy nhất. Điều này rất quan trọng vì nó đảm bảo rằng dữ liệu byte gốc từ response không bị thay đổi hoặc mất mát trong quá trình chuyển đổi. Các mã hóa khác, như 'utf-8', có thể thay đổi giá trị của một số byte, dẫn đến file PDF bị hỏng.
Ví dụ, nếu một byte có giá trị 200 (trong khoảng 0-255), 'latin1' sẽ giữ nguyên giá trị này. Trong khi đó, 'utf-8' có thể mã hóa nó thành một chuỗi byte khác, làm thay đổi nội dung của file.
pip install scrapling
Giả sử bạn muốn tải file PDF từ URL "https://www.example.com/sample.pdf". Bạn có thể sử dụng đoạn code sau:
from scrapling.fetchers import Fetcher
url = 'https://www.example.com/sample.pdf'
page = Fetcher.get(url, stealthy_headers=True, follow_redirects=True)
if isinstance(page.body, str):
body_bytes = page.body.encode('latin1')
else:
body_bytes = page.body
with open('sample.pdf', 'wb') as file:
file.write(body_bytes)
print("File PDF đã được tải và lưu thành công!")
Việc tải và lưu file PDF từ website bằng scrapling trong Python có thể gặp một số khó khăn do vấn đề mã hóa. Tuy nhiên, bằng cách chuyển đổi dữ liệu trả về từ chuỗi sang byte sử dụng mã hóa 'latin1', bạn có thể dễ dàng khắc phục vấn đề này và đảm bảo file PDF được lưu trữ chính xác. Hy vọng hướng dẫn này sẽ giúp bạn thực hiện công việc một cách hiệu quả hơn.
Bài viết liên quan