サイトの更新情報をLINEに通知したい
Q&A
Closed
解決したいこと
ポータルサイトから更新された情報をスクレイピングして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