10

この質問の見出しをさらに詳しく説明すると、映画の Web サイトから情報を収集しています。現在、MySQLデータベースに 、 などが入力movie titlesmovie urlsれています。データベースからそれらを取得し、 new 内にurlsmy として設定します。それぞれが [insert abritrary movie] のウェブページへのリンクで、より多くの情報が伝えられます。私が興味を持っている情報は次のとおりです。start_urlsspiderurl

  • ディストリビューター (つまり Fox)
  • 評価 (つまり、Pg-13)
  • 監督
  • ジャンル(コメディ)
  • 俳優
  • プロデューサー

これらのうち、配給業者、評価、監督、およびジャンルには、各映画の Web ページから関連付けられた 1 つの「もの」があります (1 つの評価、1 つの監督など)。もちろん、複数の俳優と、場合によっては複数のプロデューサー (より有名な映画/ほとんどの映画) が登場します。これは私が問題を抱えているところです。pipeline' which puts each piece of info in an appropriateテーブルwithin myMySQLdatabase. So, a table for director, a table for rating, etc. Each table will also have映画のタイトル`を確立したい. このように問題自体を述べることができます:

適切な と適切な を構築する方法を調整するのに問題pipelineがありますspider。1 つのスパイダーから複数のものを返して別のものに送信できるかどうかpipelines(属性を処理するために別のアイテムを作成しsingle、「複数の」属性を処理するために別のアイテムを作成する)、または同じパイプラインを使用して何らかの方法で指定するかどうかはわかりません。何がどこにあるのか(スクレイピング後に1つしか返せないかどうかはわかりません)。コードを表示して、問題がより明確になることを願っています。*注: まだ完全ではありません。これを行う方法で空欄を埋めようとしています。

クモ:

  class ActorSpider(BaseSpider):
  import sys; sys.path.append("/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages")
  import MySQLdb
  db = MySQLdb.connect(db = 'testdb', user='testuser', passwd='test')
  dbc = db.cursor()
  name = 'ActorSpider'
  allowed_domains = ['movie website']
  #start_urls = #HAVE NOT FILLED THIS IN YET- WILL BE A SELECT STATEMENT, GATHERING ALL URLS

  def parse(self, response):

      hxs = HtmlXPathSelector(response)

      #Expect only singular items (ie. one title, one rating, etc.)

      single_info = SingleItem()
      title = hxs.select('[title tags here]').extract()
      distributor = hxs.select('[distributor tags here]').extract()
      rating = hxs.select('[rating tags here]').extract()
      director = hxs.select('[director tags here]').extract()
      genre = hxs.select('[genre tags here]').extract()

      single_items = []
      single_info['title'] = title
      single_info['distributor'] = distributor
      single_info['rating'] = rating
      single_info['director'] = director
      single_info['genre'] = genre        
      single_items.append(single_info) #Note: not sure if I want to return this or the single info

      #return single_items


      #Multiple items in a field

      multi_info = MultiItem()
      actors = hxs.select('[actor tags here]').extract()
      producers = hxs.select('[producer tags here]').extract()

      actor_items= []
      for i in range(len(actors)):
          multi_info['title'] = title
          multi_info['actor'] = actors[i]
          actor_items.append(multi_info)

     #return actor_items - can I have multiple returns in my code to specify which pipeline is used, or which table this should be inserted into

      producer_items = []
      for i in range(len(producers)):
          multi_info['title'] = title
          multi_info['producer'] = producers[i]
          producer_items.append(multi_info)
      #return producer_items - same issue - are multiple returns allowed? Should I try to put both the 'single items' and 'multiple items' in on big 'items' list?  Can scrapy figure that out or how would I go about specifying?

不明確な可能性のある多くの質問にコメントしました-適切なテーブルに収まるようにすべてを指示する方法がわかりません. これは、次のパイプラインを読むとより明確になる場合があります。

 class IndMoviePipeline(object):

     def __init__(self):
        'initiate the database connnection'
        self.conn = MySQLdb.connect(user='testuser', passwd='test', db='testdb', host='localhost', charset='utf8', use_unicode=True)
        self.cursor = self.conn.cursor()

    def process_item(self, item, spider):

         try:
             if 'producer' in item:
                  self.cursor.execute("""INSERT INTO Producers (title, producer) VALUES (%s, %s)""", (item['title'], item['producer']))
             elif 'actor' in item:
                  self.cursor.execute("""INSERT INTO Actors (title, actor) VALUES (%s, %s)""", (item['title'], item['actor']))
             else:
                  self.cursor.execute("""INSERT INTO Other_Info (title, distributor, rating, director, genre) VALUES (%s, %s, %s, %s, %s)""", (item['title'], item['distributor'], item['rating'], item['director'], item['genre'])) #NOTE: I will likely change 'Other_Info' table to just populating the original table from which the URLS will be pulled
             self.conn.commit()
         except MySQLdb.Error, e:
             print "Error %d: %s" % (e.args[0], e.args[1])

         return item

itemをデータベース内の適切なものに誘導することでうまくいくと思いtableます。itemsこれに基づいて、1 つの大きなリストを作成し、それにすべてを追加するとうまくいくと思います。

 items = []
 items.append(single_info)

 for i in range(len(producers)):
      multi_info['title'] = title
      multi_info['producer'] = producers[i]
      items.append(multi_info)

 for i in range(len(actors)):
      multi_info['title'] = title
      multi_info['actor'] = actors[i]
      items.append(multi_info)

これらのステートメントpipelineでこれをすべて整理するだけです。ifただし、これがこれを行うための最良の方法であり、提案を本当に感謝するかどうかはわかりません。

4

1 に答える 1