1

だから私はおいしい情報を解析する次のコードセットを持っています。Deliciousページのデータを次の形式で印刷します

ブックマーク| 人々の数

ブックマーク| 人数等...

私はこの情報を見つけるために次の方法を使用していました。

def extract (soup):
    links = soup.findAll('a',rel='nofollow')
    for link in links:
        print >> outfile, link['href']

    hits = soup.findAll('span', attrs={'class': 'delNavCount'})
    for hit in hits:
        print >> outfile, hit.contents


#File to export data to
outfile = open("output.txt", "w")

#Browser Agent
br = Browser()    
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]


url= "http://www.delicious.com/asd"
page = br.open(url)
html = page.read()
soup = BeautifulSoup(html)
extract(soup)

しかし、問題は、一部のブックマークに人数がないことでした。そこで、データを同時に取得し、ブックマークと人数を並べて印刷するように、別の解析を行うことにしました。

編集:この更新されたバージョンで15〜5秒でそれを手に入れました、それ以上の提案

def extract (soup):
    bookmarkset = soup.findAll('div', 'data')
    for bookmark in bookmarkset:
        link = bookmark.find('a',)
        vote = bookmark.find('span', 'delNavCount')
        try:
            print >> outfile, link['href'], " | " ,vote.contents
        except:
            print >> outfile, "[u'0']"
    #print bookmarkset


#File to export data to
outfile = open("output.txt", "w")

#Browser Agent
br = Browser()    
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]


url= "http://www.delicious.com/asd"
page = br.open(url)
html = page.read()
soup = BeautifulSoup(html)
extract(soup)

ただし、これでのパフォーマンスはひどいもので、最初のページを解析するのに17秒かかり、その後はかなりまともなマシンで約15秒かかります。コードの最初のビットから2番目のビットに移動すると、大幅に低下しました。ここでパフォーマンスを向上させるために私にできることはありますか?

4

3 に答える 3

3

パフォーマンスが心配な場合は、スクリーンスクレイピングではなく、おいしいAPIと通信するもの、つまりpydeliciousをご覧ください。例えば:

>>> import pydelicious
>>> pydelicious.get_userposts('asd')
[{'extended': '', 'description': u'Ksplice - System administration and software blog', 'tags': u'sysadm, blog, interesting', 'url': u'http://blog.ksplice.com/', 'user': u'asd'
于 2010-12-19T04:14:26.237 に答える
3

voteなぜあなたが2回割り当てているのかわかりません。最初の割り当ては不要であり、実際には非常に重いものです。これは、反復ごとにドキュメント全体を解析する必要があるためです。なんで?

   vote = BeautifulSoup(html)
   vote = bookmark.findAll('span', attrs={'class': 'delNavCount'})
于 2010-12-19T03:22:00.087 に答える
0

BeautifulSoup は、このインスタンスで必要な以上のことを行います。本当に速度を上げたい場合は、urllib + シンプルな行ごとのパーサーのより基本的なアプローチを採用することをお勧めします。

「asd」の例のサイズのページを解析するには、最新のマシンで 1 秒もかからないはずです。

于 2010-12-19T04:01:32.843 に答える