2017-07-13 10 views
0

私は20以上のリストから製品情報(価格、場所、名前など)を集めるWebスクレイピングプロジェクトに取り組んでいます。ウェブサイト...これまで私はジェネリックMasterSpider(ここで議論されているものに似ています:Creating a generic scrapy spider)を作成しました。そこから、サイトの特定のアーキテクチャに応じて継承してオーバーライドします。スケーラブルなスパイダーを開発する - 要素のプロパティでXpathを抽出する

しかし、本質的に多くのコードを繰り返して、このプロジェクトをスケーラブルにしたかったので、私はMaterSpiderを他のウェブサイトに拡張できるようにして、start_urlのような最小限の議論で理想的にインスタンス化しました。言い換えれば、ドメイン間で一貫しないXpathで要素を特定する代わりに、htmlタグ属性値/テキスト値を探しています。

これは、スタートページ(通常リンクのカテゴリを含む)からカテゴリのリンクを特定するなどの一般的で一貫性のあるターゲットでは問題ありませんが、商品名、価格などを見つけるのに欠けています。 @class = aまたはbまたはc/contains(。、 'a')やcontains(。、 'b')などのようなxp​​ath条件のリストを作成しなければならないという目的は敗北します。

...私はまた、私はしなければならないかもしれクモをインスタンス化するためにいくつかのXPath条件を渡すことができます実現が、私は可能な限り、これはのように使いやすく、拡張可能にすることを好むだろう

マイアイデアは個々の製品ページを解析する前に、私が望む情報を探すダミー要求を発行し、実際に情報のxpathを識別するために後方に働きます。

私は要素のXパスを抽出する方法についての良いアイディアがあれば、それが含むタグの値のリスト、またはテキストの一致を言うことができますか?しかし、それは解決策よりもバンド援助のほうが大きく、それほどスケーラブルではありません。これを行うためにセレンまたはパーサーのようなものを使用する必要がある場合は、これもオプションです...

本当にアイデアやフレッシュな見通しがあります。

ありがとうございます!

答えて

0

仕事では、何千ものニュースウェブサイトを掻き集めなければならないし、すべての解決策に合う人はいないだろう。だから私たちの戦略はヒューリスティックを使って必要な情報を抽出しようとする、そして面倒なウェブサイトについてはそのウェブサイトの特定のxpathのリストを持つという、「ジェネリック」な方法をとることでした。

parsers = { 
    "domain1": { 
     "item1": "//div...", 
     "item2": "//div...", 
    }, 
    "domain2": { 
     "item1": "//div...", 
     "item2": "//div...", 
    }, 
} 

def parse(self, response): 
    domain = urlparse(response.url).netloC# urlparse comes from urllib.parse 
    try: 
     parser = self.parsers[domain] 
     return self.parse_with_parser(response, parser) 
    except Exception as e: 
     return self.parse_generic(response) 

パーサは、私が実際には別のファイルに保つのdict:

だから、私たちの一般的な構造は、このようなものです。データベースやファイルに保存しておき、スパイダーがロードされているときに情報にアクセスして、何かを変更する必要があるたびにクローラを編集する必要はありません。

編集:

は、あなたの質問の後半部分に答える、あなたが完了必要なものに応じて、あなたのアカウントにいくつかの条件を取るXPathを書くことができます。例えば:

"//a[contains(@class, 'foo') or contains(@class, 'bar')]" 

多分

"//a[contains(@class, 'foo') or contains(@class, 'bar')] | //div[@class='something'] | //td/span" 

pipe operator "|"抽出したいものが含まれているかもしれないさまざまな表現を「連鎖」することができます。 Aおよび/または異なる式に対する操作

+0

そうすれば、「ヒューリスティックを使って必要な情報を抽出しようとする」より具体的にすることができます...パースジェネリッククラスのように、xpathなしで情報をどのように抽出していますか?特定の属性値/テキストを含むhtmlタグを探しているだけですか、それよりも複雑です – bobsaget123

+0

これはドメイン固有のもので、多くのテスト/試行錯誤があります。たとえば、記事のタイトルを抽出するには、いくつかの場所(タイトルタグ、og:タイトルメタ、いくつかのxpaths、いくつかのタグを試してみる)を調べ、実際に正しいタイトルがあると信じるべきときのルールを設定します。 –

+0

あなたのニーズに合った何かで私の答えを編集し、良いヒューリスティックスよりも達成するのが難しい/難しいです –

関連する問題