94070


下記の質問とほぼ同じになるのですが、私の力では解決できなかったため同様の質問をさせていただきます。

[Webページ上の「もっと見る」ボタン以降のテキスト情報をスクレイピングする](https://ja.stackoverflow.com/q/60510)

Yahoo!ニュースの検索窓にキーワードを入力しテキスト情報をスクレイピングで取得しようとしています。  
ページの途中に「もっと見る」ボタンがあり、以降の情報もすべて取得したいのですが、  
「もっと見る」以前の情報しか取得されず困っています。

上記リンクの回答者さんがFirefoxのデベロッパーツール(「Ctrl」+「Alt」+「Del」)で  
コンソールを見れば"Page"とか"Limit"の情報が得られるのでそれでわかるのではないか  
とのことでしたがPR TIMESのページでも再現できませんでした。

Firefoxの使い方とか基本的なところからわかっていないだけかも知れませんがなにぶん  
初心者なものでどうにもわかりません。ヒントでもよいのでご存知の方ご教示のほど  
よろしくお願いいたします。

そもそもこのやり方でわかるものかどうかもわかっていません。

[![Firefoxのデベロッパーツールで開いた結果は下記画像の通りです。](https://i.stack.imgur.com/WBQ4J.jpg)](https://i.stack.imgur.com/WBQ4J.jpg)


CC BY-SA 4.0
2023-03-04T07:02:14.650
94068
2023-03-05T05:05:38.413
2023-03-05T05:05:38.413
3060
57387
question
javascript html web-scraping
Yahoo!ニュースの検索窓で検索した時の「もっと見る」ボタン以降のテキスト情報をスクレイピングする


> API の URL は `https://news.yahoo.co.jp/api/searchFeed` で、query word
> は、query(検索文字列) と results(取得件数)、start(記事のインデックス)と API token です。API token
> はトップページに JavaScript の変数(ハッシュ)として埋め込まれているので、それを抽出する必要があります。

「トヨタ」で検索すると 10,000 件以上もあるので、以下のコードでは最初の 300 件を取得しています。

[code]

    import requests
    import re
    import sys
    import time
    from pprint import pprint
    
    yahoo_news_url = 'https://news.yahoo.co.jp/'
    search_url = 'https://news.yahoo.co.jp/api/searchFeed'
    
    # get API token
    r = requests.get(yahoo_news_url)
    r.raise_for_status()
    token = re.search(r'"apiAccessToken":"(.+?)"', r.text)
    if token is None: sys.exit(1)
    token = token[1]
    
    # get news feed
    query = 'トヨタ'
    start, num_feeds, num_repeats = 1, 50, 6  # 50 articles * 6 repeats = 300 articles
    headers = {'content-type': 'application/json'}
    articles = []
    for idx in range(start, num_feeds*num_repeats, num_feeds):
        params = {'query': query, 'start': idx, 'results': num_feeds, 'token': token}
        r = requests.get(search_url, params=params, headers=headers)
        r.raise_for_status()
    
        js = r.json()
        for c in js['contents']:
            if 'contentId' in c:
                headline = re.sub(r'[\x02\x03]', '', c['highlightSearchText']['headline'])
                body_text = '…' + re.sub(r'[\x02\x03]', '', c['highlightSearchText']['body']) + '…'
                articles.append({
                    'headline': headline, 'body': body_text,
                    'publishTime': c['publishTime'], 'permalink': c['permalink']})
    
        time.sleep(10)
    
    total_results = js['totalResults']
    
    # show results
    print(f'{query = }')
    print(f'{total_results = }')
    pprint(articles, sort_dicts=False, width=150)
    
[/code]

**出力結果**

[code]

    query = 'トヨタ'
    total_results = 10471
    [{'headline': '【バレー】埼玉上尾・山岸あかねがVリーグ出場通算230試合出場達成。女子の大卒選手では史上2人目',
      'body': '…で、史上2人目の快挙となった。同チームでは3月5日の第2試合（埼玉上尾対トヨタ車体戦）後に受賞セレモニーを行う予定。 \u3000山岸選手のプロフィールは以下の通り。…',
      'publishTime': {'date': '3/5(日)', 'time': '1:01'},
      'permalink': 'https://news.yahoo.co.jp/articles/bbee4c9c54db4861de8189f914cdb864bc272f2a'},
     {'headline': '【ハイライト動画あり】横浜キヤノンイーグルスvs.静岡ブルーレヴズ、金曜夜の決戦は激戦の末のドロー。ジャパンラグビー リーグワン第10節',
      'body': '…の静岡ブルーレヴズが挑んだ。 トップ4入りを目指すイーグルスは、前節もトヨタヴェルブリッツを39-7で下し、3連勝。沢木啓介監督は前節からFW（フォ…',
      'publishTime': {'date': '3/4(土)', 'time': '21:42'},
      'permalink': 'https://news.yahoo.co.jp/articles/93246093f24965722a153a86cbbd81c60966317a'},
    
                                            :
    
[/code]


CC BY-SA 4.0
2023-03-04T16:19:40.777
94070
2023-03-04T16:19:40.777
47127
94068
answer