59703


こちらの[チュートリアル](https://arakan-pgm-
ai.hatenablog.com/entry/2018/01/17/080000)の通りにやっても、htmlのタイトル部分だけを取り出せません。  
(python3.6, macos)

[code]

    import requests as web
    import bs4
    import csv
    
    # キーワードを使って検索する
    list_keywd = ['機械学習','統計']
    resp = web.get('https://www.google.co.jp/search?num=100&q=' + '　'.join(list_keywd))
    resp.raise_for_status()
    
    # 取得したHTMLをパースする
    soup = bs4.BeautifulSoup(resp.text, "html.parser")
    # 検索結果のタイトルとリンクを取得
    link_elem01 = soup.select('.r > a')
    # 検索結果の説明部分を取得
    link_elem02 = soup.select('.s > .st')
    
    if(len(link_elem02) <= len(link_elem01)):
        leng = len(link_elem02)
    else:
        leng = len(link_elem01) 
    
[/code]

soupまでは取得できているようですが、`link_elem01`と`link_elem02`はprintすると空になっています。  
htmlに詳しくなく、またsoupの中の内容が複雑だったので、実行できない理由を教えていただけると嬉しいです。  
よろしくお願いします。


CC BY-SA 4.0
2019-10-12T15:16:08.270
59668
2020-05-16T22:56:12.410
2020-05-16T22:56:12.410
19110
32225
question
python html beautifulsoup python-requests
python, BeautifulSoupでgoogle検索のタイトル取得できない


google側がスレイピングさせないようにdivタグやclass属性を書き換えているみたいです。以下その調査と報告です。

まず同じurlにブラウザからアクセスして、デベロッパーツールから検索して`'.r > a'`の要素があることを確認しました。  
次に質問者さんと同じコードを実行し`resp.text`を見てみると、ブラウザから見れた`<div class="r">`タグが見つかりません。

おそらくスクレイピングの対策しているのだろうと考えました。<https://www.google.co.jp/robots.txt>を見てみると、リクエストしたurlはクローリングが禁止されています。

> User-agent: *  
>  Disallow: /search

質問者さんのチュートリアルの記事は1年以上前なのでその間にgoogle側がスクレイピング対策したのでしょう。ブラウザからのアクセスでは、ブラウザがresponseを得た後、javascriptの実行によってその内容を書き換えているのではないかと思われます。もしその内容が知りたいのであれば、ブラウザ自動化ができるseleniumを使うことで可能です。しかし、クローリング目的で同じurlにアクセスすると、それは違法行為になります。注意しましょう。


CC BY-SA 4.0
2019-10-14T14:00:09.207
59703
2019-10-16T12:19:20.200
2019-10-16T12:19:20.200
36129
36129
59668
answer