NAVERビデオの結果を調査してください


  • What will be scraped
  • Prerequisites
  • Process
  • Full Code
  • Links
  • Outro
  • スクラップ



    必要条件


    CSSセレクタによる基礎知識の抽出
    あなたがCSSセレクタで掻き取られないならば、私のものの専用のブログ柱はありますhow to use CSS selectors when web-scraping それは、それが何であるかについて、賛否両論をカバーします、そして、なぜ、彼らがウェブを削っている展望から重要である理由.CSS セレクターは、マークアップのどの部分がスタイルを適用するかを宣言し、タグと属性のマッチングからデータを取り出すことができます.
    個別仮想環境
    あなたが以前に仮想環境で働いていないならば、専用を見てくださいPython virtual environments tutorial using Virtualenv and Poetry お馴染みのブログ記事.
    要するに、それは、それぞれと共存することができる異なるPythonバージョンを含むインストールされたライブラリの独立したセットを作成するものです
    このようにしてライブラリやPythonのバージョンの競合を防止します.
    📌注:これはむしろ、このブログ記事の厳しい要件ではありません.
    ライブラリをインストール
    pip install requests, parsel
    
    ブロックされる機会を減らす
    リクエストがブロックされる可能性があります.見るhow to reduce the chance of being blocked while web-scraping , ほとんどのウェブサイトからブロックをバイパスする11の方法があります.

    フルコード


    import requests, os, json
    from parsel import Selector
    
    
    def parsel_scrape_naver_videos():
        params = {
            "query": "minecraft",  # search query
            "where": "video"       # video results
        }
    
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36",
        }
    
        html = requests.get("https://search.naver.com/search.naver", params=params, headers=headers, timeout=30)
        selector = Selector(html.text)  # very similar to bs4, except parsel supports Xpath 
    
        video_results = []
    
        for video in selector.css(".video_bx"):
            # https://parsel.readthedocs.io/en/latest/usage.html#using-selectors
            title = video.css(".text::text").get()
            link = video.css(".info_title::attr(href)").get()
            thumbnail = video.css(".thumb_area img::attr(src)").get()
            channel = video.css(".channel::text").get()
            origin = video.css(".origin::text").get()
            video_duration = video.css(".time::text").get()
            views = video.css(".desc_group .desc:nth-child(1)::text").get()
            date_published = video.css(".desc_group .desc:nth-child(2)::text").get()
    
            video_results.append({
                "title": title,
                "link": link,
                "thumbnail": thumbnail,
                "channel": channel,
                "origin": origin,
                "video_duration": video_duration,
                "views": views,
                "date_published": date_published
            })
    
        print(json.dumps(video_results, indent=2, ensure_ascii=False))    
    
    検索クエリパラメータとリクエストヘッダを渡します.
    def parsel_scrape_naver_videos():
        # https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls
        params = {
            "query": "minecraft",  # search query
            "where": "video"       # video results
        }
    
        # https://docs.python-requests.org/en/master/user/quickstart/#custom-headers
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36",
        }
    
    URLパラメータ、リクエストヘッダを渡し、リクエストを行い、parsel :
    html = requests.get("https://search.naver.com/search.naver", params=params, headers=headers, timeout=30)
    selector = Selector(html.text)  # very similar to bs4, except parsel supports Xpath 
    
    一時作成list データを格納し、すべてのデータを展開するには、次の手順に従います.
    video_results = []
    
        # https://parsel.readthedocs.io/en/latest/usage.html#using-selectors
        for video in selector.css(".video_bx"):
            title = video.css(".text::text").get()
            link = video.css(".info_title::attr(href)").get()
            thumbnail = video.css(".thumb_area img::attr(src)").get()
            channel = video.css(".channel::text").get()
            origin = video.css(".origin::text").get()
            video_duration = video.css(".time::text").get()
            views = video.css(".desc_group .desc:nth-child(1)::text").get()
            date_published = video.css(".desc_group .desc:nth-child(2)::text").get()
    
    コード
    解説
    ::text or ::attr(attribute)
    テキストまたはattriubte値をノードから抽出します.
    get()
    実際のデータを取得するには
    データを出力します.
    # ensure_ascii=False to properly display Hangul characters
    print(json.dumps(video_results, indent=2, ensure_ascii=False)) 
    
    返されるデータの一部
    [
      {
        "title": " : 🌲 How to build Survival Wooden Base (#3)",
        "link": "https://www.youtube.com/watch?v=n6crYM0D4DI",
        "thumbnail": "https://search.pstatic.net/common/?src=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fn6crYM0D4DI%2Fmqdefault.jpg&type=ac612_350",
        "channel": "소피 Sopypie",
        "origin": "Youtube",
        "video_duration": "24:06",
        "views": "671",
        "date_published": "4일 전"
      },
      {
        "title": "마인크래프트 무한순환 이론 (",
        "link": "https://www.youtube.com/watch?v=kQ7wyG9mShQ",
        "thumbnail": "https://search.pstatic.net/common/?src=https%3A%2F%2Fi.ytimg.com%2Fvi%2FkQ7wyG9mShQ%2Fmqdefault.jpg&type=ac612_350",
        "channel": "TV블루위키",
        "origin": "Youtube",
        "video_duration": "01:44",
        "views": "9만",
        "date_published": "2022.02.15."
      } ... other results
    ]
    
    また、使用して同じことを達成することができますNaver Video Results API 無料の計画で支払われたAPIであるSerpapiから.
    違いは、ゼロからパーサーを作成して、それを維持して、ブロックされることなくそれを縮める方法を理解する必要がないということです.
    import os
    from serpapi import NaverSearch
    
    def serpapi_scrape_naver_videos():
        params = {
            "api_key": os.getenv("API_KEY"),  # your serpapi api key
            "engine": "naver",                # parsing engine
            "query": "minecraft",             # search query
            "where": "video"                  # video results
        }
    
        search = NaverSearch(params)          # where data extraction happens
        results = search.get_dict()           # JSON -> Python dictionary
    
        video_results = []
    
        # iterate over video results and extract desired data
        for video in results["video_results"]:
            video_results.append({
                "title": video["title"],
                "link": video["link"],
                "duration": video["duration"],
                "views": video.get("views"),
                "pub_date": video.get("publish_date"),
                "thumbnail": video["thumbnail"],
                "channel_name": video.get("channel", {}).get("name"),
                "channel_link": video.get("channel", {}).get("link")
            })
    
        print(json.dumps(video_results, indent=2, ensure_ascii=False))
    
    返されるデータの一部
    [
      {
        "title": "Minecraft : 🌲 How to build Survival Wooden Base (#3)",
        "link": "https://www.youtube.com/watch?v=n6crYM0D4DI",
        "duration": "24:06",
        "views": "671",
        "pub_date": "4일 전",
        "thumbnail": "https://search.pstatic.net/common/?src=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fn6crYM0D4DI%2Fmqdefault.jpg&type=ac612_350",
        "channel_name": "소피 Sopypie",
        "channel_link": "https://www.youtube.com/channel/UCCuuRWM5JTvYBnbufwJ4E5Q"
      },
      {
        "title": "마인크래프트 무한순환 이론 (Minecraft) [블루위키]",
        "link": "https://www.youtube.com/watch?v=kQ7wyG9mShQ",
        "duration": "01:44",
        "views": "9만",
        "pub_date": "2022.02.15.",
        "thumbnail": "https://search.pstatic.net/common/?src=https%3A%2F%2Fi.ytimg.com%2Fvi%2FkQ7wyG9mShQ%2Fmqdefault.jpg&type=ac612_350",
        "channel_name": "TV블루위키",
        "channel_link": "https://www.youtube.com/channel/UCQreDC73rqiw1wSc_ZYwgHA"
      } ... other results 
    ]
    

    リンク

  • Code in the online IDE
  • Naver Video Results API
  • アウトロ


    何か質問、提案、または正しく動作していない何かを共有する何かを持っている場合は、Twitter経由で、またはを手を伸ばす.
    あなたの、dmitriy、残りのserpapiチーム.
    我々に加わってください
    加えるFeature Request 💫 またはBug 🐞