-1

我有一个大学网址列表等www.harvard.edu, www.berkeley.edu。我需要在各自的网站中找到 cse 部门网址我最初打算做的是通过给定的 url 中的链接并通过指定深度来爬行,比如 3 它会跟随链接并尝试在该页面上抓取的链接中查找 cse 或计算机或单词列表,匹配链接及其锚文本作为结果返回到 csv 文件中。如果没有包含 cse 的链接或这样的词,它应该返回 not found 或类似的想法是稍后将 csv 文件推送到数据库中。我怎样才能做到这一点?

4

2 回答 2

0

为了解决您的问题,您可以使用scrapy框架。

从scrapy web中提取:

Scrapy 是一个快速的高级屏幕抓取和网络抓取框架,用于抓取网站并从其页面中提取结构化数据。它可用于广泛的用途,从数据挖掘到监控和自动化测试。

于 2012-11-07T11:00:28.150 回答
0

这是一项相当复杂的任务,我建议使用如下结构的数据库:

TABLE pages (
    `absolute_url` VARCHAR(255) NOT NULL,
    `visited` TINYINT(1) DEFAULT 0,
    -- Additional fields
    UNIQUE KEY (`absolute_url`)
)

小解释:

  • absolute_url包含页面的完整 URL(以 开头http[s]://)并在其上放置了唯一索引。这样你就可以确保你不会递归或处理多个链接两次
  • visited通知您网站是否已被访问(和处理)。该字段对于防止再次访问非常重要,并允许您在程序崩溃(即网络停机)时优雅地恢复

你可以通过 CSV 自己实现这些东西,或者关联数组,但数据库对我来说是最熟悉的解决方案。

该算法将如下所示:

database.insert( 'http://www.harvard.edu')
database.insert( 'http://www.berkeley.edu')

# In case of failure you'll start at this point:
while database.get_count( WHERE visited = 0) < 0:

    for url in database.get_records( WHERE visited = 0):
        content = http_client.load(url)
        time.sleep(5) # You don't want to flood server

        # Problematic URLs will be parsed later
        if (not content) or (http_client.is_error):
            continue; 

        for i in content.get_all_urls():
            i = make_absolute(i, url)

            # Also don't crawl remote sites, images, ...
            if not is_valid_url(i):
                continue
            database.insert(i)

这是伪代码,我不会全部为你实现。

于 2012-11-07T11:10:18.330 回答