60291


毎日一定の時刻に、特定のURLからjsonを取得しDataframeに保存する、ということがやりたいです。  
テストとして１分置きでの取得条件で書いてみたのですが、実行すると以下のエラーが表示されてしまいます。

[code]

    TypeError: get_all_reviews() missing 1 required positional argument: 'url'
    
[/code]

スクリプト（schedule部分のスクリプトを削除すると、正常に実行されます）

[code]

    def get_all_reviews(url):
        rvw_list_text = []
        i = 1
        while True:
            print(i,'searching')
            i += 1        
            res = requests.get(url)
            res_json = json.loads(res.text)
            data = res_json.get('data')
            for d in data:
                rvw_list_text.append(d)
    
            #dataが殻でなければ
            if data !=[]:
                paging = dict(res_json.get('paging'))
                next_page = str(paging['next'])
                url = next_page
            else:
                break
    
    
        return rvw_list_text
    
    if __name__ == '__main__':
        url = "https://graph.facebook.com/xxx"
        rvw_list_text = get_all_reviews(url)
    
    
    #AM10:30にjobを実行
    #schedule.every().day.at("10:30").do(get_all_reviews)
    schedule.every(1).minutes.do(get_all_reviews)
    
    while True:
        schedule.run_pending()
        time.sleep(1)
    
[/code]


CC BY-SA 4.0
2019-11-03T04:39:07.247
60209
2019-11-06T13:02:10.780
36325
question
python web-scraping
scheduleで実行時間を自動化し、スクレイピング


`get_all_reviews()` の定義で引数を取るようにしているので、

[code]

    def get_all_reviews(url):
                        ~~~
    
[/code]

呼び出す際には URL の指定が必要なのではないでしょうか？

[code]

    schedule.every(1).minutes.do(get_all_reviews("https://graph.facebook.com/xxx"))
    
[/code]


CC BY-SA 4.0
2019-11-03T07:09:06.483
60212
2019-11-03T07:09:06.483
3060
60209
answer


**判明して全体を改訂**  
その後調べていて幾つか判明しました。以下のものです。

  * `data`が空かどうかの判定方法違い  
`if data != []:`だけで判定していたのは間違いで先に`is not None`で調べておいた方が良い  
`if data is not None and data != []:`のようにする

  * 次ページの url を設定する処理でも例外が発生することがある  
その3行の処理を`try`,`except`で囲む 例外時は`break`する

  * `for d in data:`処理も`is not None`で調べておいた方が良い  
`if data is not None:`の時に呼び出す

  * 他にも何か問題が発生した場合は、`try`,`except`で囲む

対策結果は以下になります。

[code]

    import functools
    import time
    import schedule
    import requests
    import json
    
    def get_all_reviews(url):
        rvw_list_text = []
        i = 1
        while True:
            print(i,'searching')
            i += 1        
            res = requests.get(url)
            res_json = json.loads(res.text)
            data = res_json.get('data')
            if data is not None:
                for d in data:
                    rvw_list_text.append(d)
    
            if data is not None and data != []:
                try:
                    paging = dict(res_json.get('paging'))
                    next_page = str(paging['next'])
                    url = next_page
                except:
                    break
            else:
                break
    
        return rvw_list_text
    
    # ここはコメントアウト
    #if __name__ == '__main__':
    #    url = "https://graph.facebook.com/xxx"
    #    rvw_list_text = get_all_reviews(url)
    
    #AM10:30にjobを実行
    #schedule.every().day.at("10:30").do(get_all_reviews)
    
    # 以下のパラメータに url= を追加。何かのurl は有効なurlに変える
    schedule.every(1).minutes.do(get_all_reviews, url='何かのurl')
    
    while True:
        schedule.run_pending()
        time.sleep(1)
    
[/code]


CC BY-SA 4.0
2019-11-06T05:04:26.420
60291
2019-11-06T13:02:10.780
2019-11-06T13:02:10.780
26370
26370
60209
answer