この質問の見出しをさらに詳しく説明すると、映画の Web サイトから情報を収集しています。現在、MySQL
データベースに 、 などが入力movie titles
さmovie urls
れています。データベースからそれらを取得し、 new 内にurls
my として設定します。それぞれが [insert abritrary movie] のウェブページへのリンクで、より多くの情報が伝えられます。私が興味を持っている情報は次のとおりです。start_urls
spider
url
- ディストリビューター (つまり Fox)
- 評価 (つまり、Pg-13)
- 監督
- ジャンル(コメディ)
- 俳優
- プロデューサー
これらのうち、配給業者、評価、監督、およびジャンルには、各映画の Web ページから関連付けられた 1 つの「もの」があります (1 つの評価、1 つの監督など)。もちろん、複数の俳優と、場合によっては複数のプロデューサー (より有名な映画/ほとんどの映画) が登場します。これは私が問題を抱えているところです。pipeline' which puts each piece of info in an appropriate
テーブルwithin my
MySQLdatabase. 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
ただし、これがこれを行うための最良の方法であり、提案を本当に感謝するかどうかはわかりません。