Exercise: Web Crawler
In this exercise you'll use Go's concurrency features to parallelize a web crawler.
Modify theCrawl
function to fetch URLs in parallel without fetching the same URL twice.
package main
import (
"fmt"
)
type Fetcher interface {
// Fetch returns the body of URL and
// a slice of URLs found on that page.
Fetch(url string) (body string, urls []string, err error)
}
// Crawl uses fetcher to recursively crawl
// pages starting with url, to a maximum of depth.
func Crawl(url string, depth int, fetcher Fetcher, out chan string, mutuex chan map[string]bool, end chan bool) {
// TODO: Fetch URLs in parallel.
// TODO: Don't fetch the same URL twice.
// This implementation doesn't do either:
if depth <= 0 {
end <- true
return
}
body, urls, err := fetcher.Fetch(url)
if err != nil {
out <- err.Error()
end <- true
return
}
fmt.Printf("found: %s %q\n", url, body)
visited := <- mutuex
subEnd := make(chan bool)
i := 0
for _, u := range urls {
if !visited[u] {
visited[u] = true
i ++
go Crawl(u, depth-1, fetcher, out, mutuex, subEnd)
}
}
mutuex <- visited
for ; i == 0 ; i-- {
<- subEnd
}
end <- true
return
}
func main() {
out := make(chan string)
mutuex := make(chan map[string]bool)
visited := make(map[string]bool)
end := make(chan bool)
visited["http://golang.org/"] = true
go Crawl("http://golang.org/", 4, fetcher, out, mutuex, end)
mutuex <- visited
for {
select {
case t:= <- out:
fmt.Println(t)
case <- end:
return
}
}
}
// fakeFetcher is Fetcher that returns canned results.
type fakeFetcher map[string]*fakeResult
type fakeResult struct {
body string
urls []string
}
func (f *fakeFetcher) Fetch(url string) (string, []string, error) {
if res, ok := (*f)[url]; ok {
return res.body, res.urls, nil
}
return "", nil, fmt.Errorf("not found: %s", url)
}
// fetcher is a populated fakeFetcher.
var fetcher = &fakeFetcher{
"http://golang.org/": &fakeResult{
"The Go Programming Language",
[]string{
"http://golang.org/pkg/",
"http://golang.org/cmd/",
},
},
"http://golang.org/pkg/": &fakeResult{
"Packages",
[]string{
"http://golang.org/",
"http://golang.org/cmd/",
"http://golang.org/pkg/fmt/",
"http://golang.org/pkg/os/",
},
},
"http://golang.org/pkg/fmt/": &fakeResult{
"Package fmt",
[]string{
"http://golang.org/",
"http://golang.org/pkg/",
},
},
"http://golang.org/pkg/os/": &fakeResult{
"Package os",
[]string{
"http://golang.org/",
"http://golang.org/pkg/",
},
},
}
相关推荐
### E-FFC: An Enhanced Form-Focused Crawler for Domain-Specific Deep Web Databases #### 摘要与背景 本文介绍了E-FFC(增强型聚焦表单爬虫),这是一种针对特定领域的深层网络数据库(Deep Web Databases, ...
Linksunten-Crawler 与JSoup一起使用的小型网络爬虫,用于下载所有链接。 该网页上的indymedia.org文章。 它是多线程的,因此下载页面的方法非常快。 执照 GNU GPL v2
crawler,您需要 Java 7 和 Java 8,可下载,或适用于 Linux 用户。 需要安装Heritrix 3, 需要安装 Verapdf,. 请注意,您最好使用最新版本的 verapdf。 安装 Logius Web 应用程序 您需要使用 Maven 下载和构建模块...
Powerpage Web Crawler是一个使用的便携式轻量级网络爬虫。 这是一个简单的 html/js 应用程序,演示使用开发应用程序。 Powerpage Web Crawler (v0.50) 是一款功能强大且易于使用的网络爬虫,适用于博客站点爬取和...
这个项目“simple web crawler using .NET”是基于微软的.NET框架实现的一个基本的网络爬虫。它能够遍历网页,抓取指定网站的数据,帮助开发者或者研究人员快速获取大量网页信息。 【描述】"源代码:使用.NET实现的...
"github.com/ddo/go-crawler" ) func main () { //counter, just for better log no := 0 /* default limit: 10 default client: timeout 10s default filter: http(s), no duplicated default scope: http...
本项目"**golang-crawler**"专注于利用Go语言实现爬虫技术,从简单的单线程爬虫逐步进阶到支持并发和分布式爬虫。下面我们将详细探讨这些知识点。 1. **爬虫基础** - 网络爬虫是自动化地从互联网上搜集信息的程序...
安装: $ git clone git@github.com:applitools/JS-Virtual-Grid-Crawler.git $ npm install跑步: $ node crawler.js --helpUsage: crawler [options]Options: -V, --version output the version number -u --url
改造者帮助您获取类似json的html玛文<dependency> <groupId>com.github.qlone</groupId> <artifactId>retrofit-crawler</artifactId> <version>1.0.0</version></dependency>Gradleimplementation '...
Web爬网,XPath,XSLT 全名:魏云晨SEAS登录:yunchenw 您实现了哪些功能? MileStone2:完整要求爬网程序和Servlet不应同时作为两个进程启动。 启动服务器,运行搜寻器(基本上,在运行搜寻器之前添加用户和通道) ...
Web 2016 - 2018 讲师、世新大学、十年创业经验;。 助教:林怡儒、Deron Liu、黄祥晏、陈又瑄、邱上庭。 课程目标 了解Python 程式语言设计建构模式,实作练习,并透过自己想要做的专案方向,爬取特定的网站内容,...
Tailwind UI爬网程序操作自动对Tailwind UI组件进行爬网和分类用法。 。 。 创建一个新文件.github/... ubuntu-latest steps : - name : Checkout uses : actions/checkout@v2 - name : Run crawler uses : greg
【标题】"dianyan-Strong-Web-Crawler-master.zip" 涉及的主要知识点是构建强大的网络爬虫,特别是利用Selenium库来自动化网页数据抓取。Selenium是一个广泛用于网页测试和数据抓取的工具,它允许开发者模拟真实用户...
"Web-Crawler-Exercise"这个项目显然是一次实践性的学习活动,目的是通过实际操作来提升对网络爬虫的理解和应用能力。在这个练习中,你将每天对一个不同的网站进行爬取,目标是抓取特定的关键字,并确保每次爬取的...
Github Action自动执行所有这些步骤,它每4小时运行一次rss crawler 脚步: Github将拉存储库,构建并运行爬虫代码(爬虫代码是C#(。net核心),github将直接运行它) 从LiteDB读取频道网址 提取RSS Feed项目 ...
xe-crawlerxe-crawler 是遵循声明式、可监测理念的分布式爬虫,其计划提供 Node.js、Go、Python 多种实现,能够对于静态 Web 页面、动态 Web 页面、关系型数据库、操作系统等异构多源数据进行抓取。xe-crawler 希望...
【标题】"Simple-Web-Crawler-master_爬虫_" 是一个C#编写的简单网络爬虫项目的源码库。这个项目旨在提供一个基础的、易于理解的实例,帮助初学者和开发者了解如何在C#环境下实现网页数据抓取的功能。 【描述】"C# ...
其次,**Python**是实现这个WebCrawler的主要编程语言。Python以其简洁的语法和丰富的库支持,常被用于网络爬虫的开发。在这个项目中,Python可能被用来构建HTTP请求,解析HTML或JSON响应,以及处理爬取到的数据。 ...