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

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

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

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

Q&A

解決済

1回答

761閲覧

[python3]webスクレイピングで特定の文字列をURLから検索

kachan777

総合スコア16

Python 3.x

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

0グッド

3クリップ

投稿2018/03/21 09:12

お世話になります。

pythonでwebスクレイピングをしたいのですが、以下の条件が必要となっています。

  • 任意のURL(Aとする)と、特定の文字列(Bとする)を指定して実行
  • Aを起点としてURLを辿り、Bの文字列が出現されるURLまで最も短時間に検索
  • 検索結果のURL経路を出力する

BeautifulSoupを使用しているのですが、リンク先を再帰的に辿りながら、
効率的に検索していく方法がうまく見つけられず困っております。

アドバイス頂けましたら幸いです。
宜しくお願い致します。

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

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

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

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

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

KojiDoi

2018/03/21 13:59

どうしてもpythonでないといけないのでしょうか。こういう処理だとwgetとgrepを使うのがはるかに簡単確実(二行で実現可能)に思えます。
kachan777

2018/03/22 02:46

たしかに、pythonにこだわる必要もないかもしれません。wgetでも検討してみたいとおもいます。
guest

回答1

0

ベストアンサー

Webページをリンクをたどりながら検索する場合、深さ優先探索してしまうと終わりが見えないので、幅優先探索を方針とすると思います。再帰呼び出しでも書けますがFIFO(first in first out:所謂キュー)を使うと単純なループでも書けます。標準モジュールにqueueがあるのでそれを使ってもよいですが、listでもまぁ書けそうです。

大雑把な構造はこんな雰囲気でどうでしょう。(動かしてないのでおかしな点があったらご容赦)

Python

1visited = set() 2q = [ ['最初のurl'] ] 3 4while len(q) > 0: 5 url_path = q.pop(0) 6 url = url_path[-1] 7 html = urlのコンテントをgetする 8 if htmlに目的の文字列が含まれている: 9 print(url_path) 10 break 11 urls = htmlの中に含まれる外部リンク(url)のリスト 12 for url in urls: 13 if url not in visited: 14 # 未検索のurlをキューへ追加 15 visited.add(url) 16 q.append(url_path + [url])

実際の検索では

  • 特定のドメイン内だけ
  • リンクの深さを一定以内に

などの条件を付けたくなると思いますが、それは「キューへ追加」する際に配慮すればよいと思います。

投稿2018/03/21 10:45

編集2018/03/22 02:49
KSwordOfHaste

総合スコア18394

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

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

kachan777

2018/03/22 02:45

アドバイスありがとうございます! 大変勉強になります、試してみようと思います。
KSwordOfHaste

2018/03/22 02:50

url not in dictなんて意味不明な行がありました。url not in visitedの誤りでしたので訂正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問