0

我对 python 和我将在这个问题中讨论的所有其他内容相当陌生,但我想开始一个我一直在考虑的项目。基本上我想抓取网页并在网页上实时抓取网址时显示网址。我编写了一个简单的爬虫,它将 URL 存储在一个列表中。我想知道如何将此列表放入数据库并每 x 秒更新一次数据库,以便我可以访问数据库并定期在网页上输出链接列表。

我对实时 Web 开发知之甚少,但这是另一天的话题。不过现在,我更关心如何将列表放入数据库。我目前正在使用很容易相处的 web2py 框架,但是如果你们对我应该在哪里查看,我应该检查哪些框架有任何建议......请在你的答案中也发表评论,谢谢。

简而言之,我不擅长的事情是:Python、数据库、实时网络开发。

这是我的爬虫的代码,如果它有帮助的话:)谢谢

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

与其将 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来说,这听起来不错。要将新网址附加到您的列表中,它很简单:

from redis import Redis
red = Red()

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

它还有一个设置类型,可以让你有效地检查你爬过哪些网站,并让你同步多个爬虫。

# 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)

它只是一种选择,但它非常快速和灵活。您可以在redis python 驱动程序页面上找到更多文档。

于 2012-06-21T17:49:28.473 回答
0

要实现这一点,您需要一个 Cron。cron 是类 Unix 计算机的作业调度程序。您可以安排每分钟、每小时、每天等执行一次 cron 作业。

查看本教程http://newcoder.io/scrape/intro/,它将帮助您在这里实现您想要的。

谢谢。信息是否有效。

于 2014-02-03T13:16:58.030 回答