我对python以及我将要在这个问题中谈论的所有其他事情都相当新,但我想开始一个我一直在思考的项目。基本上我想抓取网页并在网页上实时抓取网址时显示网址。我编写了一个简单的爬虫,它将URL存储在一个列表中。我想知道如何将此列表放入数据库并每隔x秒更新一次数据库,以便我可以访问数据库并定期输出网页上的链接列表。
我对实时网络开发知之甚少,但这是另一天的主题。但是现在,我更关心如何将列表放入数据库。我目前正在使用很容易相处的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
答案 0 :(得分: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()
这样您就不必像管道一样管理列表。但如果有必要,这也可以适用于该方法。
答案 1 :(得分: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')
要查看排队等待抓取的网址:
print red.lrange('crawler:tocrawl', 0, -1)
它只是一个选项,但它非常快速和灵活。您可以在redis python driver页面找到更多文档。
答案 2 :(得分:0)
要实现这一目标,你需要一个Cron。 cron是类Unix计算机的作业调度程序。你可以安排一个cron工作去每分钟,每小时,每天等等。
查看本教程http://newcoder.io/scrape/intro/,它将帮助您实现目标。
感谢。信息是否有效。