2017-10-11 47 views
0

私はBeautifulSoup4とPythonを使って、過去数回、ローカルのhtmlファイルを解析しました。今私はプロキシを使用してウェブサイトを掻きたい。 (400リクエストは100回のリクエストの後にIPがブロックされます)Python/BS4のWebスクレイピングスクリプトにプロキシとヘッダを追加するには?

通常の「スリープ」でスクリプトをスローダウンした後、プロキシを使用したいのですが、ここで助けてください。私は、スタックオーバーフローの問題から助けを借りて、二つの方法を試してみました:

方法別のウェブサイトでは動作しない1
この方法が、それは、データをダウンロードしません。私が受け取ったデータを「印刷」すると、「Response [200]」と印刷されます。実際のWebサイトでこの方法を試してみると、「最大再試行回数がURLを超過しました:」プロキシが正しく処理されていない可能性があります。私がhtmlを読もうとすると、次のエラーが発生します。

page_html = response.read()
AttributeError: 'Response' object has no attribute 'read'

response = requests.get(URL, proxies=PROXY, headers=HEADER) 

方法2
私は別のウェブページをダウンロードすることができましたが、私は(私をブロックされた)元のWebページからダウンロードすることができませんでした。スクリプトに間違いがあり、プロキシが正しく処理されていないと仮定します。実際のIPのどちらかが、ウェブサイトに送信され、または私はプロキシに接続することはできません。

response = urllib.request.urlopen(urllib.request.Request(url, None, header, proxy)) 

私のスクリプトは次のようになりん:

HEADER = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'} 
URL = "https://www.website.php" 
PROXY = {"https": "https//59.110.7.190:1080"} 

#response.close() Is this even necessary 

page_html = response.read() # With Method 1 I also tried response.text which resulted in "str is not callable" 
response.close() 
page_soup = soup(page_html, "html.parser") 

adresses = page_soup.findAll("li", {"class":"list-group-item"}) 

for address in adresses: 
    try: 
     #parsing the html 
    except (TypeError): 
     f.write("invalid data" + "\n") 
time.sleep(random.randint(1, 10)) 

私は通常、取得エラーは以下の通りです:

requests.exceptions.ProxyError: HTTPSConnectionPool(host='www.firmendb.de', port=443): Max retries exceeded with url: /[website.php] (Caused by ProxyError('Cannot connect to proxy.', NewConnectionError(': Failed to establish a new connection: [Errno 11001] getaddrinfo failed',)))

Process finished with exit code 1

私はスクリプトのプロキシ部分を台無しにしたと仮定します。私はそれを実装しようとする前に動作しました。私の主な質問が出る前にこれをしたことがないので、プロキシの部分は正しいですか?私は次のウェブサイトから代理人を得ました:https://free-proxy-list.net/

  • これらのリストからプロキシを選ぶには?
  • どのようにプロキシに接続しますか?
  • プロキシプロバイダーの使用に関する提案はありますか?
  • スクリプトの提案はありますか?
+1

あなたのIPが変更されたかの要求があなたの本当のIPを持っていることを確認することはできますか?あなたのIPアドレスが正しく変更されているかどうかを調べるには、https://www.whatismyip.com/my-ip-information/?iref=homeのようなサイトを利用することができます。 –

+0

多くのプロキシ(特に無料のプロキシ)は悪意のある目的のために使用されているため、ブラックリストに載っています。 – charlesreid1

+0

@ Christos Papoulas:良い点;私はそれをテストし、私の実際のIPを再送しました。つまり、スクリプトのプロキシ設定は無視されます。なぜなのかご存知ですか?あなたは、プロキシやスクレイピングのためのオンラインヘルプなどを知っていますか?プロキシが動作したかどうかをテストするために、私はこのコマンドを使用しました:response = requests.get(url、proxies = {"https": "https://46.163.119.138:3128"}、headers = header) – Marco

答えて

0

コメントありがとうございました!エラーは、プロキシがどのくらいの頻度で変更されるかを考慮しなかったことです。私はスクリプトをテストするよりも前にスクリプトの方法でプロキシを書きました。

他の人を助けるために、これはスクリプトがPyhton3を見なければならない方法です。
もちろん、HEADER/URL/PROXYはリストであってもよく、その後、forループに渡されます。あなたがAPIを使用して気にしない場合は

HEADER = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'} 
URL = "https://www.website.php" 
PROXY = {"https": "https//59.110.7.190:1080"} 

response = requests.get(URL, proxies=PROXY, headers=HEADER) 
page_html = response.text 
page_soup = soup(page_html, "html.parser") 

adresses = page_soup.findAll("li", {"class":"list-group-item"}) #for example 

for address in adresses: 
    try: 
     #parsing the html 
    except (TypeError): 
     f.write("invalid data" + "\n") 
time.sleep(random.randint(1, 10)) 
関連する問題