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言語にあまり詳しくないのでもっといい方法があるかもしれない。
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) }
このようなコードにすることで目的は達成できた。
一応これを使った僕のリポジトリはこちら↓