148

練習用に 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
4

7 に答える 7

296

これはおそらく、mod_security既知のスパイダー/ボット ユーザー エージェントをブロックする、または同様のサーバー セキュリティ機能によるものです (のurllibようなものを使用しpython 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()

これは私にとってはうまくいきます。

ところで、あなたのコードでは、行の()afterが抜けていますが、タイプミスだと思います。.readurlopen

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

于 2013-05-18T17:52:11.737 に答える
51

ユーザーエージェントに基づいて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')

ソース

于 2015-08-01T06:00:29.413 に答える
2

ページはPythonプログラム内で呼び出すときではなくブラウザで動作するため、そのURLを提供する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 呼び出しが含まれています。テーブルのコンテンツを取得するためにどの URL を呼び出す必要があるかを確認するには、ページの JavaScript ロジックを確認するか、単純にブラウザー デバッガー (Firebug / Net タブなど) を使用する必要があります。

于 2013-05-18T17:55:26.873 に答える