gdap
@gdap (gdap)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

サイトの更新情報をLINEに通知したい

解決したいこと

ポータルサイトから更新された情報をスクレイピングしてLINEに通知するコードをかいています。
スクレイピングした情報をCSVファイルに保存し、次回スクレイピングした時に保存されていない情報のみを取得することで、更新された情報を通知するようにしたいのですが、うまく通知されません。解決方法を教えてください。

該当するソースコード

import csv
import os
import sys
import urllib.request

import time
import pandas as pd 
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions,Remote


LINE_TOKEN = "LINE_TOKEN"
LINE_NOTIFY_URL = 'LINE_NOTIFY_URL'


def main():

    save_file_path = 'save.csv'
    if not has_csv(save_file_path):
        create_csv(save_file_path)
    create_csv(save_file_path)
    past_content = read_csv(save_file_path)

    options = ChromeOptions()
    webdriver = Chrome(options=options)

    logging(webdriver)

    time.sleep(5)

    contents = scrape_contents_list(webdriver)


    update_contents = contents_diff(past_content, contents)
    output_csv(update_contents, save_file_path)

    if update_contents:
        send_to_line(update_contents)


def has_csv(file_path):
    return os.path.exists(file_path) and os.path.getsize(file_path) != 0


def create_csv(file_path):
    with open(file_path, 'w', newline='', encoding='utf-8-sig') as file:
        file.write('タイトル,更新日')


def read_csv(file_path):
    csv_list = pd.read_csv(file_path, header=None).values.tolist()
    return csv_list


def logging(webdriver):
    webdriver.get('サイトURL')


    webdriver.find_element_by_xpath('//*[@id="userId"]').send_keys("")
    webdriver.find_element_by_xpath('//*[@id="password"]').send_keys("")

    time.sleep(3)

    webdriver.find_element_by_xpath('//*[@id="loginButton"]').click()


def scrape_contents_list(webdriver):

    contents=[]
    for details in webdriver.find_elements_by_css_selector('selector'):
        date1 = details.find_element_by_css_selector('selector').text
        title1 = details.find_element_by_css_selector('selector').text
    for details in webdriver.find_elements_by_css_selector('selector'):
        date2 = details.find_element_by_css_selector('selector').text
        title2 = details.find_element_by_css_selector('selector').text

    contents.append([date1,title1,date2,title2])

    return contents   




def contents_diff(past_content, contents):
    return_contents = []
    for content in contents:
        if content not in past_content:
            return_contents.append(content)
    return return_contents


def output_csv(update_contents, file_path):
    with open(file_path, 'w', newline='', encoding='utf_8-sig') as file:
        writer = csv.writer(file)
        for row in update_contents:
            writer.writerow(row) 


def send_to_line(update_contents):
    method = "POST"
    headers = {"Authorization": "Bearer %s" % LINE_TOKEN}
    payload = {"message": update_contents}
    try:
        payload = urllib.parse.urlencode(payload).encode("utf-8")
        req = urllib.request.Request(
            url=LINE_NOTIFY_URL, data=payload, method=method, headers=headers)
        urllib.request.urlopen(req)
    except Exception as e:
        print ("Exception Error: ", e)
        sys.exit(1)




if __name__ == '__main__':
    main()    


下記の関数でCSVファイルに保存されているかを判断して、保存されていない情報のみが返されると思うのですが、実行するとすべての情報が通知されます。

def contents_diff(past_content, contents):
    return_contents = []
    for content in contents:
        if content not in past_content:
            return_contents.append(content)
    return return_contents

解決方法を教えていただけるとうれしいです。

0

No Answers yet.

Your answer might help someone💌