Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- "io/ioutil"
- "log"
- "net/http"
- "os"
- "regexp"
- "time"
- )
- const userID = 463936640 //id юзера
- var numberDoc = 590871318 //стартовый id документа. Задаем либо самое наибольшее текущее id документа, либо конкретное+1
- type Findurls struct {
- urlImg string
- urlRaw string
- }
- func MakeRequest(url string, ch chan<- Findurls) {
- //запрос страницы и поиск на ней изображения
- // на вход подается url и канал
- // если на странице есть изображение передаем обратно по каналу текущий url документа и прямой url изображения
- //получаем страницу по url
- resp, err := http.Get(url)
- if err != nil {
- log.Print(url)
- } else {
- defer resp.Body.Close()
- //считываем контент запрошенной страницы
- body, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- log.Fatal("Error reading HTTP body. ", err)
- }
- //находим изображение регуляркой
- re := regexp.MustCompile(`<img src="([^"]+)\" class="can_zoom".*?/>`)
- findImg := re.FindAllStringSubmatch(string(body), -1)
- if findImg == nil {
- //если изображение не найдено
- ch <- Findurls{"", ""}
- } else {
- //изображение найдено, выделяем первый элемент
- urlImg := findImg[0][1]
- //формируем объект
- ch <- Findurls{urlImg, url}
- }
- }
- }
- func main() {
- //перебор ведется от наибольшего значения numberDoc и декрементируется
- const numberCh = 1000 //количество каналов и url'ов, которые будут генерироваться для параллельных запросов
- //На компе возникают ошибки с значением больше 5000, а на телефоне больше 10
- var fullIterate = numberDoc / numberCh //количество итераций для полного сканирования профиля
- //создаем файл для лога
- file, err := os.OpenFile("info.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
- if err != nil {
- log.Fatal(err)
- }
- defer file.Close()
- log.SetOutput(file)
- //внешний цикл для полного сканирования
- for j := 0; j < fullIterate; j++ {
- //создание каналов
- var arrurls [numberCh]string
- ch := make(chan Findurls)
- //формируем массив url'ов для отправки запроса
- for i := 0; i < numberCh; i++ {
- numberDoc-- //каждый раз уменьшаем номер документа
- rawUrl := fmt.Sprintf("https://vk.com/doc%d_%d", userID, numberDoc)
- arrurls[i] = rawUrl
- }
- fmt.Println(numberDoc)
- start := time.Now()
- //отправляем сгенерированные url'ы в каналы
- for _, url := range arrurls {
- go MakeRequest(url, ch)
- }
- //получаем данные из каналов
- for range arrurls {
- d := <-ch
- //если по url'у что-то нашлось
- if d.urlImg != "" {
- //d - обьект с атрибутами: d.urlImg- прямой url изображения, d.urlRaw ссылка на исходный документ .
- //Можно писать в лог, можно скачивать изображение добавив фунцию
- fmt.Println(d)
- log.Print(d)
- }
- }
- elapsed := time.Since(start)
- fmt.Println(elapsed)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment