Внедрение Go веб-скребка / JSON вывода в iOS инфраструктуру и мобильное приложение - PullRequest
0 голосов
/ 17 марта 2020

Здесь есть несколько частей, я разобью их, не стесняйтесь помочь, где вы можете.

Справочная информация:

Я впервые работаю с Go и создаю веб-скребок, я пришел из концентрации iOS. Я работаю над предыдущей кодовой базой друга. В настоящее время просматривает оптовый сайт BJ в Go, а выходные данные в JSON. У меня есть неделя, чтобы понять это и заставить его работать над моим мобильным приложением для школьного проекта.

В настоящее время скребок очищает только категории, но он мне также нужен, чтобы иметь возможность очищать изображения и цену предмета (хотя это ниже в списке приоритетов).

Заданные вопросы По важности:

  1. Как мне go рассказать о реализации JSON data / Go в платформе Xcode / iOS?
  2. Как вы думаете, это было бы проще начать заново и построить веб-скребок с помощью Swift / SwifSoup / Kana?

Примечание: У меня нет опыта ни с одним из них, но я просто больше знаком с Swift, чем Go. И если это поможет, я больше знаком с Python и JavaScript, чем Go. Просто не уверен, как реализовать типичные веб-языки в iOS. Просто обмен ресурсами приветствуется и высоко ценится, так как мои исследования привели меня повсюду с этим.

Пример фрагментов кода на данный момент:

output. json

[
        {
            "categoryTitle": "Breakfast",
            "categoryLink": "https://www.bjs.com/category/grocery-household-and-pet/canned-and-packaged-food/breakfast-food/3000000000000117280?visualVariant.nonvisualVariant.gbi_attributes.Sfc=Y",
            "categoryImage": "https://s7d6.scene7.com/is/image/bjs/SDD_Breakfast_0430",
            "categoryProducts": null
        }, 
        ...
]

scrape. go

func scrape() {
    // Initialize gorm and the database
    // db, err := gorm.Open("sqlite3", "test.db")
    // if err != nil {
    //  panic("failed to connect database")
    // }
    // defer db.Close()

    // Migrate the schema
    // db.AutoMigrate(&Category{})

    // Instantiate default collector
    c := colly.NewCollector()

    // Limitations so our bot can't accidentally dox someone.
    c.Limit(&colly.LimitRule{
        // DomainGlob: "https://www.bjs.com/*",
        RandomDelay: 1 * time.Second,
        // Parallelism: 2,
    })

    // Get the Category
    categorySelector := "#contentOverlay > div > app-content > div > div > div > div > div > div.bopic-hero > div > div > div"
    var categoriesList []categories

    // Scrape categories
    c.OnHTML(categorySelector, func(e *colly.HTMLElement) {
        e.ForEach("#contentOverlay > div > app-content > div > div > div > div > div > div.bopic-hero > div > div > div > div > div > div", func(num int, h *colly.HTMLElement) {
            // fmt.Println("Category Number:", num)

            // Faster: create a string of common html elements, make those a variables and avoid memory-expensive concatenation
            categoryName := e.ChildText("div.bopic-hero > div > div > div > div > div > div:nth-child(" + strconv.Itoa(num+1) + ") > a")
            categoryLink := e.ChildAttr("div.bopic-hero > div > div > div > div > div > div:nth-child("+strconv.Itoa(num+1)+") > a", "href")
            categoryImage := e.ChildAttr("div.bopic-hero > div > div > div > div > div > div:nth-child("+strconv.Itoa(num+1)+") > a > img", "src")
            // fmt.Println(categoryName, "\n", categoryLink)

            //db.Create(&Category{Title: categoryName, Link: categoryLink, Image: categoryImage})
            //db.Create(&Category{Title: breakfast, Link: reddit.com, Image: https://i.kym-cdn.com/entries/icons/original/000/027/475/Screen_Shot_2018-10-25_at_11.02.15_AM.png})

            // Append the category data to the struct
            // productScrape := ScrapeProducts(categoryName, categoryLink)
            d := categories{Title: categoryName, Link: categoryLink, Image: categoryImage} // , Products: productScrape
            categoriesList = append(categoriesList, d)

            // e.Request.Visit(categoryLink)
        })
        fmt.Println(categoriesList)
    })

        // Start scraping bj's wholesale site
        c.Visit("https://www.bjs.com/content?template=B&espot_main=EverydayEssentials&source=megamenu")

        // Handle errors
        c.OnError(func(_ *colly.Response, err error) {
            log.Println("Something went wrong:", err)
        })

        // Alert when done scraping
        c.OnScraped(func(r *colly.Response) {
            //fmt.Println("Finished", r.Request.URL)
        })

        // After data is scraped, marshall to JSON
        DataJSONarr, err := json.MarshalIndent(categoriesList, "", "    ")
        if err != nil {
            panic(err)
        }
        // fmt.Println(categoriesList)

        // Writing the marshalled JSON data to output.json
        err = ioutil.WriteFile("output.json", DataJSONarr, 0644)
        if err != nil {
            panic(err)
        }
        c.Wait()

        // GORM test, please ignore
        // // Test GORM by reading the entry with id 1
        // var testCat Category
        // db.First(&testCat, 1)
        // // Update - update product's price to 2000
        // db.Model(&testCat).Update("Price", 2000)
        // // Delete - delete product
        // db.Delete(&testCat)
}

Не уверен, разрешено ли это, но действительные репозитории проекта, если это поможет:

iOS: https://github.com/ellojess/Divvy

скребок: https://github.com/ellojess/MakeScraper

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...