TGViewer
PHP | LeetCode PHP | LeetCode @easy_php_task · 1.33K subscribers
Post #799 161
Задача: 1242. Web Crawler Multithreaded
Сложность: medium

Учитывая URL startUrl и интерфейс HtmlParser, реализуйте многопоточный веб-краулер, который будет просматривать все ссылки, находящиеся под тем же именем хоста, что и startUrl. Верните все URL, полученные вашим веб-краулером, в любом порядке.

Ваш краулер должен: Начинать со страницы: startUrl Вызывать HtmlParser.getUrls(url), чтобы получить все URL с веб-страницы данного URL. Не просматривать одну и ту же ссылку дважды. Исследовать только те ссылки, которые находятся под тем же именем хоста, что и startUrl.

Пример:
Input:
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/"
Output: [
"http://news.yahoo.com",
"http://news.yahoo.com/news",
"http://news.yahoo.com/news/topics/",
"http://news.yahoo.com/us"
]


👨‍💻 Алгоритм:

1⃣Извлечь имя хоста из startUrl.
Использовать многопоточность для обработки URL-адресов.

2⃣Хранить посещенные URL-адреса, чтобы избежать повторного посещения.

3⃣Использовать HtmlParser для получения URL-адресов с веб-страниц.

😎 Решение:
class HtmlParser {
public function getUrls($url) {
return [];
}
}

class Solution extends Threaded {
private $visited;
private $hostname;
private $htmlParser;

public function __construct($startUrl, $htmlParser) {
$this->hostname = parse_url($startUrl, PHP_URL_HOST);
$this->htmlParser = $htmlParser;
$this->visited = new Volatile();
$this->visited[$startUrl] = true;
}

public function crawl() {
$pool = new Pool(10);
$pool->submit(new CrawlTask($this, $this->htmlParser, $this->hostname, array_keys((array) $this->visited)));

$pool->shutdown();
return array_keys((array) $this->visited);
}
}

class CrawlTask extends Collectable {
private $solution;
private $htmlParser;
private $hostname;
private $urls;

public function __construct($solution, $htmlParser, $hostname, $urls) {
$this->solution = $solution;
$this->htmlParser = $htmlParser;
$this->hostname = $hostname;
$this->urls = $urls;
}

public function run() {
foreach ($this->urls as $url) {
foreach ($this->htmlParser->getUrls($url) as $nextUrl) {
$nextHostname = parse_url($nextUrl, PHP_URL_HOST);
if ($nextHostname == $this->hostname && !isset($this->solution->visited[$nextUrl])) {
$this->solution->visited[$nextUrl] = true;
$this->worker->stack(new CrawlTask($this->solution, $this->htmlParser, $this->hostname, [$nextUrl]));
}
}
}
$this->setGarbage();
}
}


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_php_task
  1. Oct 17, 2026Задача: 1302. Deepest Leaves Sum Сложность: medium Дано корень бинарного дерева, вернуть с…
  2. Oct 16, 2026Задача: 760. Find Anagram Mappings Сложность: easy Вам даны два целочисленных массива nums…
  3. Oct 15, 2026Задача: 474. Ones and Zeroes Сложность: medium Дан массив двоичных строк strs и два целых…
  4. Oct 15, 2026Задача: 1273. Delete Tree Nodes Сложность: medium Дерево, укорененное в узле 0, задано сле…
  5. Oct 14, 2026Задача: 724. Find Pivot Index Сложность: easy Если задан массив целых чисел nums, вычислит…
  6. Oct 14, 2026Задача: 674. Longest Continuous Increasing Subsequence Сложность: easy Дан неотсортированн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →