Scrapy-アイテムの抽出
説明
Scrapyは、Webページからデータを抽出するために、XPathおよびCSS式に基づくセレクターと呼ばれる手法を使用します。以下はXPath式のいくつかの例です-
- /html/head/title −これにより、HTMLドキュメントの<head>要素内の<title>要素が選択されます。 
- /html/head/title/text() −これにより、同じ<title>要素内のテキストが選択されます。 
- //td −これにより、<td>からすべての要素が選択されます。 
- //div[@class = "slice"]−これにより、属性class = "slice"を含むdivからすべての要素が選択されます。 
次の表に示すように、セレクターには4つの基本的な方法があります。
| シニア番号 | 方法と説明 | 
|---|---|
| 1 | extract() 選択したデータとともにUnicode文字列を返します。 | 
| 2 | re() 正規表現が引数として指定されたときに抽出されたUnicode文字列のリストを返します。 | 
| 3 | xpath() セレクターのリストを返します。これは、引数として指定されたxpath式によって選択されたノードを表します。 | 
| 4 | css() セレクターのリストを返します。これは、引数として指定されたCSS式によって選択されたノードを表します。 | 
シェルでのセレクターの使用
組み込みのScrapyシェルを使用してセレクターをデモンストレーションするには、システムにIPythonをインストールする必要があります。ここで重要なことは、Scrapyの実行中にURLを引用符で囲む必要があるということです。そうしないと、「&」文字を含むURLが機能しません。プロジェクトの最上位ディレクトリで次のコマンドを使用して、シェルを起動できます-
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"シェルは次のようになります-
[ ... Scrapy log here ... ]
2014-01-23 17:11:42-0400 [scrapy] DEBUG: Crawled (200) 
<GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>(referer: None)
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x3636b50>
[s]   item       {}
[s]   request    <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   response   <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   settings   <scrapy.settings.Settings object at 0x3fadc50>
[s]   spider     <Spider 'default' at 0x3cebf50>
[s] Useful shortcuts:
[s]   shelp()           Shell help (print this help)
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects
[s]   view(response)    View response in a browser
In [1]:シェルが読み込まれると、response.bodyとresponse.headerをそれぞれ使用して、本体またはヘッダーにアクセスできます。同様に、response.selector.xpath()またはresponse.selector.css()を使用して、応答に対してクエリを実行できます。
たとえば-
In [1]: response.xpath('//title')
Out[1]: [<Selector xpath = '//title' data = u'<title>My Book - Scrapy'>]
In [2]: response.xpath('//title').extract()
Out[2]: [u'<title>My Book - Scrapy: Index: Chapters</title>']
In [3]: response.xpath('//title/text()')
Out[3]: [<Selector xpath = '//title/text()' data = u'My Book - Scrapy: Index:'>]
In [4]: response.xpath('//title/text()').extract()
Out[4]: [u'My Book - Scrapy: Index: Chapters']
In [5]: response.xpath('//title/text()').re('(\w+):')
Out[5]: [u'Scrapy', u'Index', u'Chapters']データの抽出
通常のHTMLサイトからデータを抽出するには、サイトのソースコードを調べてXPathを取得する必要があります。調べた後、データがにあることがわかりますul鬼ごっこ。内の要素を選択しますli 鬼ごっこ。
次のコード行は、さまざまなタイプのデータの抽出を示しています-
liタグ内のデータを選択するため-
response.xpath('//ul/li')説明を選択するために-
response.xpath('//ul/li/text()').extract()サイトタイトルの選択-
response.xpath('//ul/li/a/text()').extract()サイトリンクを選択するために-
response.xpath('//ul/li/a/@href').extract()次のコードは、上記のエクストラクタの使用法を示しています-
import scrapy
class MyprojectSpider(scrapy.Spider):
   name = "project"
   allowed_domains = ["dmoz.org"]
   
   start_urls = [
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
   ]
   def parse(self, response):
      for sel in response.xpath('//ul/li'):
         title = sel.xpath('a/text()').extract()
         link = sel.xpath('a/@href').extract()
         desc = sel.xpath('text()').extract()
         print title, link, desc