python爬虫類読書ノート——データキャプチャ(4)

11441 ワード

3つのWebページのキャプチャ方法
1.正規表現
(これは本当にわかりにくいですが、後で単独でメモを書きます)
2.Beautiful Soup
このモジュールは、Webページを解析し、コンテンツを位置決めするための便利なインタフェースを提供します.
3.Lxml
lxmlはlibxml 2というlxml解析ライブラリに基づくpythonパッケージです.このモジュールはC言語で記述されており,Beautiful Soupよりも解析速度が速い.
lxmlは、属性の両側に欠けている引用符を正しく解析し、ラベルを閉じることもできますが、このモジュールには「html」と「body」のラベルが追加されていません.
入力内容を解析した後、要素を選択するステップに入ります.このときlxmlには、XPathセレクタやBeautiful Soupのようなfind()メソッドなど、いくつかの異なる方法があります.ただし、cssセレクタを使用します.これは、より簡単に販売され、動的コンテンツを解析する際に多重化できるためです.、
パフォーマンスの比較
FIELDS=('area','population','iso','country','capital','continent ', 'tld','currency code ','currency name','phone','postal_code_format','postal_code_regex','languages' ,'neighbours')

import re
def re_scraper(html):
    results={}
    for field in FIELDs:
        results[field]=re.search('.*?(.*?)(.*?)'
                                 % field,html).groups()[0]
    return results

from bs4 import BeautifulSoup
def bs_scraper(html):
    soup=BeautifulSoup(html,'html.parser')
    results={}
    for field in FIELDS:
        results[field]=soup.find('table').find('tr',id='places_%s_row' %field).find('td',class_='w2p_fw').text
    return results

import lxml.html
def lxml_scraper(html):
    tree=lxml.html.fromstring(html)
    results={}
    for field in FIELDS:
        results[field]=tree.csselect('table>tr#palce_%s_row>td.w2p_fw' %field)[0].text_content()
    return results 
  

import  time
NUM_ITERATIONS=1000 #            
html=download('http://example.webscraping.com/places/view/United-Kingdom-239')
for name,scraper in [('Regular expressions',re_scraper),('BeautifulSoup',bs_scraper),('lxml',lxml_scraper)]:
    #         
    for i in range(NUM_ITERATIONS):
        if scraper==re_scraper:
            re.purge()
        result=scraper(html)
        #         
        assert(result['area']=='244,820 square kilometres')
    #record end time of scrape and output the total
    end=time.time()
    print('%s: %.2f seconds' %(name,end-start))

このコードでは、 ごとに1000 され、 するたびにキャプチャ が しいかどうかを し、 を します.ここで するdownload は として で した である. コード でreを び したことに してください.purge()メソッド.デフォルトでは、 モジュールは をキャッシュします. の との をより にするには、この を してキャッシュをクリアする があります.
に、コンピュータでスクリプトを した を します.$python performance.py
Regular expressions: 5.50 seconds
BeautifulSoup : 42.84 seconds
Lxml : 7.06 seconds
:
つかみ
パフォーマンス
の しさ
インストールの



シンプル( モジュール)
Beautiful Soup


シンプル( モジュール)
Lxml


に である.
もしあなたの のボトルネックがデータを するのではなく、Webページをダウンロードすることであれば、Beautiful Soupのような い を っても ありません.
のデータをキャプチャし、 の を するだけであれば、 がより になる があります.
ただし、 、lxmlはデータをキャプチャする の です.これは、この は で であり、 とBeautiful Soupは のシーンでのみ できるためです.
リンク のコールバックをキャプチャする
データのキャプチャ については、 の のリンク に する があります.この コードを して のWebサイトをキャプチャするには、callbackパラメータを してキャプチャ を する があります.callbackは、 のイベントが した に び される です(この では、Webダウンロードが した に び されます).このキャプチャcallback はurlとhtmlの2つのパラメータを み、 い すURLリストを すことができます. は、 は コードで、Pythonではこの を するのが に であることがわかります.
def link_crawler(...,scraper_callback-None):
    ...
    links=[]
    if scrape_callback:
        links.extend(scrape_callback(url,html)or [])
        ...

データをキャプチャして します.
def scrape_callback(url,html):
    if re.search('/view/',url):
        tree=lxml.html.fromstring(html)
        row=[tree.cssselect('table>tr#places_%s_row >td.w2p_fw' %field)[0].text_content() for field in FIELDS]
        print url,row

は、 られた をcsvテーブルに します.
import csv
class ScrapeCallback:
    def __init__(self):
        self.writer=csv.writer(open('countries.csv','w'))
        self.fields=('area','population','iso','country','capital','continent','tld','currency_code',
                     'currency_name','phone','postal_code_format','postal code regex', 'languages','neighbours')
        self_writer.writerow(self.fields)
    def __call__(self,url,html):
        if re.search('/view/',url):
            tree=lxml.html.fromstring(html)
            row=[]
            for field in self.fields:
                row.append(tree.cssselect('table>tr#places_{}_row >td.w2p_fw'.format(field))[0].text_content())
            self.writer.writerow(row)

このcallbackを するために,csvにおけるwriter の を するために,コールバック ではなくコールバッククラスを いた.csvのwriterプロパティは、 でインスタンス され、call_メソッドでは、 の き み が されます. してください.call_オブジェクトが として び されると び される なメソッドです.これもリンク のcache_です.callbackの び し .つまり、scrape_callback(url,html)とscrape_の び しcallback. _call_(url,html)は です. 
リンク にコールバックを するコードの き :
link_crawler('http://example.webscraping.com/ ','/(Index|view)',max_depth=-1,scrape_callback=ScrapeCallback ()) 
 
 








アルファベットで :
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z その