2011-01-18 7 views
4

私は価格競争力を維持するために、競合するウェブサイトを疑似追跡するアプリケーションを作成することを考えています。私はおそらくGoogleショッピング検索APIを使って見ましたが、柔軟性に欠けており、競合他社のすべてが定期的に完全にリストアップされたり更新されたりするわけではありません。Webクローラーは競争力のある価格で

私の質問は、PHPベースのWebクローラーで始めるのに適していますか?私は明らかに(たとえ競合他社にも)敬意を表しているクローラを望んでいるので、うまくいけばロボットのことに従います。テキストとスロットリング。 (公平には、私はサードパーティのサーバでこれをホストし、バイアスを見せないように私たちのウェブサイトをクロールするつもりだと思う)私はグーグル経由で見て、成熟したパッケージを見つけることができなかった。ベータまたはアルファとしてラベル付けされているにもかかわらず、1年以上も維持されていないsourceforgeスクリプトを書きました。

アイデアや提案をお探しですか? ありがとう

+0

Amazon WebサービスのAPIを調べましたか? – dqhendricks

+1

@dqhendricks私は明らかにAWSについて聞いたことがありますが、あなたはコンピューティングパワーのためにそれらを使用することを提案していますか?または私は気付いていないクローラAPIを持っていますか? – Brandon0

+0

私はあなた自身の製品を巡回して、アマゾンでそれぞれの価格をapiで調べることを提案していました。 – dqhendricks

答えて

1

クローラ自体は複雑ではありません。サイトをロードして、見つけたリンクを評価して追跡するだけです。

"フレンドリー"になるためには、トロールを予定しているサイトごとにクローラを作成することが目的です。言い換えれば、1つのサイトを選択し、それらの構造がどのようになっているかを確認しますその構造のgetリクエストとhtml解析をコード化してください。他のサイトについてはすすぎ、繰り返してください。

一般的なショッピングカートソフトウェア(ここでは何かが可能です)を使用している場合、明らかに再利用のビットがあります。

クロールするときは、ピーク時間外にサイトをヒットすることができます(これは推測になります)。また、500 /秒のリクエストを実行しないでください。それをかなり下げてください。

これらの他のサイトに連絡して、いくつかの直接データ共有に参加するかどうかを検討することもできます。理想は、誰もが自分の製品のRSSフィードを持っていることです。

もちろん、これを販売している人に応じて、価格の修正と考えられるかもしれません...だから、慎重に進んでください。

+0

競争はかなり強く、私は彼ら自身に助けを求めたくはありませんが、私は各サイトで見つけられるライブフィードを使用します。そして、各サイトのカスタムクローラを構築する(または少なくともサイト固有のルールを設定する)ことは正しいです。特定のDOMノードへのリンクを制限して、ショッピング以外のページをクロールする時間を無駄にしないようにする必要があります。 – Brandon0

0

効率的なクローラを探しているだけなら、この1つを使用できます。このクローラは素晴らしいサーバーで300秒以内に約10,000のWebページをクロールできます。これはPythonで、同様のカールの実装もPHPで利用できます。PHPが効率的なクローラを考える際に重要な点であるマルチスレッドをサポートしていないことを理解していただければと思います。

#! /usr/bin/env python 
# -*- coding: iso-8859-1 -*- 
# vi:ts=4:et 
# $Id: retriever-multi.py,v 1.29 2005/07/28 11:04:13 mfx Exp $ 

# 
# Usage: python retriever-multi.py <file with URLs to fetch> [<# of 
#   concurrent connections>] 
# 

import sys 
import pycurl 

# We should ignore SIGPIPE when using pycurl.NOSIGNAL - see 
# the libcurl tutorial for more info. 
try: 
    import signal 
    from signal import SIGPIPE, SIG_IGN 
    signal.signal(signal.SIGPIPE, signal.SIG_IGN) 
except ImportError: 
    pass 


# Get args 
num_conn = 10 
try: 
    if sys.argv[1] == "-": 
     urls = sys.stdin.readlines() 
    else: 
     urls = open(sys.argv[1]).readlines() 
    if len(sys.argv) >= 3: 
     num_conn = int(sys.argv[2]) 
except: 
    print "Usage: %s <file with URLs to fetch> [<# of concurrent connections>]" % sys.argv[0] 
    raise SystemExit 


# Make a queue with (url, filename) tuples 
queue = [] 
for url in urls: 
    url = url.strip() 
    if not url or url[0] == "#": 
     continue 
    filename = "doc_%03d.dat" % (len(queue) + 1) 
    queue.append((url, filename)) 


# Check args 
assert queue, "no URLs given" 
num_urls = len(queue) 
num_conn = min(num_conn, num_urls) 
assert 1 <= num_conn <= 10000, "invalid number of concurrent connections" 
print "PycURL %s (compiled against 0x%x)" % (pycurl.version, pycurl.COMPILE_LIBCURL_VERSION_NUM) 
print "----- Getting", num_urls, "URLs using", num_conn, "connections -----" 


# Pre-allocate a list of curl objects 
m = pycurl.CurlMulti() 
m.handles = [] 
for i in range(num_conn): 
    c = pycurl.Curl() 
    c.fp = None 
    c.setopt(pycurl.FOLLOWLOCATION, 1) 
    c.setopt(pycurl.MAXREDIRS, 5) 
    c.setopt(pycurl.CONNECTTIMEOUT, 30) 
    c.setopt(pycurl.TIMEOUT, 300) 
    c.setopt(pycurl.NOSIGNAL, 1) 
    m.handles.append(c) 


# Main loop 
freelist = m.handles[:] 
num_processed = 0 
while num_processed < num_urls: 
    # If there is an url to process and a free curl object, add to multi stack 
    while queue and freelist: 
     url, filename = queue.pop(0) 
     c = freelist.pop() 
     c.fp = open(filename, "wb") 
     c.setopt(pycurl.URL, url) 
     c.setopt(pycurl.WRITEDATA, c.fp) 
     m.add_handle(c) 
     # store some info 
     c.filename = filename 
     c.url = url 
    # Run the internal curl state machine for the multi stack 
    while 1: 
     ret, num_handles = m.perform() 
     if ret != pycurl.E_CALL_MULTI_PERFORM: 
      break 
    # Check for curl objects which have terminated, and add them to the freelist 
    while 1: 
     num_q, ok_list, err_list = m.info_read() 
     for c in ok_list: 
      c.fp.close() 
      c.fp = None 
      m.remove_handle(c) 
      print "Success:", c.filename, c.url, c.getinfo(pycurl.EFFECTIVE_URL) 
      freelist.append(c) 
     for c, errno, errmsg in err_list: 
      c.fp.close() 
      c.fp = None 
      m.remove_handle(c) 
      print "Failed: ", c.filename, c.url, errno, errmsg 
      freelist.append(c) 
     num_processed = num_processed + len(ok_list) + len(err_list) 
     if num_q == 0: 
      break 
    # Currently no more I/O is pending, could do something in the meantime 
    # (display a progress bar, etc.). 
    # We just call select() to sleep until some more data is available. 
    m.select(1.0) 


# Cleanup 
for c in m.handles: 
    if c.fp is not None: 
     c.fp.close() 
     c.fp = None 
    c.close() 
m.close() 

完全な価格比較システムをお探しの場合、実際にはウェブ上でカスタマイズされた洗練されたプロジェクトを求めています。あなたがこれを自由にすることに関心があるなら、私に連絡することができます:)

関連する問題