OnRequest
выполняется до фактической отправки запроса на сервер. Ваш оператор отладки вводит в заблуждение: fmt.Println("Visiting", r.URL.String())
должно быть: fmt.Println("Preparing request for:", r.URL.String())
.
Я подумал, что ваш вопрос интересен, поэтому я настроил локальный тестовый пример с http.server
для Python:
$ cd $(mktemp -d) # make temp dir
$ for n in {0..99}; do touch $n; done # make 100 empty files
$ python3 -m http.server # start up test server
Затем измените ваш код выше:
package main
import (
"fmt"
"strconv"
"time"
"github.com/gocolly/colly"
)
const URL = "http://127.0.0.1:8000/"
func main() {
collector := colly.NewCollector(
colly.AllowedDomains("127.0.0.1:8000"),
colly.Async(true),
colly.UserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"),
)
collector.Limit(&colly.LimitRule{
DomainRegexp: "127.0.0.1:8000",
Parallelism: 2,
Delay: 5 * time.Second,
})
collector.OnResponse(func(r *colly.Response) {
url := r.Ctx.Get("url")
fmt.Println("Done visiting", url)
})
collector.OnRequest(func(r *colly.Request) {
r.Ctx.Put("url", r.URL.String())
fmt.Println("Creating request for:", r.URL.String())
})
collector.OnError(func(r *colly.Response, err error) {
fmt.Println(err)
})
for i := 0; i < 100; i++ {
collector.Visit(URL + strconv.Itoa(i))
}
collector.Wait()
}
Обратите внимание, что я изменил RandomDelay
на обычный, что упрощает рассуждения для тестового примера, и я изменил оператор отладки для OnRequest
.
Теперь, если вы go run
этот файл, вы увидите, что:
- сразу печатает
Creating request for: http://127.0.0.1:8000/
+ число, 100 раз
- печатает
Done visiting http://127.0.0.1:8000/
+ число, дважды
- HTTP-сервер Python печатает 2
GET
запросов, по 1 для каждого из чисел в # 2
- пауза 5 секунд
- шаги # 2 - # 4 повторить для оставшихся чисел
Так что мне кажется, что Колли ведет себя так, как задумано. Если вы по-прежнему получаете ошибки ограничения скорости, которые вы не ожидаете, попробуйте проверить, что ваше правило ограничения соответствует домену .