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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

3404閲覧

スクレイピングのコードでURLを取得する方法。

Egoil

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2018/10/27 13:43

編集2018/10/27 13:50

スクレイピングのコードを書いていたら途中で詰まってしまいました。

childに何も格納されていないのでそこが原因かと思いますが、hrefの属性指定してURLを格納するようにgetメソッドを書いたのに何故だ。。。と混乱しております。
解答よろしくお願いします。

Python

1#coding:utf-8 2 3import os 4from bs4 import BeautifulSoup 5import requests 6 7from PIL import Image 8import matplotlib.pyplot as plt 9import numpy as np 10 11import time 12 13from urllib import request 14 15import random 16 17def make_randname(): 18 source_str = '#$%&0123456789abcdefghijklmnopqrstuvwxyz' 19 random.choice(source_str) #a〜zでランダムに1文字 20 name = "".join([random.choice(source_str) for x in range(20)]) 21 return name + ".jpg" 22 23 24def getimg(link): 25 opener=request.build_opener() 26 opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')] 27 request.install_opener(opener) 28 # リンク先(一覧から一回飛んだページ)のContent-Body を取得する 29 print("anal") 30 response = requests.get(link) 31 body = response.content 32 soup = BeautifulSoup(body,"lxml") 33 a_tags = soup.find_all("a", target="_blank") 34 for a_tag in a_tags: 35 try: 36 src = a_tag["href"] 37 name = src.split("/")[-1] 38 if name.find(".jpg") < 0: break 39 name = make_randname() 40 request.urlretrieve(src, "./eroimages/"+name) 41 print("[success]: {}".format(name)) 42 time.sleep(0.05) 43 except: 44 print("[failed]: {}".format(name)) 45 46def geturl(link): 47 print("###############################################") 48 #print("Page: {}".format(i)) 49 # リンク先(一覧から一回飛んだページ)のBodyを取得する 50 aponse = requests.get(link) 51 52 # HTML をパースする 53 soup = BeautifulSoup(aponse.text, "lxml") 54 links = soup.find_all('a') 55 #print(links+"\n") 56 for link in links: 57 #title = link.find("strong") 58 child = link.get("href") 59 print("-----------------------------------------------") 60 #print("Title: {}".format(title.string)) 61 print(child) 62 getimg(child) 63 64def main(): 65 if not os.path.exists("./eroimages"): 66 os.mkdir("./eroimages") 67 for i in range(1,2): 68 link = "http://hnalady.com/page-{}.html".format(i) 69 geturl(link) 70 71if __name__ == "__main__": 72 main()

スクレイピング先のHTMLソースは
view-source:http://hnalady.com/page-0.html
です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

画像をダウンロードするのが目的であれば、img タグの src 属性を探せばいいかと思います。

以下、サンプルコードを貼ります。

python

1import os 2import random 3import string 4import time 5import requests 6from urllib.parse import urlparse 7 8from bs4 import BeautifulSoup 9 10 11def make_randname(): 12 letters = string.ascii_uppercase + string.digits 13 return ''.join([random.choice(letters) for x in range(20)]) 14 15 16def get_img(url): 17 print('fetching images from {}'.format(url)) 18 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36'} 19 res = requests.get(url, headers=headers) # 子ページを取得する。 20 soup = BeautifulSoup(res.text, 'lxml') 21 22 # img タグを探して、ダウンロードする。 23 for img_tag in soup.find_all('img', src=True): 24 img_url = img_tag['src'] 25 print('downlaoding image... ', img_url) 26 27 parsed_url = urlparse(img_url) 28 ext = os.path.splitext(parsed_url.path)[1] # 拡張子抽出 29 save_path = os.path.join('images', '{basename}{ext}'.format( 30 basename=make_randname(), ext=ext)) 31 32 # 画像をダウンロードして、保存する。 33 img = requests.get(img_url).content 34 with open(save_path, 'wb') as f: 35 f.write(img) 36 print('image saved ', save_path) 37 38 time.sleep(0.5) # 画像取得間隔 39 40 41def get_url(url): 42 print('fetching html... ', url) 43 res = requests.get(url) 44 soup = BeautifulSoup(res.text, 'lxml') 45 46 for a_tag in soup.findAll('a', href=True): 47 get_img(a_tag['href']) 48 time.sleep(1) # 子ページへのアクセス間隔 49 50 51def main(): 52 os.makedirs('images', exist_ok=True) 53 for i in range(1, 2): 54 url = 'http://hnalady.com/page-{}.html'.format(i) 55 get_url(url) 56 57 58if __name__ == '__main__': 59 main()

投稿2018/10/27 14:25

tiitoi

総合スコア21956

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

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

Egoil

2018/10/29 08:50

hrefでURLを取るよりもsrcでとったほうがいいということでしょうか?
tiitoi

2018/10/29 09:08 編集

質問欄のコードを拝見したところ、子ページの一覧を取得して、アクセスする→子ページの画像をまとめて保存する」となっていたので、まず soup.findAll('a', href=True) でリンク一覧を抽出してその各ページにアクセスし、soup.find_all('img', src=True) で画像一覧を取得するようにしています。 リンク一覧をとるなら、仰る通り a タグの href をとればよいです。 画像のリンクをとるなら、img タグの src をとればよいです。
Egoil

2018/10/29 10:48 編集

なるほど!そういう事ですか。 すみません、僕のコード、childにURLが格納されなかったんですけど何か理由とかお分かりだったりしますか。。?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問