Googleのインライン画像をスクラップ


内容:イントロ、インポート、何がスクラップ、プロセス、コード、リンク、outro.

イントロ


このブログのポストは、GoogleのWebスクレーピングシリーズの継続です.ここでは、Pythonを使用してインライン画像をscrapeする方法が表示されますbeautifulsoup , requests , lxml , re , base64 , BytesIO , PIL ライブラリ.別のAPIソリューションを示します.
注:このブログ記事は、あなたがよく知っていると仮定しますbeautifulsoup , requests ライブラリと正規表現の基本的理解

輸入


import requests, lxml, re, base64
from bs4 import BeautifulSoup 
from io import BytesIO # for decoding base64 image
from PIL import Image # for saving decoded image
from serpapi import GoogleSearch # alternative API solution

スクラップ



プロセス


コンテナ、リンクを選択し、写真が使用されています.

サムネイルの抽出
サムネイルを抽出するには<img> タグ付きid dimg_XX (xx -数).
ソースコードをオープンしたらdimg_36 (またはHTMLコードに依存する他の数字)には2つの出現があり、そのうちの1つは<script> タグ、それは我々が必要です.
サムネイルを抽出するにはregex それらを得るために<script> タグを指定します.src 属性を出力します.data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== base64 符号化画像

このトピックについての詳細はDeveloper Mozilla
正規表現はとても簡単です.
s='data:image/jpeg;base64,(.*?)';
正規表現の説明
  • 探すs='data:image/jpeg;base64,
  • キャプチャグループの作成(.*?) そしてそれはすべてをつかむでしょう'; シンボル.
  • キャプチャグループのみが他の部分なしで抽出されます.
  • スクリーンショットは、あなたが見つけることができる正規表現でキャプチャされているかを説明するhere :

    その後、デコードされたbase 64文字列をPIL モジュールです.より多くのStackOverFlow answer .

    コード


    import requests, lxml, re, urllib.parse, base64
    from bs4 import BeautifulSoup
    from PIL import Image
    from io import BytesIO
    
    headers = {
        "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
    }
    
    params = {
        "q": "minecraft shareds photo",
        "sourceid": "chrome",
    }
    
    html = requests.get("https://www.google.com/search", params=params, headers=headers)
    soup = BeautifulSoup(html.text, 'lxml')
    
    for result in soup.select('div[jsname=dTDiAc]'):
        link = f"https://www.google.com{result.a['href']}"
        being_used_on = result['data-lpage']
        print(f'Link: {link}\nBeing used on: {being_used_on}\n')
    
    # finding all script (<script>) tags
    script_img_tags = soup.find_all('script')
    
    # https://regex101.com/r/L3IZXe/4
    img_matches = re.findall(r"s='data:image/jpeg;base64,(.*?)';", str(script_img_tags))
    
    for index, image in enumerate(img_matches):
        try:
            # https://stackoverflow.com/a/6966225/15164646
            final_image = Image.open(BytesIO(base64.b64decode(str(image))))
    
            # https://www.educative.io/edpresso/absolute-vs-relative-path
            # https://stackoverflow.com/a/31434485/15164646
            final_image.save(f'your/absolute_or_relative/path/inline_image_{index}.jpg', 'JPEG')
        except:
            pass
    
    ------------------
    # part of the output:
    '''
    Link: https://www.google.com/search?q=minecraft+shaders+photo&tbm=isch&source=iu&ictx=1&fir=1DCWjzl0od3bFM%252Cc4Qd0ZKVFnHrsM%252C_&vet=1&usg=AI4_-kTAvknTGktfEC1K8ciH7Ot7GsAFkA&sa=X&ved=2ahUKEwiAiaDV6_HxAhVBeawKHfbtDCIQ9QF6BAgWEAE#imgrc=1DCWjzl0od3bFM
    Being used on: https://pixabay.com/illustrations/minecraft-shader-minecraft-wallpaper-1970876/
    
    Link: https://www.google.com/search?q=minecraft+shaders+photo&tbm=isch&source=iu&ictx=1&fir=bwVoAE4HTl8GXM%252Cz3y5GvasoN8hFM%252C_&vet=1&usg=AI4_-kRfUHjrz711om99elb_i3GwJuTBnw&sa=X&ved=2ahUKEwiAiaDV6_HxAhVBeawKHfbtDCIQ9QF6BAgVEAE#imgrc=bwVoAE4HTl8GXM
    Being used on: https://www.pcgamesn.com/minecraft/minecraft-shaders-best-graphics-mods
    ...
    '''
    
    背景に保存された画像:

    出力を説明するGIF

    GoogleのインラインイメージAPIを使用する


    SerPapiは5000の検索の無料トライアルと有料APIです.
    最大の違いは、それがすでにエンドユーザーのために行われているので、適切なイメージサイズを得るためにどこで特定の要素を解析する場所から把握する必要はありません.それ以外の場合、スクリプトのリクエストがブロックされるとパーサを維持するか、方法を見つける必要はありません.
    import json
    from serpapi import GoogleSearch
    
    params = {
      "api_key": "YOUR_API_KEY",
      "engine": "google",
      "q": "minecraft shaders photo",
      "hl": "en",
    }
    
    search = GoogleSearch(params)
    results = search.get_dict()
    
    print(json.dumps(results['inline_images'], indent=2, ensure_ascii=False))
    
    ------------------------
    '''
    [
      {
        "link": "/search?q=minecraft+shaders+photo&hl=en&tbm=isch&source=iu&ictx=1&fir=bwVoAE4HTl8GXM%252Cz3y5GvasoN8hFM%252C_&vet=1&usg=AI4_-kRfUHjrz711om99elb_i3GwJuTBnw&sa=X&ved=2ahUKEwit6Jq38PHxAhUkSTABHfJyCn8Q9QF6BAgWEAE#imgrc=bwVoAE4HTl8GXM",
        "thumbnail": "https://serpapi.com/searches/60f6e03895bf92b91f6fb3d6/images/9cce8031b6aba2675322296c8d247839d434db3be723a5fec2f933d8b4bd4d1e.jpeg"
      }
    ]
    ...
    '''
    

    リンク


    Code in the online IDEGoogle Inline Images API

    アウトロ


    何か質問や何かが正しく動作していない場合や他の何かを書くには、コメントのセクションやTwitter経由でコメントをドロップすること自由に感じなさい.
    あなた
    Dimitryと残りのserpapiチーム.