我正在开发一个网络爬虫,它应该像这样工作:
转到某个网站,抓取该网站的所有链接
下载所有图像(从起始页开始)
如果当前页面上没有留下任何图像,请转到步骤1中找到的下一个链接,然后执行步骤2和3,直到没有链接/图像为止。
似乎下面的代码以某种方式工作,就像当我尝试抓取一些网站时,我会得到一些图像下载。
(即使我不理解我得到的图像,因为我在网站上找不到它们,似乎爬虫不是从网站的起始页开始的)。
经过几张图像(~25-500张),爬行器完成并停止,没有错误,它只是停止。我在多个网站上尝试了这个,在一些图像之后,它只是停止了。我认为爬虫以某种方式忽略了步骤3。
package main
import (
"fmt"
"io"
"log"
"net/http"
"os"
"strconv"
"strings"
"github.com/PuerkitoBio/goquery"
)
var (
currWebsite string = "https://www.youtube.com"
imageCount int = 0
crawlWebsite string
)
func processElement(index int, element *goquery.Selection) {
href, exists := element.Attr("href")
if exists && strings.HasPrefix(href, "http") {
crawlWebsite = href
response, err := http.Get(crawlWebsite)
if err != nil {
log.Fatalf("error on current website")
}
defer response.Body.Close()
document, err := goquery.NewDocumentFromReader(response.Body)
if err != nil {
log.Fatal("Error loading HTTP response body.", err)
}
document.Find("img").Each(func(index int, element *goquery.Selection) {
imgSrc, exists := element.Attr("src")
if strings.HasPrefix(imgSrc, "http") && exists {
fileName := fmt.Sprintf("./images/img" + strconv.Itoa(imageCount) + ".jpg")
currWebsite := fmt.Sprint(imgSrc)
fmt.Println("[+]", currWebsite)
DownloadFile(fileName, currWebsite)
imageCount++
}
})
}
}
func main() {
err := os.MkdirAll("./images/", 0777)
if err != nil {
log.Fatalln("error on creating directory")
}
response, err := http.Get(currWebsite)
if err != nil {
log.Fatalln("error on searching website")
}
defer response.Body.Close()
document, err := goquery.NewDocumentFromReader(response.Body)
if err != nil {
log.Fatalln("Error loading HTTP response body. ", err)
}
函数式编程
相关分类