【问题标题】:web crawler url address failure网络爬虫url地址失败
【发布时间】:2014-06-09 19:21:44
【问题描述】:

我实现了一个简单的网络爬虫。我为已抓取的 url 链接获取了一个名为 crawled 的数组。您可能会在下面看到整个代码。该代码运行良好,但无法打印正确的链接。

import urllib2
def record_user_click(index,keyword,url):
    urls = lookup(index, url)
    if urls:
        for entry in index:
            if entry[0] == url:
                entry[1] = entry[1] + 1

def add_to_index(index, keyword, url):
    if keyword in index:
        index[keyword].append(url)
    else:
        index[keyword] = [url]


def get_page(url):
    try:
        import urllib2
        return urllib2.urlopen(url).read()
    except:
        return ""

def union(a, b):
    for e in b:
        if e not in a:
            a.append(e)

def get_next_target(page):
    start_link = page.find('<a href=' or '" href=')
    if start_link == -1:
        return None, 0
    start_quote = page.find('"', start_link)
    end_quote = page.find('"', start_quote + 1)
    url = page[start_quote + 1:end_quote]
    return url, end_quote

def get_all_links(page):
    links = []
    while True:
        url, endpos = get_next_target(page)
        if url:
            links.append(url)
            page = page[endpos:]
        else:
            break
    return links

def crawl_web(seed, max_pages=200):
    tocrawl = [seed]
    crawled = []
    graph = {}
    index = {}
    while tocrawl and len(crawled) < max_pages:
        page = tocrawl.pop()
        if page not in crawled:
            content = get_page(page)
            add_page_to_index(index, page, content)
            outlinks = get_all_links(content)
            graph[page] = outlinks
            union(tocrawl, outlinks)
            crawled.append(page)
    #print crawled
    return crawled, index, graph



def add_page_to_index(index, url, content):
    words = content.split()
    for word in words:
         add_to_index(index, word, url)


def lookup(index, keyword):
     if keyword in index:
         return index[keyword]
    return None


crawled,index, graph = crawl_web('http://en.wikipedia.org/wiki/Information')
print crawled

当我执行程序时,它会显示链接。输出中的最后一个 url 是 javascript:bgscro(3) 但它不是有效的 url。我该如何解决这个问题?

[..., 'javascript:bgscro(3)']

【问题讨论】:

    标签: python url web-crawler


    【解决方案1】:

    看起来它正在寻找一个实际上是用来触发 javascript 函数的链接。如果您想忽略这些情况,您可以将 get_all_links 函数编辑为 something 这个:

    def get_all_links(page):
        links = []
        while True:
            url, endpos = get_next_target(page)
            if url and not url.startswith("javascript:"): # ignore javascript
                links.append(url)
                page = page[endpos:]
            else:
                break
        return links
    

    或在处理之前过滤您的链接列表

    outlinks = filter(lambda x: not x.startswith("javascript:"), outlinks)
    

    你很有可能会遇到很多这样的边缘情况。

    【讨论】:

    • 杰克,我可以再问一个问题吗?我需要显示哪些网站链接其他网站,并按降序排列链接最多的网站(相同的网址)。你知道我该如何实现吗?
    • @Behzat 使用字典,其中 url 作为键,运行计数作为值。像这样:gist.github.com/jacktasia/23cc77168d64905f8b89 然后你只需要对很容易被谷歌搜索的数据进行排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多