Potewoのブログ

電子工作が好きな学生の書く技術系のブログです。

Pythonistaでウェブサイト上よりZipファイルのダウンロードを自動化

url変数に入れたURLのウェブサイト上のaタグからZipファイルをダウンロードし、展開するスクリプトです。 aタグのhrefにZipファイルへのリンクが直で書かれている場合に使えます。

url変数を適宜入れ替えて使います。 DOS攻撃にならないように適当にtime.sleep()を入れてます。

筆者はこのスクリプトに対して一切責任を負いません。

この記事は書きかけです。

import requests
from bs4 import BeautifulSoup
import time
import os
import shutil
from datetime import datetime as dt

# Scrape
url = "https://example.com"

r = requests.get(url)
r.encoding = r.apparent_encoding
res = r.text
# print(res)

soup = BeautifulSoup(res, 'html.parser')

atags = soup.find_all('a')

# print(atags)

links = set()

for atag in atags:
    #print(atag)
    link = atag.get('href')
    if link:
        if link.endswith(".zip"):
            # print(link)
            links.add(link)
            
print(links)
dir_name = dt.now().strftime("%Y-%m-%d-%H-%M")
os.makedirs(dir_name + '_archive', exist_ok=True)
    
for link in links:
    filename = os.path.basename(link)
    print(f"downloading: {filename}")
    # Download
    data = requests.get(link).content
    with open(filename, 'wb') as f:
        f.write(data)
    # Unzip
    shutil.unpack_archive(filename, dir_name)
    shutil.move(filename, dir_name + "_archive")
    time.sleep(0.5)

gormで他のテーブルの情報で条件を絞り込む方法

type Note struct {
    gorm.Model
    English     string
    Japanese    string
    Description string
    Tags        []Tag
}

type Tag struct {
    gorm.Model
    NoteID uint
    Name   string
}

こんな感じの構造体でモデルを作っていたときに、TagのNameでNoteを絞り込みたかった。やり方を調べて書いてあった通りにやってみたが、うまくいかず、最終的にはサブクエリを使うことでうまくいった。SQLとGo言語にあまり詳しくないのでもっといい方法があるかもしれない。

gorm.io

func Tags(tx *gorm.DB, tags []string) *gorm.DB {
    sub := d.db.Select("note_id").Where("name in ?", tags).Table("tags")
    return tx.Where("id in (?)", sub)
}

このようなコードにすることで目的は達成できた。

一応これを使った僕のリポジトリはこちら↓

github.com

Macで透過HEVCに変換する方法

potewo.hatenablog.jp

前回、WebMに変換することでChromeFirefoxでは透過動画を再生することができるようになった。
ChromeFirefox用には単にffmpegを使うだけで済んだので良かったのですが、Safari用に変換しようとしたら午後が全部潰れたので同じようなことになる人がいないようにメモしておきます。 (Macが必要でした。)

続きを読む