スクレイピングをする時に以下のように
セキュリティ権限拒否ではじかれてできない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)
はじいているところは大体UA見てる気がする。
UAいじってみても、はじかれる?

すみません。UAではなく以下のようなイメージです。
PCでブラウザ上では見える。ex) hoge.com
Python上でははじかれる。 ex) hoge.com おなじ
これは単純なディレクトリ構成の権限設定755など の問題なのでしょうか?
だからそれはUAの話ではないですか?
あー、、、これ、普通に自分のサーバーの問題じゃね?
スクレイピング関係ないじゃん。多分。。コードちゃんと読んでないけど、自分のサーバに保存したHTMLファイル読み込もうとしてはじかれてますよね?
実行ユーザに対して、アクセス権限許可して下さい
エラーメッセージを見る限り、保存したディスク上のファイルを読むときのエラーでは??

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

Woopenさん
回答ありがとうございました。
>あー、、、これ、普通に自分のサーバーの問題じゃね?
ちがいます。自分のサーバーではありません。
>スクレイピング関係ないじゃん。多分。。コードちゃんと読んでないけど、
スクレイピングのコードを書いた時の事を質問していますのでスクレイピングは関係あります。
>自分のサーバに保存したHTMLファイル読み込もうとしてはじかれてますよね?
違います。自分のサーバの事は今回一切関係ありません。もちろん自サーバに保存したhtmlのreadの話でもありません。
この内容であれば「スクレイピング」は誤解しか招かないので消した方がいいと思います。
追記)やっぱり関係あるんですか。わからないな・・・
> 保存したディスク上のフォルダ(例えばこの場合/hogehoge.comのフォルダ権限エラーという事でしょうか?
知りませんが、ファイルのopenのエラーなので、ファイルかディレクトリの権限の問題ですね。
このエラーに関しては、先方のサーバーは無関係です。
あと、質問に書いたことを何度もコメントに書くのはやめましょう。

>このエラーに関しては、先方のサーバーは無関係です。
なぜですか?このコードではAというサーバではデータ取得が可能です。Bというサーバではデータ取得できません。先方のサーバ環境が無関係ではないと思います。トップページ/hoge.comのchmodを変えるとブラウザでは閲覧可能で上記コードのスクレイピングではデータ取得できない設定にかえられますか?
回答ありがとうございます。
私も無関係だと思いますね。
ダウンロードした後の話になるので。
デバッグをしたことが無いのかもしれませんが、
・どこでエラーになっているか
・そこでは何をしているか(どういう処理がエラーになっているのか)
を考えるところから始めましょう。
結局タイトルの「スクレイピングを拒否したい」とはどういうことなのかが分からないです。今問題になっている権限エラーの対処とどう結びつくのでしょうか。

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

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

>このエラーに関しては、先方のサーバーは無関係です。
例えば本pyファイルを利用して
hoge.com -A
busa.com -B
という2つのサイトをスクレイピングしようとしたとします。Aはスクレイピング可能ですがBは不可能でした。先方のサーバーは無関係なのでしょうか?
・エラー箇所は以下です。ファイル名の記載間違いではないと思います。
analize_html(url, url)
宜しくお願いいたします。
> ・エラー箇所は以下です。
html = open(savepath, "r", encoding="utf-8").read()
では?
職業プログラマなら、この程度のエラーでここまで躓くのは相当やばい。
学生が独学でやっているにしてもひどいレベル。
何より、指摘を素直に受け入れないのは、元々の性格の問題かな?
一連の流れを見ていると、おそらくコードも理解していない。
**今後のプログラマ生活で大事なことを3つ教えます。**
・自分より優れた人の指摘や忠告は素直に聞きましょう
・自分の知識と技術の不足を正確に把握しましょう
・基本を正確に理解しましょう
以上!!!!

> ・エラー箇所は以下です。
html = open(savepath, "r", encoding="utf-8").read()
では?
そうですね。
open関数がローカルファイル(自分のサーバ内のファイル)を開く関数だということは理解していますか?
次は
> ・そこでは何をしているか(どういう処理がエラーになっているのか)
ですね。

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