Здесь есть несколько частей, я разобью их, не стесняйтесь помочь, где вы можете.
Справочная информация:
Я впервые работаю с Go и создаю веб-скребок, я пришел из концентрации iOS. Я работаю над предыдущей кодовой базой друга. В настоящее время просматривает оптовый сайт BJ в Go, а выходные данные в JSON. У меня есть неделя, чтобы понять это и заставить его работать над моим мобильным приложением для школьного проекта.
В настоящее время скребок очищает только категории, но он мне также нужен, чтобы иметь возможность очищать изображения и цену предмета (хотя это ниже в списке приоритетов).
Заданные вопросы По важности:
- Как мне go рассказать о реализации JSON data / Go в платформе Xcode / iOS?
- Как вы думаете, это было бы проще начать заново и построить веб-скребок с помощью 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