0

私はPythonと、この質問で話そうとしていることすべてにかなり慣れていませんが、いつか考えていたプロジェクトを始めたいと思っています。基本的に、Web をクロールして、Web ページ上でリアルタイムにクロールされたときに URL を表示したいと考えています。URL をリストに保管する単純なクローラーをコーディングしました。このリストをデータベースに取得し、x 秒ごとにデータベースを更新して、データベースにアクセスし、Web ページ上のリンクのリストを定期的に出力できるようにする方法を考えていました。

リアルタイムの Web 開発についてはあまり詳しくありませんが、それはまた別の機会にします。しかし今は、リストをデータベースに取り込む方法の方が心配です。私は現在、とても使いやすいweb2pyフレームワークを使用していますが、どこを見るべきか、どのフレームワークをチェックすべきかについて何か推奨事項がある場合は...回答にもコメントしてください、ありがとう。

一言で言えば、私が初心者であることは、Python、データベース、リアルタイム Web 開発です。

とにかく役立つ場合は、これが私のクローラーのコードです:)ありがとう

from urllib2 import urlopen
def crawler(url,x):
    crawled=[]
    tocrawl=[]
    def crawl(url,x):
        x=x+1
        try:
            page = urlopen(url).read()
            findlink = page.find('<a href=')
            if findlink == -1:
                return None, 0
            while findlink!=-1:
                start = page.find(('"'), findlink)
                end = page.find(('"'), start+1)
                link = page[start+1:end]
                if link:
                    if link!=url:
                        if link[0]=='/':
                            link=url+link
                            link=replace(link)
                        if (link not in tocrawl) and (link!="") and (link not in crawled):
                            tocrawl.append(link)
                findlink = page.find('<a href=', end)
            crawled.append(url)
            while tocrawl:
                crawl(tocrawl[x],x)
        except:
            #keep crawling
            crawl(tocrawl[x],x)
    crawl(url,x)


def replace(link):
    tsp=link.find('//')
    if tsp==-1:
        return link
    link=link[0:tsp]+'/'+link[tsp+2:]
    return link
4

3 に答える 3

0

これを実現するには、Cron が必要です。cron は、Unix ライクなコンピューター用のジョブ スケジューラです。毎分、毎時間、毎日などのように cron ジョブをスケジュールできます。

このチュートリアルhttp://newcoder.io/scrape/intro/を確認すると、ここで必要なものを達成するのに役立ちます。

ありがとう。動作するかどうかの情報。

于 2014-02-03T13:16:58.030 に答える
0

URL をリストに入れる代わりに、データベースに直接書き込んでみませんか? たとえばmysqlを使用:

import MySQLdb
conn = MySQLdb.connect('server','user','pass','db')
curs = conn.cursor()
sql = 'INSERT into your_table VALUES(%s,%s)' %(id,str(link))
rc = curs.execute(sql)
conn.close()

これにより、パイプのようにリストを管理する必要がなくなります。しかし、それが必要な場合は、これをその方法に適応させることもできます。

于 2012-06-21T17:49:00.617 に答える
0

これは、リスト構造が組み込まれているRedisにとっては良い仕事のように思えます。リストに新しい URL を追加するには、次のように簡単です。

from redis import Redis
red = Red()

# Later in your code...
red.lpush('crawler:tocrawl', link)

また、クロールしたWebサイトを効率的にチェックしたり、複数のクローラーを同期させたりできるセットタイプもあります。

# Check if we're the first one to mark this link
if red.sadd('crawler:crawled', link):
    red.lpush('crawler:tocrawl', link)

クロールする次のリンクを取得するには:

url = red.lpop('crawler:tocrawl')

クロールするためにキューに入れられている URL を確認するには:

print red.lrange('crawler:tocrawl', 0, -1)

これは 1 つのオプションにすぎませんが、非常に高速で柔軟です。詳細なドキュメントは、redis python ドライバーページにあります。

于 2012-06-21T17:49:28.473 に答える