web-dev-qa-db-ja.com

Python 3 Web ScrapingのHTTPエラー403

練習のためにWebサイトを破棄しようとしていましたが、HTTPエラー403を取得し続けました(ボットだと思いますか)?

ここに私のコードがあります:

#import requests
import urllib.request
from bs4 import BeautifulSoup
#from urllib import urlopen
import re

webpage = urllib.request.urlopen('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1').read
findrows = re.compile('<tr class="- banding(?:On|Off)>(.*?)</tr>')
findlink = re.compile('<a href =">(.*)</a>')

row_array = re.findall(findrows, webpage)
links = re.finall(findlink, webpate)

print(len(row_array))

iterator = []

私が得るエラーは次のとおりです:

 File "C:\Python33\lib\urllib\request.py", line 160, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python33\lib\urllib\request.py", line 479, in open
    response = meth(req, response)
  File "C:\Python33\lib\urllib\request.py", line 591, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python33\lib\urllib\request.py", line 517, in error
    return self._call_chain(*args)
  File "C:\Python33\lib\urllib\request.py", line 451, in _call_chain
    result = func(*args)
  File "C:\Python33\lib\urllib\request.py", line 599, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
75
Josh

これは、おそらくmod_securityまたは既知のスパイダー/ボットユーザーエージェントをブロックする同様のサーバーセキュリティ機能(urllibpython urllib/3.3.0のようなものを使用しているため、簡単に検出されるため)です。既知のブラウザユーザーエージェントを設定してみてください:

from urllib.request import Request, urlopen

req = Request('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1', headers={'User-Agent': 'Mozilla/5.0'})
webpage = urlopen(req).read()

これは私のために動作します。

ところで、あなたのコードでは、urlopen行の()の後に.readがありませんが、それはタイプミスだと思います。

ヒント:これは演習なので、制限のない別のサイトを選択してください。何らかの理由でurllibをブロックしている可能性があります...

150

ユーザーエージェントに基づいてurllibを使用しているため、間違いなくブロックされています。 OfferUpでこれと同じことが起こっています。 MozillaでユーザーエージェントをオーバーライドするAppURLopenerという新しいクラスを作成できます。

import urllib.request

class AppURLopener(urllib.request.FancyURLopener):
    version = "Mozilla/5.0"

opener = AppURLopener()
response = opener.open('http://httpbin.org/user-agent')

ソース

32
zeta

「これはおそらくmod_securityまたは既知のブロックする同様のサーバーセキュリティ機能が原因です。

スパイダー/ボット

ユーザーエージェント(urllibはpython urllib/3.3.0のようなものを使用します。簡単に検出できます)」-Stefano Sanfilippoが既に述べたように

from urllib.request import Request, urlopen
url="https://stackoverflow.com/search?q=html+error+403"
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})

web_byte = urlopen(req).read()

webpage = web_byte.decode('utf-8')

web_byteはサーバーによって返されるバイトオブジェクトであり、Webページに存在するコンテンツタイプはほとんどtf-8です。したがって、デコードメソッドを使用してweb_byteをデコードする必要があります。

これは、PyCharmを使用してWebサイトからスクラップしようとしたときに完全な問題を解決します

PS-> python 3.4を使用

8
royatirek

ページはpythonプログラム内で呼び出すときではなくブラウザーで機能するため、 rl を提供するWebアプリは、ブラウザーではなくコンテンツを要求したことを認識しているようです。

デモンストレーション:

curl --dump-header r.txt http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1

...
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>
You don't have permission to access ...
</HTML>

r.txtのコンテンツにはステータス行があります:

HTTP/1.1 403 Forbidden

偽装Webクライアントのヘッダー「User-Agent」を投稿してみてください。

注:このページには、おそらく解析したいテーブルを作成するAjax呼び出しが含まれています。ページのjavascriptロジックを確認するか、ブラウザデバッガー(Firebug/Netタブなど)を使用して、テーブルのコンテンツを取得するために呼び出す必要があるURLを確認する必要があります。

1
Robert Lujo

2つの方法で試すことができます。詳細はこちら link にあります。

1)ピップ経由

pip install --certifiのアップグレード

2)動作しない場合は、Python 3. * for MacにバンドルされているCerificates.commandを実行してみてください。 :(pythonインストール場所に移動し、ファイルをダブルクリックします)

/ Applications/Python\3。*/Install\Certificates.commandを開きます

0
Johnson