如何抓取各种网站使用Python查找特定部门?

时间:2012-11-07 10:53:53

标签: python web-crawler

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

2 个答案:

答案 0 :(得分:0)

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

从scrapy网站中提取:

  

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

答案 1 :(得分:0)

这是一项非常复杂的任务,我建议使用数据库使用这样的结构:

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

小解释:

  • absolute_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)

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