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

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

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

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

Q&A

3回答

4695閲覧

Python スクレイピングを拒否したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

3クリップ

投稿2019/07/25 03:12

スクレイピングをする時に以下のように
セキュリティ権限拒否ではじかれてできないURLが中にはあります。

私もサイトを運営しているのですが
サーバー上にどのファイル構成のパーミッションを変更すると
このようにスクレイピングできないディレクトリ構成となるのでしょうか?
ブラウザだと見れてPythonだと見れないというのが混乱しています。

例えばディレクトリ構成を以下とします。

hoge.com    index.html   style.css

エラーは以下です。

C:\Users\xx\Desktop>python xx.py analize_html= https://hoge.org Traceback (most recent call last): File "xx.py", line 68, in <module> analize_html(url, url) File "xx.py", line 54, in analize_html html = open(savepath, "r", encoding="utf-8").read() PermissionError: [Errno 13] Permission denied: './hoge.org'

url = "https://ほげほげどっとこむ"

#coding: UTF-8 from bs4 import BeautifulSoup import urllib import urllib.request from urllib.parse import urlparse from urllib.parse import urljoin from urllib.request import urlretrieve from os import makedirs import os.path, time, re test_files = {} def enum_links(html, base): soup = BeautifulSoup(html, "html.parser") links = soup.select("link[rel='stylesheet']") links += soup.select("a[href]") result = [] for a in links: href = a.attrs['href'] url = urljoin(base, href) result.append(url) return result def download_file(url): o = urlparse(url) savepath = "./" + o.netloc + o.path if re.search(r"/$", savepath): savepath += "index.html" savedir = os.path.dirname(savepath) if os.path.exists(savepath): return savepath if not os.path.exists(savedir): print("mkdir=", savedir) makedirs(savedir) try: print("download=", url) urlretrieve(url, savepath) time.sleep(1) return savepath except: print("falure download", url) return None def analize_html(url, root_url): savepath = download_file(url) if savepath is None: return if savepath in test_files: return test_files[savepath] = True print("analize_html=", url) html = open(savepath, "r", encoding="utf-8").read() links = enum_links(html, url) for link_url in links: if link_url.find(root_url) != 0: if not re.search(r".css$", link_url): continue if re.search(r".(html|htm)$", link_url): analize_html(link_url, root_url) continue download_file(link_url) if __name__ == "__main__": url = "https://ほげほげどっとこむ" analize_html(url, url)

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

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

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

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

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

yamato_user

2019/07/25 03:19

はじいているところは大体UA見てる気がする。 UAいじってみても、はじかれる?
退会済みユーザー

退会済みユーザー

2019/07/25 04:11

すみません。UAではなく以下のようなイメージです。 PCでブラウザ上では見える。ex) hoge.com Python上でははじかれる。 ex) hoge.com おなじ これは単純なディレクトリ構成の権限設定755など の問題なのでしょうか?
退会済みユーザー

退会済みユーザー

2019/07/25 04:58

だからそれはUAの話ではないですか?
yamato_user

2019/07/25 05:28

あー、、、これ、普通に自分のサーバーの問題じゃね? スクレイピング関係ないじゃん。多分。。コードちゃんと読んでないけど、自分のサーバに保存したHTMLファイル読み込もうとしてはじかれてますよね? 実行ユーザに対して、アクセス権限許可して下さい
otn

2019/07/25 05:36

エラーメッセージを見る限り、保存したディスク上のファイルを読むときのエラーでは??
退会済みユーザー

退会済みユーザー

2019/07/25 07:06

otnさん >エラーメッセージを見る限り、保存したディスク上のファイルを読むときのエラーでは?? ありがとうございました。保存したディスク上のフォルダ(例えばこの場合/hogehoge.com のフォルダ権限エラーという事でしょうか?以下1)と2)の閲覧方法があります。同じトップ画面参照でもPython上でデータを取得する時には、権限エラーではじく為にはフォルダ権限(755など)をいくつに設定するのが妥当でしょうか? PCでブラウザ上では見える。ex) hoge.com Python上では権限エラー  ex) hoge.com ※おなじ
退会済みユーザー

退会済みユーザー

2019/07/25 07:09 編集

Woopenさん 回答ありがとうございました。 >あー、、、これ、普通に自分のサーバーの問題じゃね? ちがいます。自分のサーバーではありません。 >スクレイピング関係ないじゃん。多分。。コードちゃんと読んでないけど、 スクレイピングのコードを書いた時の事を質問していますのでスクレイピングは関係あります。 >自分のサーバに保存したHTMLファイル読み込もうとしてはじかれてますよね? 違います。自分のサーバの事は今回一切関係ありません。もちろん自サーバに保存したhtmlのreadの話でもありません。
退会済みユーザー

退会済みユーザー

2019/07/25 07:11 編集

この内容であれば「スクレイピング」は誤解しか招かないので消した方がいいと思います。 追記)やっぱり関係あるんですか。わからないな・・・
otn

2019/07/25 07:12

> 保存したディスク上のフォルダ(例えばこの場合/hogehoge.comのフォルダ権限エラーという事でしょうか? 知りませんが、ファイルのopenのエラーなので、ファイルかディレクトリの権限の問題ですね。 このエラーに関しては、先方のサーバーは無関係です。 あと、質問に書いたことを何度もコメントに書くのはやめましょう。
退会済みユーザー

退会済みユーザー

2019/07/25 07:17 編集

>このエラーに関しては、先方のサーバーは無関係です。 なぜですか?このコードではAというサーバではデータ取得が可能です。Bというサーバではデータ取得できません。先方のサーバ環境が無関係ではないと思います。トップページ/hoge.comのchmodを変えるとブラウザでは閲覧可能で上記コードのスクレイピングではデータ取得できない設定にかえられますか? 回答ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/07/25 07:18

私も無関係だと思いますね。 ダウンロードした後の話になるので。
otn

2019/07/25 07:19 編集

デバッグをしたことが無いのかもしれませんが、 ・どこでエラーになっているか ・そこでは何をしているか(どういう処理がエラーになっているのか) を考えるところから始めましょう。
退会済みユーザー

退会済みユーザー

2019/07/25 07:20 編集

結局タイトルの「スクレイピングを拒否したい」とはどういうことなのかが分からないです。今問題になっている権限エラーの対処とどう結びつくのでしょうか。
退会済みユーザー

退会済みユーザー

2019/07/25 07:34 編集

>ダウンロードした後の話になるので。 ダウンロードはできません。たとえばBというサーバではデータ取得できません。スクレイピングを拒否する方法として権限設定が有効か質問しています。なのでダウンロードした後の話ではありません。 >ファイルのopenのエラーなので、ファイルかディレクトリの権限の問題ですね。
otn

2019/07/25 07:36

> スクレイピングを拒否する方法として権限設定が有効か質問しています。 今回のエラーメッセージと無関係な質問と言う事ですか?
退会済みユーザー

退会済みユーザー

2019/07/25 07:42

いえ。もろに関係しています。
otn

2019/07/25 07:49 編集

では、 ・どこでエラーになっているか ・そこでは何をしているか(どういう処理がエラーになっているのか) を考えるところから始めましょう。 考えたら、書いてみてください。 「そのエラーメッセージはこういう意味だ」と他人が言っても信用しないのなら、自分で考えるしかないです。
退会済みユーザー

退会済みユーザー

2019/07/25 07:50

>このエラーに関しては、先方のサーバーは無関係です。 例えば本pyファイルを利用して hoge.com -A busa.com -B という2つのサイトをスクレイピングしようとしたとします。Aはスクレイピング可能ですがBは不可能でした。先方のサーバーは無関係なのでしょうか? ・エラー箇所は以下です。ファイル名の記載間違いではないと思います。 analize_html(url, url) 宜しくお願いいたします。
otn

2019/07/25 08:05

> ・エラー箇所は以下です。 html = open(savepath, "r", encoding="utf-8").read() では?
yamato_user

2019/07/25 09:35

職業プログラマなら、この程度のエラーでここまで躓くのは相当やばい。 学生が独学でやっているにしてもひどいレベル。 何より、指摘を素直に受け入れないのは、元々の性格の問題かな? 一連の流れを見ていると、おそらくコードも理解していない。 **今後のプログラマ生活で大事なことを3つ教えます。** ・自分より優れた人の指摘や忠告は素直に聞きましょう ・自分の知識と技術の不足を正確に把握しましょう ・基本を正確に理解しましょう 以上!!!!
退会済みユーザー

退会済みユーザー

2019/07/25 09:37

> ・エラー箇所は以下です。 html = open(savepath, "r", encoding="utf-8").read() では? そうですね。
yamato_user

2019/07/25 10:01

open関数がローカルファイル(自分のサーバ内のファイル)を開く関数だということは理解していますか?
otn

2019/07/25 10:56

次は > ・そこでは何をしているか(どういう処理がエラーになっているのか) ですね。
退会済みユーザー

退会済みユーザー

2019/07/25 11:07

了解です。ご丁寧にありがとうございます
guest

回答3

0

今回起こっているエラーとは関係ありませんが、質問文に書かれていることに回答しておきます。

サーバー上にどのファイル構成のパーミッションを変更すると

このようにスクレイピングできないディレクトリ構成となるのでしょうか?

ファイルのパーミッションとは全く関係ありません。
リクエストのUser-Agentヘッダを見てサーバー側で、応答を出し分けるというのはごく普通にされています。
PCとスマホで画面が違うのは誰でも知ってますよね。

ブラウザだと見れてPythonだと見れないというのが混乱しています。

PCブラウザでもスマホブラウザでもないものに対して、中身のない応答を返す、もしくはエラーにするというのも珍しくは無いです。
そういうページをスクレイプしたいときには、
User-Agentをブラウザと同じにしてみる
・ブラウザをスクリプトでコントロールするタイプのツールを使って実際にブラウザでアクセスする
のどちらかの手段を執ります。
後者が確実ですが、前者でも多くの場合大丈夫です。

また、プログラムによるアクセスを利用規約で禁止しているサイトもあり、そういうサイトで検知されると、IPアドレスごとブロックされる可能性もあります。

投稿2019/07/26 00:33

otn

総合スコア84505

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

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

退会済みユーザー

退会済みユーザー

2019/07/26 00:42

非常に丁寧でわかりやすい説明でした。otnさんが書く他の方の回答もいつも参考しています。 つまりサーバ管理者側の視点にたつと ・User-AgentでPCブラウザでもスマホブラウザでもないものに対し中身のない応答を返す403? という事である程度はスクレイピングを防げるという事でしょうか?
otn

2019/07/26 01:13

そうですね。 ただ、ブラウザをスクリプトコントロールするという手段があるので、あまり実質的な意味はないです。
退会済みユーザー

退会済みユーザー

2019/07/26 01:18

ブラウザのスクリプトコントロールは実質防ぐ方法はないのでしょうか?
otn

2019/07/26 01:27

> ブラウザのスクリプトコントロールは実質防ぐ方法はないのでしょうか? ブラウザのアドレスバーにURLを入力するのを、 ・人間がキーボードをたたいている ・サルがキーボードをたたいている ・スクリプトがコントロールして入力している を、サーバー側で区別することはできませんね。 ・URLを直接入力した、あるいはブラウザのブックマークから来た ・検索エンジンの結果から飛んできた をリファラーで区別はできるので、前者を拒否すれば多くのスクレイプを防げますが、多くの普通のユーザーを失うことにもなりますね。
退会済みユーザー

退会済みユーザー

2019/07/26 01:35

>前者を拒否すれば多くのスクレイプを防げますが、多くの普通のユーザーを失うことにもなりますね。 という事は 前者で1分間に20回以上打つという人間ではしにくい方法を検知する方法で2分後に異常があれば防止 すればだいたいは防げるという事でしょうか? あげあしを取りたいわけでは全然ありませんので、だいたい防げればいいかなと思っています。厳密に何パーセントなんてわからないですし。 丁寧でわかりやすい回答ありがとうございます
otn

2019/07/26 02:00

スクレイピングは、リクエストごとにある程度時間をおいて行うのが普通なので、頻度で見るのは難しいですが、情報がたくさんのページに分かれているサイトの場合には、「10秒に1回でも、それが○分間継続すれば」みたいなのはチェック可能ですね。 情報が1ページにまとまっていれば、こういうチェックは不可能ですが。
退会済みユーザー

退会済みユーザー

2019/07/26 02:03

了解です。その方法であればだいたいは防げそうです。丁寧に教えて頂いて本当にありがとうございました。ものすごくわかりやすかったです。自分が知っている知識を出し惜しみしてひけらかすのではなく、私のような初学者の目線まで落としてわかるように説明頂けたotnさんの気持ちがなによりも嬉しかったです。ありがとうございました。
guest

0

スクレイピングに対して技術的に対抗するのはコストがかかりすぎます。
国内からのアクセスであれば、相手方のプロバイダに迷惑行為として報告し警告を与えるのが低コスト高効果です。
利用規約と robot.txt を適切に設定し、それに応じないアクセスをログから洗い出すことのみに注力すると良いです。

参考
本日は迷惑アクセスに対抗する簡易的な方法を伝授します!

投稿2019/07/25 05:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/07/25 07:11

ありがとうございます。おっしゃる通りですね。
guest

0

普通にやるなら、HPの構成変えたり(すぐ対策されますが)IPアドレスで弾いたり(すぐ対策されますが)…
SEO的には最悪ですが文字を無くして全部画像(文字ではなく画像(説明文も金額も全部jpg等で配置))にするとか……
リクエストの時間が一定か判定したり…?
普通に対策されるので個人でクローリング対策やるのは中々難しいと思います。

確かアメリカにクローリング対策をサービスとして提供している会社もあります。
そこの対策は強力でselenium使った場合2ページ目に飛んだ時には弾かれる感じでした。

投稿2019/07/25 03:37

expy

総合スコア103

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

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

退会済みユーザー

退会済みユーザー

2019/07/25 04:12

すみません。わかりずらい説明をしてしまいました。 PCでブラウザ上では見える。ex) hoge.com Python上で上記ソースでスクレイピングするとはじかれる。 ex) hoge.com おなじ これは単純なディレクトリ構成の権限設定(755など)の問題なのでしょうか?
expy

2019/07/25 04:57

あ、ごめんなさい。 何か他のとゴッチャになってたかもしれません。 多分ディレクトリの権限問題だと思いますが…… chownとかchmodとかで権限設定してみる。 保存したいディレクトリが存在するかチェック(savedir をprintとかで表示してみる) ですかねぇ……
退会済みユーザー

退会済みユーザー

2019/07/25 07:14

とんでもないです。こちらこそありがとうございます。 たとえばトップページをchmodで権限設定する際に(hoge.comなど) あるAサイトではこのコードでデータ取得が可能です。 あるBサイトではこのコードでデータ取得が不可能です。 もちろんAもBも両方ブラウザでは閲覧可能です。このような時Bのchmodはどのような設定をするのでしょうか?
expy

2019/07/25 08:07

ブラウザで見れるとなるとちょっと分からないです。 逆にスクレイピングできない状態ってどんな設定なのか 知りたいくらいです…… でも PermissionError: [Errno 13] Permission denied: './hoge.org'  だから 多分サーバ側ですがプログラム側の問題かも知れませんし…… お力になれず…
退会済みユーザー

退会済みユーザー

2019/07/25 09:41

いえいえ。ご丁寧にありがとうございました。同じコードで走るサイトもあるのでサーバサイドの設定だと思います。そのスクレイピングを拒否れる設定を私も知りたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問