前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1236. 网络爬虫(BFS/DFS)

LeetCode 1236. 网络爬虫(BFS/DFS)

作者头像
Michael阿明
发布2021-02-19 10:12:04
8310
发布2021-02-19 10:12:04
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

给定一个链接 startUrl 和一个接口 HtmlParser ,请你实现一个网络爬虫,以实现爬取同 startUrl 拥有相同 域名标签 的全部链接。该爬虫得到的全部链接可以 任何顺序 返回结果。

你的网络爬虫应当按照如下模式工作:

  • 自链接 startUrl 开始爬取
  • 调用 HtmlParser.getUrls(url) 来获得链接url页面中的全部链接
  • 同一个链接最多只爬取一次
  • 只输出 域名 与 startUrl 相同 的链接集合
在这里插入图片描述
在这里插入图片描述

如上所示的一个链接,其域名为 example.org。 简单起见,你可以假设所有的链接都采用 http协议 并没有指定 端口。 例如,链接 http://leetcode.com/problems 和 http://leetcode.com/contest 是同一个域名下的, 而链接http://example.org/test 和 http://example.com/abc 是不在同一域名下的。

代码语言:javascript
复制
HtmlParser 接口定义如下: 

interface HtmlParser {
  // 返回给定 url 对应的页面中的全部 url 。
  public List<String> getUrls(String url);
}

下面是两个实例,用以解释该问题的设计功能,对于自定义测试,你可以使用三个变量 urls, edges 和 startUrl。 注意在代码实现中,你只可以访问 startUrl ,而 urls 和 edges 不可以在你的代码中被直接访问。

示例 1:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
输入:
urls = [
  "http://news.yahoo.com",
  "http://news.yahoo.com/news",
  "http://news.yahoo.com/news/topics/",
  "http://news.google.com",
  "http://news.yahoo.com/us"
]
edges = [[2,0],[2,1],[3,2],[3,1],[0,4]]
startUrl = "http://news.yahoo.com/news/topics/"
输出:[
  "http://news.yahoo.com",
  "http://news.yahoo.com/news",
  "http://news.yahoo.com/news/topics/",
  "http://news.yahoo.com/us"
]

示例 2:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
输入:
urls = [
  "http://news.yahoo.com",
  "http://news.yahoo.com/news",
  "http://news.yahoo.com/news/topics/",
  "http://news.google.com"
]
edges = [[0,2],[2,1],[3,2],[3,1],[3,0]]
startUrl = "http://news.google.com"
输入:["http://news.google.com"]
解释:startUrl 链接到所有其他不共享相同主机名的页面。
 
提示:
1 <= urls.length <= 1000
1 <= urls[i].length <= 300
startUrl 为 urls 中的一个。
域名标签的长为1到63个字符(包括点),只能包含从‘a’到‘z’的ASCII字母、‘0’到‘9’的数字以及连字符即减号(‘-’)。
域名标签不会以连字符即减号(‘-’)开头或结尾。
关于域名有效性的约束可参考:  https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_hostnames
你可以假定url库中不包含重复项。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/web-crawler 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 简单的BFS或者DFS模板题

2.1 BFS

代码语言:javascript
复制
/**
 * // This is the HtmlParser's API interface.
 * // You should not implement it, or speculate about its implementation
 * class HtmlParser {
 *   public:
 *     vector<string> getUrls(string url);
 * };
 */

class Solution {
public:
    vector<string> crawl(string startUrl, HtmlParser htmlParser) {
        unordered_set<string> visited;
        visited.insert(startUrl);
        queue<string> q;
        q.push(startUrl);
        vector<string> ans;
        string cur, domain;
        while(!q.empty())
        {
        	cur = q.front();
            ans.push_back(cur);
        	q.pop();
        	domain = getdomain(cur);
        	vector<string> sub = htmlParser.getUrls(cur);
        	for(string& link : sub)
        	{
        		if(getdomain(link) == domain && !visited.count(link))
        		{
        			q.push(link);
        			visited.insert(link);
        		}
        	}
        }
        return ans;
    }
    string getdomain(string& url) 
    {
    	auto it = find(url.begin()+7, url.end(), '/');
    	return string(url.begin(), it);
    }
};

184 ms 32.9 MB

2.2 DFS

代码语言:javascript
复制
class Solution {
    unordered_set<string> visited;
    vector<string> ans;
public:
    vector<string> crawl(string startUrl, HtmlParser htmlParser) {
        visited.insert(startUrl);
        dfs(startUrl, htmlParser);
        return ans;
    }
    void dfs(string& cur, HtmlParser& htmlParser)
    {
        ans.push_back(cur);
        string domain = getdomain(cur);
        vector<string> sub = htmlParser.getUrls(cur);
        for(string& link : sub)
        {
            if(getdomain(link) == domain && !visited.count(link))
            {
                visited.insert(link);
                dfs(link, htmlParser);
            }
        }
    }
    string getdomain(string& url) 
    {
        auto it = find(url.begin()+7, url.end(), '/');
        return string(url.begin(), it);
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
    • 2.1 BFS
      • 2.2 DFS
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档