Wayback Machine (Archive.org) API با پایتون

در این آموزش، شما یاد خواهید گرفت که چگونه API ماشین بازگشتی را با پایتون به منظور بازیابی HTML برای یک دامنه خاص واکشی کنید.

وارد کردن کتابخانه های پایتون مربوطه

در این آموزش از کتابخانه pandas و همچنین درخواست ها و کتابخانه زمان استفاده می کنیم تا در صورت بروز خطا سرعت خزیدن را کاهش دهیم.

import pandas
import time
import requests

اگر چند کتابخانه از دست رفته دارید از نصب pip استفاده کنید.

pip3 install requests pandas

تاریخچه یک دامنه را واکشی کنید

API archive.org دارای یک نقطه پایانی cdx جستجو برای واکشی همه آدرس‌های اینترنتی برای یک دامنه است.

شما می توانید با هر دامنه ای که می خواهید به آن نگاه کنید جایگزین کنید. پارامتر حد به شما امکان می دهد تعداد نتایج را برای دامنه های بزرگ کاهش دهید.

http://web.archive.org/cdx/search/cdx?url=jcchouinard.com*&output=json&limit=100

در پایتون به این شکل است.

domain = 'jcchouinard.com'

# Get all history for a domain
# Add &limit parameter if you work with a large site
all_history_endpoint = f'http://web.archive.org/cdx/search/cdx?url={domain}*&output=json'
r = requests.get(all_history_endpoint)
urls = r.json()

همه صفحات HTML معتبر را دریافت کنید

در حال حاضر، ماشین برگشت ممکن است صفحاتی را که HTML نیستند یا حتی صفحاتی را که خطا برمی‌گردانند واکشی کند. ما می خواهیم نتایج را به صفحات معتبر محدود کنیم. همچنین همان صفحه را در مقاطع مختلف زمانی واکشی می کند.

ما یک Pandas DataFrame ایجاد خواهیم کرد که فقط حاوی آخرین نسخه معتبر html ذخیره شده باشد. همچنین می‌توانید درک فهرست زیر را طوری تطبیق دهید که فقط URLهایی را اضافه کنید که از یک الگوی URL خاص پیروی می‌کنند.

# Keep only HTML with status code 200
urls = [
    (u[2].replace(':80','').replace('http:', 'https:'), u[1]) 
    for u in urls 
    if u[3] == 'text/html' and u[4] == '200'
    ]

# Create a dataframe with the last screenshot's timestamp
# Drop all other "duplicate" URLs
df = pd.DataFrame(urls[1:], columns=['url','timestamp'])\
    .sort_values(by='timestamp', ascending=False)\
        .drop_duplicates(subset='url')\
            .reset_index(drop=True)

هر URL مرتبط را با Archive.org API واکشی کنید

اکنون، باید صفحه را با درخواست‌هایی برای دریافت اسکرین شات HTML واقعی برای هر URL واکشی کنید.

در اینجا کد پایتون با محافظت ساده وجود دارد.

در اینجا ما از طریق هر ردیف حلقه می زنیم، صفحه را واکشی می کنیم، HTML را دریافت می کنیم و در یک فرهنگ لغت ساده ذخیره می کنیم.

results = {}

for i in range(len(df)):
    url, timestamp = df.loc[i]
    print('fetching:', url)
    wayback_url = f'http://web.archive.org/web/{timestamp}/{url}'
    try:
        html = requests.get(wayback_url)
        if html.status_code == 200:
            results[url] = {
                'wayback_url':wayback_url,
                'html': html.text,
                'status_code': html.status_code
            }
        else:
            results[url] = {
                'wayback_url':wayback_url,
                'html': 'status_code_error',
                'status_code': html.status_code
            }
    except requests.exceptions.ConnectionError:
        results[url] = {
                'wayback_url':wayback_url,
                'html': 'request_error',
                'exception': 'Connection refused',
            }
        print('too many tries, sleeping for 10s...')
        time.sleep(10)

کد کامل

import pandas as pd
import time 
import requests 

domain = 'jcchouinard.com'

# Get all history for a domain
# Add &limit parameter if you work with a large site
all_history_endpoint = f'http://web.archive.org/cdx/search/cdx?url={domain}*&output=json'
r = requests.get(all_history_endpoint)
urls = r.json()

# Keep only HTML with status code 200
urls = [
    (u[2].replace(':80','').replace('http:', 'https:'), u[1]) 
    for u in urls 
    if u[3] == 'text/html' and u[4] == '200'
    ]

# Create a dataframe with the last screenshot's timestamp
# Drop all other "duplicate" URLs
df = pd.DataFrame(urls[1:], columns=['url','timestamp'])\
    .sort_values(by='timestamp', ascending=False)\
        .drop_duplicates(subset='url')\
            .reset_index(drop=True)

results = {}

for i in range(len(df)):
    url, timestamp = df.loc[i]
    print('fetching:', url)
    wayback_url = f'http://web.archive.org/web/{timestamp}/{url}'
    try:
        html = requests.get(wayback_url)
        if html.status_code == 200:
            results[url] = {
                'wayback_url':wayback_url,
                'html': html.text,
                'status_code': html.status_code
            }
        else:
            results[url] = {
                'wayback_url':wayback_url,
                'html': 'status_code_error',
                'status_code': html.status_code
            }
    except requests.exceptions.ConnectionError:
        results[url] = {
                'wayback_url':wayback_url,
                'html': 'request_error',
                'exception': 'Connection refused',
            }
        print('too many tries, sleeping for 10s...')
        time.sleep(10)

Source link