Получение пустого возврата при использовании GoQuery для получения видео src
Я пытаюсь получить.mp4 видео источник виноградной лозы, используя GoQuery. Однако, когда я запускаю его, я не получаю ничего, ни ошибки, ни возврата. Просто пустая строка.
package main
import (
"fmt"
"log"
"github.com/PuerkitoBio/goquery"
)
func getMP4URL() {
doc, err := goquery.NewDocument("https://vine.co/v/MlWtKgwh7WY")
if err != nil {
log.Fatal(err)
}
doc.Find(".vine-video-container").Each(func(i int, s *goquery.Selection) {
mp4, _ := s.Find("video").Attr("src")
fmt.Printf("MP4: %s", mp4)
})
}
func main() {
getMP4URL()
}
Это проблема с моим кодом или с самой лозой?
3 ответа
Кажется, что лоза добавляет этот идентификатор с помощью JavaScript
если я добавлю
html, err := doc.Html()
if err != nil {
log.Fatal(err)
}
log.Println(html)
до doc.Find
здесь нет .vine-video-container
в выводе html
Попробуйте этот код:)
package main
import (
"fmt"
"log"
"github.com/PuerkitoBio/goquery"
)
func getMP4URL() {
doc, err := goquery.NewDocument("https://vine.co/v/MlWtKgwh7WY")
if err != nil {
log.Fatal(err)
}
doc.Find("meta").Each(func(i int, s *goquery.Selection) {
op, _ := s.Attr("itemprop")
if op == "contentURL" {
fmt.Println(s.Attr("content"))
}
})
}
func main() {
getMP4URL()
}
Vine встраивает метаданные видео в формате JSON в <script type="application/ld+json">
, Таким образом, вам нужно извлечь BLOB-объект JSON из тега и декодировать JSON, чтобы получить источник видео.
Ниже приведен полный рабочий код для получения src URL видео Vine:
package main
import (
"encoding/json"
"github.com/PuerkitoBio/goquery"
)
type SharedContent struct {
ContentUrl string `json:"contentUrl"`
}
type VineVideoMetadata struct {
SC SharedContent `json:"sharedContent"`
}
func DecodeVineJsonBlob(blob string) VineVideoMetadata {
meta := VineVideoMetadata{}
err := json.Unmarshal([]byte(blob), &meta)
if err != nil {
panic(err)
}
return meta
}
func GetVineVideoJsonBlob(url string) string {
doc, err := goquery.NewDocument(url)
if err != nil {
panic(err)
}
return doc.Find("script[type=\"application/ld+json\"]").Text()
}
func GetVineVideoSrc(url string) string {
jsonBlob := GetVineVideoJsonBlob(url)
meta := DecodeVineJsonBlob(jsonBlob)
return meta.SC.ContentUrl
}
func main() {
println(GetVineVideoSrc("https://vine.co/v/MlWtKgwh7WY"))
}
выход:
https://mtc.cdn.vine.co/r/videos/67FAC9DFA21115619347885645824_22a564aec15.5.0.17428816123715427422.mp4?versionId=4zcm5ySoFhqUQBXU7Ehm3YOuOSjFbkg3