質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

451閲覧

スクレイピングを実現したい。

Keiti

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/16 09:38

環境は
python3.7
jupyter notebook
windows10
になります。

from future import print_function

from bs4 import BeautifulSoup
from urllib import parse
import os
import json
import requests

SearchName = ["A","B","C","D"]

ImgNumber =100

ImgSize=(128,128)
input_shape=(128,128,3)

os.makedirs("./Original", exist_ok=True)

os.makedirs("./Face", exist_ok=True)

os.makedirs("./FaceEdited", exist_ok=True)

os.makedirs("./test", exist_ok=True)

class Google:
def init(self):
self.GOOGLE_SEARCH_URL = 'https://www.google.co.jp/search'
self.session = requests.session()
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'})

def Search(self, keyword, type='text', maximum=1000): '''Google検索''' print('Google', type.capitalize(), 'Search :', keyword) result, total = [], 0 query = self.query_gen(keyword, type) while True: html = self.session.get(next(query)).text links = self.get_links(html, type) if not len(links): print('-> No more links') break elif len(links) > maximum - total: result += links[:maximum - total] break else: result += links total += len(links) print('-> 結果', str(len(result)), 'のlinksを取得しました') return result def query_gen(self, keyword, type): '''検索クエリジェネレータ''' page = 0 while True: if type == 'text': params = parse.urlencode({ 'q': keyword, 'num': '100', 'filter': '0', 'start': str(page * 100)}) elif type == 'image': params = parse.urlencode({ 'q': keyword, 'tbm': 'isch', 'filter': '0', 'ijn': str(page)}) yield self.GOOGLE_SEARCH_URL + '?' + params page += 1 def get_links(self, html, type): '''リンク取得''' soup = BeautifulSoup(html, 'lxml') if type == 'text': elements = soup.select('.rc > .r > a') links = [e['href'] for e in elements] elif type == 'image': elements = soup.select('.rg_meta.notranslate') jsons = [json.loads(e.get_text()) for e in elements] links = [js['ou'] for js in jsons] return links

google = Google()
for name in SearchName:

ImgURLs = google.Search(name, type='image', maximum=ImgNumber) os.makedirs("./Original/"+str(name), exist_ok=True) for i,target in enumerate(ImgURLs): try: re = requests.get(target, allow_redirects=False) with open("./Original/"+str(name)+'/' + str(i)+'.jpg', 'wb') as f: f.write(re.content) except requests.exceptions.ConnectionError: continue except UnicodeEncodeError: continue except UnicodeError: continue except IsADirectoryError: continue

print("保存完了しました")

スクレイピングを行うためにこちらのコードを実行したところ、実行には成功するのですが、リンクが得られず画像を保存することが出来ません。
何故なのか教えていただけませんか。以下が試行結果になります。

Google Image Search : A
-> No more links
-> 結果 0 のlinksを取得しました
Google Image Search : B
-> No more links
-> 結果 0 のlinksを取得しました
Google Image Search : C
-> No more links
-> 結果 0 のlinksを取得しました
Google Image Search : D
-> No more links
-> 結果 0 のlinksを取得しました
保存完了しました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2020/07/16 09:44

Googleは規約でスクレイピングが禁止されていたと思うのですが、大丈夫でしょうか?
Keiti

2020/07/16 11:20

そうなんですね!まずいことをしました。スクレイピングをできないように規制されているんですか?コード自体に問題はありますかね?
can110

2020/07/16 11:30

一般的に外部サイトをスクレイピングをするさいには、そのサイトの利用規約を確認するべきです。禁止されていることも多いので。 コードはインデントが消えて読めなくなっているので確認していません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問