クソマミレンの愚痴

30超え職歴なし長期引きこもり明けのダメ人間がクソ記事を量産

2020年02月27日クソ散歩 ~8時間以上プログラミング~

f:id:kusomamiren:20200227220901p:plain

久々のはてな記法

・プログラミング


(↓↓↓朝書いたやつ)

import urllib
from urllib.request import urlopen
from bs4 import BeautifulSoup

gazo = '広瀬すず'
quote = urllib.parse.quote(gazo)

html = urllib.request.urlopen('https://search.kinza.jp/img/?q=' + quote + '+&fr=newtab')
soup = BeautifulSoup(html, 'lxml')
p = soup.find_all("div", attrs={"class": "img_url hid"})
for i in p:
print("{}".format(i.string))

昨日のやつを改造してgazoの中身が日本語でもいけるようになった。

「gazo」の中に入ってる”広瀬すず”を「urllib.parse.quote」という部品で「URLエンコード」という処理をして"%E5%BA%83%E7%80%AC%E3%81%99%E3%81%9A"にして「'https://search.kinza.jp/img/?q=' + quote + '+&fr=newtab'」のquote部分に入れることでエラーはなくなった。

上でいうquoteの部分に入ってる日本語はそのままではどうやらだめらしい、いろいろ調べたところどうも%を含む英数字の形(URLエンコーディング(パーセントエンコーディングともいうらしい))に変換すればいけるだろうとは思っていた。

昨日は映画見ながらその方法について調べていたができなかった(文字列の最後に.encodeなんちゃらとかつけてもだめだった)。

でも今日朝起きて「URLエンコード python」で検索したらpythonのモジュールがヒット。あ、そうだ自分でできないなら誰かが作ったpythonのモジュール使えばいいじゃんとなり目的達成(すでにガッツリ使ってるけど発想的な意味で)。

でもどうやってやってるんだろう?と中身を知りたくなるもののドツボに嵌りそうなんでやめとこう。


(↓↓↓それから8時間くらいやってかたちにはできた)

import os
import urllib
from urllib.request import urlopen
from bs4 import BeautifulSoup

#ローカルの保存先
dst_dir = r'C:\Users\Administrator\Desktop\sf2'

#空のリストを作る
list = []

#検索する用語
gazo = '広瀬すず'
#日本語でもエラーが起きないようにする
quote = urllib.parse.quote(gazo)
html = urllib.request.urlopen('https://search.kinza.jp/img/?q=' + quote + '+&fr=newtab')
#BeautifulSoupで解析
soup = BeautifulSoup(html, 'lxml')
#Pには分析結果が入ってる
p = soup.find_all("div", attrs={"class": "img_url hid"})

 

#ローカルにダウンロードするためのもの、ネットからの拾い物
def download_file(url, dst_path):
try:
#URL開く
with urllib.request.urlopen(url) as web_file:
#dataに読みとったものを入れとく
data = web_file.read()
#書く
with open(dst_path, mode='wb') as local_file:
local_file.write(data)
except urllib.error.URLError as e:
print(e)

#ローカルにダウンロードするためのもの、ディレクトリを指定する、ネットからの拾い物
def download_file_to_dir(url, dst_dir):
#パスをつなげてダウンロード先を指定するらしい?
download_file(url, os.path.join(dst_dir, os.path.basename(url)))




#URLの末尾が拡張子じゃないURLだとエラーが起きるので妥協してURLの末尾が.jpgのやつだけのリストを作る
for o in p:
#余計なHTMLタグを消す
i = o.string
#print(i)
if i.endswith(".jpg"):
list.append(i)

#さっきのリストから一つずつ要素を抜き出して↑で定義した関数に入れる
for u in list:
#print(u)
url = u
download_file_to_dir(url, dst_dir)


機能は、

kinzaの画像検索ページ?の1ページ目が対象でURLの末尾が.jpgのやつだけダウンロードをする。

やろうと思えば2ページ以降もいけそうだからめちゃめちゃ大量の広瀬すずの画像をダウンロードすることもできそうだ。

やってないけど本当はサーバーに負担をかけるからtimeモジュールでダウンロード間隔をやらないといけないらしい。
エラー祭り、ググり祭りで8時間以上にらめっこしていた。
RPGでなかなか勝てないボスを倒すためにあれこれ試行錯誤する感覚に似ているかもしれない。
あと正規表現使えればなぁと思った。文字関係に対して何かと便利らしいし。

これから散歩にでも行こうかな。

以上
1年前
kusomamiren.hatenablog.com