【问题标题】:Adding counter to my Python Web Crawler向我的 Python Web Crawler 添加计数器
【发布时间】: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&lt;steps: 中更改while i&lt;len(urls)

但即使数字显示为 3,那也只会进入第一级...

欢迎任何建议

【问题讨论】:

  • 只是为了检查一下:您是否知道开源项目scrapy - 以节省您重新发明轮子...
  • 当您想从多个站点获取链接时,scrapy 好吗?在此示例中,我仅从一个 url 获取链接,但实际上我有多个地址要废弃
  • 它是高度可配置的......只要告诉它允许的域和东西,有多少蜘蛛等等......等等......如果你想正确地做到这一点,并且不怕小学习曲线,我会把你的时间花在一些基本的例子上并学习它......
  • 会检查一下,但现在我的工作时间有限,所以我必须使用这段代码......
  • 很公平,但我有一种奇怪的感觉,当你重组代码以适应你想要做的事情时,你已经能够做到了;) 不过祝你好运...

标签: python web-crawler


【解决方案1】:

如果您想搜索某个“深度”,请考虑使用递归函数,而不是仅仅附加一个 URL 列表。

def crawl(url, depth):
  if depth <= 3:
    #Scan page, grab links, title
    for link in links:
      print crawl(link, depth + 1)
  return url +"\n"+ title

这样可以更轻松地控制递归搜索,并且速度更快,资源占用更少:)

【讨论】:

  • 我不确定我应该如何将这个递归函数放在我的程序中......我在 python 中有点小菜鸟,所以我遇到了很多错误。例如,你能把它写成pastebin.com吗?
猜你喜欢
  • 2011-07-26
  • 2022-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多