【发布时间】:2013-08-06 16:38:59
【问题描述】:
我制作了一个网络爬虫,它为给定地址中的所有网站提供链接和链接文本,如下所示:
import urllib
from bs4 import BeautifulSoup
import urlparse
import mechanize
url = ["http://adbnews.com/area51"]
for u in url:
br = mechanize.Browser()
urls = [u]
visited = [u]
i = 0
while i<len(urls):
try:
br.open(urls[0])
urls.pop(0)
for link in br.links():
levelLinks = []
linkText = []
newurl = urlparse.urljoin(link.base_url, link.url)
b1 = urlparse.urlparse(newurl).hostname
b2 = urlparse.urlparse(newurl).path
newurl = "http://"+b1+b2
linkTxt = link.text
linkText.append(linkTxt)
levelLinks.append(newurl)
if newurl not in visited and urlparse.urlparse(u).hostname in newurl:
urls.append(newurl)
visited.append(newurl)
#print newurl
#get Mechanize Links
for l,lt in zip(levelLinks,linkText):
print newurl,"\n",lt,"\n"
except:
urls.pop(0)
它得到这样的结果:
http://www.adbnews.com/area51/contact.html
CONTACT
http://www.adbnews.com/area51/about.html
ABOUT
http://www.adbnews.com/area51/index.html
INDEX
http://www.adbnews.com/area51/1st/
FIRST LEVEL!
http://www.adbnews.com/area51/1st/bling.html
BLING
http://www.adbnews.com/area51/1st/index.html
INDEX
http://adbnews.com/area51/2nd/
2ND LEVEL
我想添加一个可以限制爬虫深度的计数器..
我尝试添加例如steps = 3 并在while i<steps: 中更改while i<len(urls)
但即使数字显示为 3,那也只会进入第一级...
欢迎任何建议
【问题讨论】:
-
只是为了检查一下:您是否知道开源项目scrapy - 以节省您重新发明轮子...
-
当您想从多个站点获取链接时,scrapy 好吗?在此示例中,我仅从一个 url 获取链接,但实际上我有多个地址要废弃
-
它是高度可配置的......只要告诉它允许的域和东西,有多少蜘蛛等等......等等......如果你想正确地做到这一点,并且不怕小学习曲线,我会把你的时间花在一些基本的例子上并学习它......
-
会检查一下,但现在我的工作时间有限,所以我必须使用这段代码......
-
很公平,但我有一种奇怪的感觉,当你重组代码以适应你想要做的事情时,你已经能够做到了;) 不过祝你好运...
标签: python web-crawler