2015-09-23 20 views
10

私はPythonでSelenium Webdriverを使ってWebスクレイピングを行っています。Proxyです。Selenium Webdriver/Beautifulsoup + Web Scraping + Error 416

このスクレイピングを使用して、単一サイトの10kページ以上をブラウズしたいと考えています。

問題はこのプロキシを使用しています。私は一度だけリクエストを送信できます。私はこのサイトの同じリンクまたは別のリンクで別のリクエストを送信しているときに、416エラー(ファイアウォールを使ったブロックIPの種類)を1-2時間受け取ります。

注:私はこのコードですべての正常なサイトを削ることができますが、このサイトには擦り傷を防ぐセキュリティがあります。

ここはコードです。

profile = webdriver.FirefoxProfile() 
profile.set_preference("network.proxy.type", 1) 
profile.set_preference(
       "network.proxy.http", "74.73.148.42") 
profile.set_preference("network.proxy.http_port", 3128) 
profile.update_preferences() 
browser = webdriver.Firefox(firefox_profile=profile) 
browser.get('http://www.example.com/') 
time.sleep(5) 
element = browser.find_elements_by_css_selector(
       '.well-sm:not(.mbn) .row .col-md-4 ul .fs-small a') 
for ele in element: 
    print ele.get_attribute('href') 
browser.quit() 

任意の解決策??

答えて

5

セレンは私のために有用ではなかったので、私はbeautifulsoupを使用して問題を解決し、ウェブサイトは、要求を受信したときにプロキシをブロックするために、セキュリティを使用しているので、サーバは要求されたプロキシをブロックしたときに、私は継続的にproxyurlUser-Agentを変更しています。

私は

from bs4 import BeautifulSoup 
import requests 
import urllib2 

url = 'http://terriblewebsite.com/' 

proxy = urllib2.ProxyHandler({'http': '130.0.89.75:8080'}) 

# Create an URL opener utilizing proxy 
opener = urllib2.build_opener(proxy) 
urllib2.install_opener(opener) 
request = urllib2.Request(url) 
request.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15') 
result = urllib2.urlopen(request) 
data = result.read() 
soup = BeautifulSoup(data, 'html.parser') 
ptag = soup.find('p', {'class', 'text-primary'}).text 
print ptag 

ここに私のコードを貼り付けて注意しています:

  1. 変更プロキシとユーザエージェントとアップデートされた最新のプロキシのみ

  2. 少数のサーバーを使用します私の場合、私はUnited Staのプロキシを使用していましたTES

このプロセスはまだuはデータをスクラップすることができ、遅くなるかもしれません

1

次のリンクの416エラーの問題が発生すると、キャッシュされた情報(Cookieが多分)によって問題が作成されているようです。最初に要求を送信することができ、その後の送信要求は失敗します。

https://webmasters.stackexchange.com/questions/17300/what-are-the-causes-of-a-416-error 416 Requested Range Not Satisfiable

好みを設定するか、すべてのリクエストを送信した後に、クッキーを削除することにより、クッキーを保存しないように選択してみてください。

profile.set_preference("network.cookie.cookieBehavior", 2);