1

を使用して静的HTMLページをダウンロードするクローラーを作成していますurllib

get_page関数は1サイクル動作しますが、ループしようとすると、入力した次のURLにコンテンツが開かれません。

  • urllib.urlopenHTMLページを継続的にダウンロードするにはどうすればよいですか?
  • それが不可能な場合、Pythonコード内でWebページをダウンロードするための他の提案はありますか?

seed以下の私のコードは、リストの最初のWebサイトのhtmlのみを返します。

import urllib
def get_page(url):
    return urllib.urlopen(url).read().decode('utf8')

seed = ['http://www.pmo.gov.sg/content/pmosite/home.html', 
            'http://www.pmo.gov.sg/content/pmosite/aboutpmo.html']    

for j in seed:
      print "here"
      print get_page(j)

同じクロールの「1回限り」の問題は、次の場合にも発生しurllib2ます。

import urllib2
def get_page(url):
    req = urllib2.Request(url)
    response = urllib2.urlopen(req)
    return response.read().decode('utf8')

seed = ['http://www.pmo.gov.sg/content/pmosite/home.html', 
            'http://www.pmo.gov.sg/content/pmosite/aboutpmo.html']    

for j in seed:
      print "here"
      print get_page(j)

例外なく、urllibでIOErrorが発生します。

Traceback (most recent call last):
  File "/home/alvas/workspace/SingCorp/sgcrawl.py", line 91, in <module>
    print get_page(j)
  File "/home/alvas/workspace/SingCorp/sgcrawl.py", line 4, in get_page
    return urllib.urlopen(url).read().decode('utf8')
  File "/usr/lib/python2.7/urllib.py", line 86, in urlopen
    return opener.open(url)
  File "/usr/lib/python2.7/urllib.py", line 207, in open
    return getattr(self, name)(url)
  File "/usr/lib/python2.7/urllib.py", line 462, in open_file
    return self.open_local_file(url)
  File "/usr/lib/python2.7/urllib.py", line 476, in open_local_file
    raise IOError(e.errno, e.strerror, e.filename)
IOError: [Errno 2] No such file or directory: 'http://www.pmo.gov.sg/content/pmosite/aboutpmo.html'

例外なく、urllib2でValueErrorが発生します。

Traceback (most recent call last):
  File "/home/alvas/workspace/SingCorp/sgcrawl.py", line 95, in <module>
    print get_page(j)
  File "/home/alvas/workspace/SingCorp/sgcrawl.py", line 7, in get_page
    response = urllib2.urlopen(req)
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 392, in open
    protocol = req.get_type()
  File "/usr/lib/python2.7/urllib2.py", line 254, in get_type
    raise ValueError, "unknown url type: %s" % self.__original
ValueError: unknown url type: http://www.pmo.gov.sg/content/pmosite/aboutpmo.html

回答:

ある種のUnicodeバイトオーダーマーク(BOM)があったため、IOErrorとValueErrorが発生しました。2番目のURLにノーブレークスペースが見つかりました。問題を解決するためのすべてのあなたの助けと提案に感謝します!!

4

2 に答える 2

3

あなたのコードは窒息してい.read().decode('utf8')ます。

しかし、例外を飲み込んでいるだけなので、それはわかりません。 urllib「複数回」正常に動作します。

import urllib

def get_page(url):
    return urllib.urlopen(url).read()

seeds = ['http://www.pmo.gov.sg/content/pmosite/home.html', 
            'http://www.pmo.gov.sg/content/pmosite/aboutpmo.html']    

for seed in seeds:
      print 'here'
      print get_page(seed)
于 2012-09-30T14:47:56.833 に答える
2

あなたの例は両方とも私にとってはうまくいきます。正確なエラーについて私が考えることができる唯一の説明は、2番目のURL文字列に、ここにコードを貼り付けるときに除外された、ある種の印刷不可能な文字(Unicode BOMなど)が含まれていることです。このサイトからファイルにコードをコピーして戻すか、2番目の文字列全体を最初から再入力してみてください。

于 2012-09-30T14:52:03.803 に答える