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セレクタを使用します.これは、より簡単に販売され、動的コンテンツを解析する際に多重化できるためです.、
パフォーマンスの比較
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 ())
があるかもしれません