Guest User

Untitled

a guest
Jul 18th, 2021
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.65 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "io/ioutil"
  6.     "log"
  7.     "net/http"
  8.     "os"
  9.     "regexp"
  10.     "time"
  11. )
  12.  
  13. const userID = 463936640  //id юзера
  14. var numberDoc = 590871318 //стартовый id документа. Задаем либо самое наибольшее текущее id документа, либо конкретное+1
  15.  
  16. type Findurls struct {
  17.     urlImg string
  18.     urlRaw string
  19. }
  20.  
  21. func MakeRequest(url string, ch chan<- Findurls) {
  22.     //запрос страницы и поиск на ней изображения
  23.     // на вход подается url и канал
  24.     // если на странице есть изображение передаем обратно по каналу текущий url документа и прямой url изображения
  25.  
  26.     //получаем страницу по url
  27.     resp, err := http.Get(url)
  28.     if err != nil {
  29.         log.Print(url)
  30.     } else {
  31.         defer resp.Body.Close()
  32.         //считываем контент запрошенной страницы
  33.         body, err := ioutil.ReadAll(resp.Body)
  34.         if err != nil {
  35.             log.Fatal("Error reading HTTP body. ", err)
  36.         }
  37.         //находим изображение регуляркой
  38.         re := regexp.MustCompile(`<img src="([^"]+)\" class="can_zoom".*?/>`)
  39.         findImg := re.FindAllStringSubmatch(string(body), -1)
  40.         if findImg == nil {
  41.             //если изображение не найдено
  42.             ch <- Findurls{"", ""}
  43.         } else {
  44.             //изображение найдено, выделяем первый элемент
  45.             urlImg := findImg[0][1]
  46.             //формируем объект
  47.             ch <- Findurls{urlImg, url}
  48.         }
  49.     }
  50. }
  51.  
  52. func main() {
  53.     //перебор ведется от наибольшего значения numberDoc и декрементируется
  54.  
  55.     const numberCh = 1000 //количество каналов и url'ов, которые будут генерироваться для параллельных запросов
  56.     //На компе возникают ошибки с значением больше 5000, а на телефоне больше 10
  57.     var fullIterate = numberDoc / numberCh //количество итераций для полного сканирования профиля
  58.     //создаем  файл для лога
  59.     file, err := os.OpenFile("info.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
  60.     if err != nil {
  61.         log.Fatal(err)
  62.     }
  63.     defer file.Close()
  64.     log.SetOutput(file)
  65.     //внешний цикл для полного сканирования
  66.     for j := 0; j < fullIterate; j++ {
  67.         //создание каналов
  68.         var arrurls [numberCh]string
  69.  
  70.         ch := make(chan Findurls)
  71.         //формируем массив url'ов для отправки запроса
  72.         for i := 0; i < numberCh; i++ {
  73.             numberDoc-- //каждый раз уменьшаем номер документа
  74.             rawUrl := fmt.Sprintf("https://vk.com/doc%d_%d", userID, numberDoc)
  75.             arrurls[i] = rawUrl
  76.         }
  77.         fmt.Println(numberDoc)
  78.         start := time.Now()
  79.         //отправляем сгенерированные url'ы в каналы
  80.         for _, url := range arrurls {
  81.             go MakeRequest(url, ch)
  82.         }
  83.         //получаем данные из каналов
  84.         for range arrurls {
  85.             d := <-ch
  86.             //если по url'у что-то нашлось
  87.             if d.urlImg != "" {
  88.                 //d - обьект с атрибутами: d.urlImg- прямой url изображения, d.urlRaw ссылка на исходный документ .
  89.                 //Можно писать в лог, можно скачивать изображение добавив фунцию
  90.                 fmt.Println(d)
  91.                 log.Print(d)
  92.             }
  93.         }
  94.         elapsed := time.Since(start)
  95.         fmt.Println(elapsed)
  96.     }
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment