Help us understand the problem. What is going on with this article?

Selenium+bs4+requestsで自動画像収集&自動ページ遷移inPython3

More than 1 year has passed since last update.

概要

実行環境は


OS:Windows10 Pro
Python:3.6.5
使用ブラウザ:Google Chrome
エディタ:Vim
パッケージ管理:pip

数日前、
Python3+Beautifulsoup+Requestsで画像収集&クエリーパラメータ操作という記事を作りました。

内容は

- URL入力するとページ内の画像一括ダウンロード出来るよ
- クエリー文字列も操作できるようにしてみたよ

というものでした。

完成したのはめちゃくちゃ嬉しかったんですけど、

どうせならSelenium使ってページ遷移出来たらよくね?


着手

無題.png

こんな感じの階層で作っております。

Pythonの他ファイルのインポートよくわからなかったから勉強も兼ねてこうしてみました。

私も初心者の方と同じく

文法覚えてもどうすればモノが作れるんじゃ!と思ってる側の人間なので、

どういう流れで完成したのかを簡単に説明します。コード見せてから。

まずは本体のsel.py

sel.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import seluse
from seluse import for_sel_crawl
from bs4 import BeautifulSoup
import requests
import os
import sys
from time import sleep
import time
from datetime import datetime

url = seluse.get_url()

driver = webdriver.Chrome()
driver.get(url)

element = driver.find_element_by_name("search")

keyword = seluse.get_keyword()
element.send_keys(keyword)

element.submit()

flg = 1
cnt = 1
base_url = driver.current_url
while(flg == 1):
    for_sel_crawl.download_site_images(url,'img/')
    cnt += 1
    url = f'{base_url}&page={cnt}'
    try:
        driver.get(url)
    except:
        flg = 0



正直反省点の1つ目
import文多い割にいらないのある。

これはいずれ上達した時に見て恥ずかしがる為に残しておきましょう。

今回は、Wallpaper Abyssという壁紙が置いてあるサイトで実験しました。

フローは、

URLの入力を受け付ける(サイトのトップページ)

ChromeのWebDriverを開く

入力されたURLでGETリクエストを送信

壁紙検索ボックスの要素を特定する(GoogleChromeのデベロッパーツールで予め知っておきます)

特定された場所に入力するkeywordを受け付けるロジック

キーワードを元にフォームに入力

submit()で、type属性がsubmitのものを自動的に認識してクリックする

1ページ目のURLが(https://wall.alphacoders.com/search.php?) と
pageを入力しなくていいことを逆手にとってbase_urlに代入

前回のようにダウンロード

URLにGETリクエスト送って例外(URLが無い=次のページが無い)が起きるまでループ

という流れですね。

では、seluseパッケージ内のモジュールも見ていこう。

__init__.py
def get_url():
    response = input("plz paste the url what you want to crawl\n")
    return response

def get_keyword():
    keyword = input("plz input the keyword what you want to search\n")
    keyword.replace(" ","+")
    return keyword

for_sel_crawl.py

import requests
from bs4 import BeautifulSoup
from datetime import datetime
import time
import os
import sys
from time import sleep

def download_site_images(url,path):
    images = []

    url = requests.get(url)

    soup = BeautifulSoup(url.content,'lxml')

    for link in soup.find_all("img"):
        src = link.get("src")

        if 'jpg' in src:
            images.append(src)
        elif 'png' in src:
            images.append(src)
        elif 'gif' in src:
            images.append(src)

    for image in images:
        re = requests.get(image)
        print('Downloading:',image)
        with open(path + image.split('/')[-1],'wb') as f:
            f.write(re.content)



import文が相変わらず使われてないものまである
前回の記事のコードを改変したからだけども。

全体的に前回よりかなり簡素な作りになっているのに、
良い機能が作れて満足。
現在日付のディレクトリ機能つけっぱにしたかったけどエラーの嵐で諦めた

参考にしたもの

みんなのPython 第4版
Selenium Python Bindings

今回一番嬉しいのが、
何も頼りにしてないって事。
公式ドキュメントみてSeleniumの使い方を知った以外、
誰のロジックも参考にしてないし完全に自分で考えて作れたのが本当に嬉しかった。

使いたい方

正直最低限の機能が完成した時点で上げてるので、多分すぐエラー出ます。
それでも使いたい方は、

  • 検索ボックスのname属性
  • base_urlとか、クエリー操作の値

を、
ご自身が収集したい画像サイトの値に適宜変更していただければ使えると思います。

製作時間が二時間ぐらいの、
Python歴1ヶ月:プログラミング歴4ヶ月のコードで良ければ是非使ってやって下さい。

最後に

Python今めちゃくちゃ人気なので、沢山の方がみんなのPythonに取り組んでると思いますが
その本をきちんとやればこんぐらいの事が出来るようになる

=みんなのPython最高

ってことを覚えていただければ。

一緒に頑張りましょう!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away