繁体   English   中英

如何将爬网的数据存储到数据库中

[英]How do I store crawled data into a database

我对python以及这个问题中我将要谈论的所有其他事物还很陌生,但是我想开始一个我已经考虑了一段时间的项目。 基本上,我想对Web进行爬网,并在对URL进行实时爬网时以及在网页上实时显示它们。 我编写了一个简单的搜寻器,将网址存储在列表中。 我想知道如何将此列表添加到数据库中,并每隔x秒更新一次数据库,以便可以访问该数据库并定期在网页上输出链接列表。

我对实时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

而不是将URL放入列表中,为什么不将它们直接写入db? 使用例如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()

这样,您就不必像管道一样管理列表。 但是,如果有必要,也可以对该方法进行调整。

对于具有内置列表结构的Redis来说 ,这听起来不错。 要将新的url附加到列表中,方法很简单:

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

要查看哪些网址正在排队进行爬网,请执行以下操作:

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

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

为此,您需要Cron。 cron是用于类Unix计算机的作业调度程序。 您可以安排一份定时工作,每分钟,每小时,每天等等。

请查看本教程http://newcoder.io/scrape/intro/ ,它将帮助您在此处实现所需的目标。

谢谢。 信息,如果它工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM