0

私はScrapy 0.16.5のためPython 2.7に使用していますMac OSX Lion 10.7.5

私はかなり新しいですScrapy。私はいくつかのチュートリアルビデオを見てきましたが、それはいくつかの点で役に立ちましたが、現在のプロジェクトに関連する多くの質問に明確に答えることができませんでした.必要なデータを取得するソリューション。

私のプロジェクト:

そこで私は、BoxOfficeMojo.com にアクセスして、映画ごとに 4 つの異なる情報 (映画のタイトル、映画の URL、映画の公開日、映画の総収入) を取得するスクレーパーを作成することに取り組んでいます。次に、この情報を MySQL データベースに入れたいと思います。最初は、ここで見つけた 1 ページの映画を取得しようとしています。ご覧のとおり、これは映画 A ~ Ac のみです。最終的には、すべての A を取得し、次にすべての B を取得する必要があります。しかし、今のところ、これは最初のスクレーパーを構築するのに適しています。

パス:

したがって、映画の情報を投稿するだけになるため、ここに完全なパスを投稿することはできません。私が興味を持っているデータにつながるxpathは次のとおりです。

  //div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]
  //div[@id="body"]/div/table/tr/td/table/tr/td/table[2]

上記のリンク先のページに移動してソースを確認し、xpath をたどると、私が見ているものにたどり着きます。その長い文字列の最初の部分は、映画の文字 A から Z へのリンクであり、次に現在のページの映画とその情報です。

私のコード:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from BoxOfficeMojo.items import BoxofficemojoItem

class MojoSpider(BaseSpider):
   name = 'MojoSpider'
   allowed_domains = ['boxofficemojo.com']
   start_urls = ['http://www.boxofficemojo.com/movies/alphabetical.htm?letter=A&p=.htm']

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    print ('hxs:', hxs)
    titles = hxs.select('//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]') #was previously
    print ('rows:', rows)
    for title in titles:
        print ('title:', title)
        movie = title.select('/tr')
        print ('movie', movie)

    #print ('title:', titles)
    items = [] #previously = []
    #for title in titles:
        #item = BoxofficemojoItem()
        #item['title'] = title.select('/td/font/b/text()').extract() #Was:td/font/a/b/text()
        #item['link'] = title.select('/td/font/b/a/@href').extract()     #Was:td/font/a/@href
        #item['gross'] = title.select('/td/font/text()').extract()  #Was:td[3]/font/text()
        #item['release'] = title.select('/td/a/text()').extract() #Was: td[7]/font/a/text()
        #items.append(item)
    #return items

注:何が起こっているのかを理解するために、いくつかのことをコメントアウトし、印刷ステートメントを追加しました. コメント アウトされたセクションのアイデアは、タイトル セクションの各項目が映画になるということです。

実際に印刷されるもの:

コードが実行されたときに実際に出力されるのは次のとおりです。

 ('row:', <HtmlXPathSelector     xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="center" bgcolor="#dcdcdc"'>)
 ('cells:', [])
 ('row:', <HtmlXPathSelector   xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#ffffff"><'>)
 ('cells:', [])
 ('row:', <HtmlXPathSelector   xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#f4f4ff"><'>)
 ('cells:', [])
 ('row:', <HtmlXPathSelector xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#ffffff"><'>)
 ('cells:', [])
 ('row:', <HtmlXPathSelector xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#f4f4ff"><'>)
 ('cells:', [])

繰り返しますが、これは単なるマイナーな選択です。また、row最初にこれを行っていたときは、タイトルの代わりに持っていました-読みやすくしたかっただけです.

コメントアウトされたセクションを使用すると、常に空の辞書エントリがたくさん表示されます。

4

1 に答える 1

4

text() の代わりに string() と入力してください。うまくいきました。1 つの項目についてコードをテストしました。残りを分離することができます。

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    print ('hxs:', hxs)
    titles = hxs.select('//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr/td') #was previously
    #print ('title:', titles)
    items = [] #previously = []
    for title in titles:
        item = OnthegoItem()
        item['title'] = title.select('string()').extract() #Was:td/font/a/b/text()
        items.append(item)
    return items
于 2013-08-21T14:48:05.000 に答える