3

多くの Web ページのスクリーンショットを撮りたいので、次のように書きました。

from splinter.browser import Browser
import urllib2
from urllib2 import URLError

urls = ['http://ubuntu.com/', 'http://xubuntu.org/']


try :
    browser = Browser('firefox')
    for i in range(0, len(urls)) :
        browser.visit(urls[i])
        if browser.status_code.is_success() :
            browser.driver.save_screenshot('your_screenshot' + str(i) + '.png')
        browser.quit()
except SystemError :
    print('install firefox!')
except urllib2.URLError, e:
    print(e)
    print('theres no such website')
except Exception, e :
    print(e)
    browser.quit()

そして、私はこのエラーを受け取りました:

<urlopen error [Errno 111] Connection refused>

それを修正する方法?:)

編集

txt ファイルにリンクがある場合、以下のコードは機能しません。

from splinter import Browser
import socket

urls = []
numbers = []

with open("urls.txt", 'r') as filename :
    for line in filename :
        line = line.strip()
        words = line.split("\t")
        numbers.append(str(words[0]))
        urls.append(str(words[1].rstrip()))

print(urls)

browser = None    
try:
    browser = Browser('firefox')
    for i, url in enumerate(urls, start=1):
        try:
            browser.visit(url)
            if browser.status_code.is_success():
                browser.driver.save_screenshot('your_screenshot_%03d.png' % i)
        except socket.gaierror, e:
            print "URL not found: %s" % url
finally:
    if browser is not None:
        browser.quit()

私のtxtファイルは次のようになります。

1   http//ubuntu.com/
2   http//xubuntu.org/
3   http//kubuntu.org/

実行すると、エラーが発生しました:

$ python test.py 
['http//ubuntu.com/', 'http//xubuntu.org/', 'http//kubuntu.org/']
Traceback (most recent call last):
  File "test.py", line 21, in <module>
    browser.visit(url)
  File "/usr/local/lib/python2.7/dist-packages/splinter/driver/webdriver/__init__.py", line 79, in visit
    self.driver.get(url)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 168, in get
    self.execute(Command.GET, {'url': url})
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 156, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 147, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: u'Component returned failure code: 0x804b000a (NS_ERROR_MALFORMED_URI) [nsIIOService.newURI]'

今回はどうしたの?

4

1 に答える 1

6

あなたの問題はbrowser.quit()、URL のループ内で行うため、2 番目の URL に対して開かれていないことです。

コードの更新版は次のとおりです。

from splinter import Browser
import socket

urls = ['http://ubuntu.com/', 'http://xubuntu.org/']

browser = None    
try:
    browser = Browser('firefox')
    for i, url in enumerate(urls, start=1):
        try:
            browser.visit(url)
            if browser.status_code.is_success():
                browser.driver.save_screenshot('your_screenshot_%03d.png' % i)
        except socket.gaierror, e:
            print "URL not found: %s" % url
finally:
    if browser is not None:
        browser.quit()

主な変更点は、browser.quit()コードをメインの例外ハンドラーのfinallyに移動することです。これにより、何がうまくいかなくても発生します。enumerateイテレータ値とそのインデックスの両方を提供するために を使用していることにも注意してください。これは、独自のインデックス ポインターを保持するよりも、Python で推奨されるアプローチです。

あなたのコードに関連しているかどうかはわかりませんが、 で発生した例外を見つけsplinterたので、それらをトラップする方法も示しました。この例外ハンドラをループ内に移動しました。これにより、1 つ以上の URL が存在しない場合でも、引き続き残りのスクリーンショットが取得されます。socket.gaierrorurllib2.URLError

于 2012-10-02T02:41:02.153 に答える