专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Perl/Python

python深度爬行URL的有关问题

发布时间:2011-06-29 20:10:01 文章来源:www.iduyao.cn 采编人员:星星草
python深度爬行URL的问题
Python code
#!python
# encoding: gbk
from urllib import urlopen
import re
import urllib
import urlparse
import HTMLParser

def catchUrl(url):
#获取源文件
    sourceFile = urlopen(url).read()
#正则过滤
    rUrl = re.compile(r'href=\"([^^]*?)\".')
    webUrl = rUrl.findall(sourceFile)
#提出URL后判断输出
    for i in webUrl:
    if i.startswith("/"):
        print i
            if len(i) != 0:
                catchUrl(url+i)

url = raw_input("请输入需要检测的URL:")
catchUrl(url)






这个是我自己写的代码,大概就是获取页面源文件,然后正则过滤出该网站的URL。然后递归调用从过滤出的URL中再获取源文件然后继续递归调用。类似于给你一个页面然后1个页面爬出N个页面,N个页面爬出N*N个页面。现在遇到的情况就是,我递归爬行中有很多重复的URL,然后这些重复的URL也被继续递归下去,然后就构成死循环。开始是想把URL保存到数组里面,每次递归的时候判断数组中是否有重复。但是我自己写这段话的时候老是出错,在线各位高手帮帮忙。

------解决方案--------------------
我开始觉得用全局变量来保存url好像不太好,但是刚才搜索了个例子,看到别人也是用保存到全局变量的方法来判断是否重复的。我只是大概看了下那个例子,没有很仔细看。好像是用集合操作来去除重复的url
你可以看看:
http://sanss.me/blog/10
------解决方案--------------------
出错的代码也要贴出来,另外贴python代码缩进要弄对,否则意思全乱了。

可以再给catchUrl加一个参数processedURL,记录下载过的url。

Python code

def catchURL(url, processedURL):
  # 从url获取文件
  ...
  processedURL.add(url) #当前url已经下载过了,记录在processedURL中
  # 提取url
  URLList = ...
  # 处理这些url
  for nextURL in URLList:
    if nextURL not in processedURL:
      catchURL(nextURL, processedURL)

# 这样调用
catchURL(firstURL, set())

------解决方案--------------------

# encoding: utf-8

...

from Storage import storage
# 参考 http://blog.csdn.net/tim_spac/article/details/7006142


def getUrlContent(url):
content = storage[url] or webRetrieve(url)
if content:
return [lnk for lnk in parserHref(content) if lnk not in storeage.keys()]

...

------解决方案--------------------
list(set(a)),可以得到a的无重复元素列表
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: