質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

551閲覧

pythonでリストに重複が起きた時,条件分岐をしたいです.

hiyoko-kun

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/03/20 04:09

編集2019/03/20 04:21

前提・実現したいこと

あるサイト(https://www.spamcop.net/w3m?action=inprogress)に掲載されたあるIPアドレスを重複なく,定期的に取得したい.
イメージ説明
上のサイトのIPアドレスを上から順に取得し,重複がある時はcsvに出力しないようにしたい.

現在のプログラムではwhile文が終わるたびに,csv_list = []により,初期化されてしまい,前回のcsv_listのデータが消えてしまう.

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

# coding: UTF-8 import urllib.request, urllib.error from bs4 import BeautifulSoup from datetime import datetime import csv import time time_flag = True # 永久に実行させます while True: if datetime.now().minute != 0 and datetime.now().minute != 30: continue time.sleep(58) # csvを追記モードで開きます→ここでcsvを開くのはファイルが大きくなった時にcsvを開くのに時間がかかるためです f = open('IPlist.csv', 'a') # csvに記述するレコードを作成します csv_list = [] # 現在の時刻を年、月、日、時、分、秒で取得します time_ = datetime.now().strftime("%Y/%m/%d %H:%M:%S") # アクセスするURL url = "https://www.spamcop.net/w3m?action=inprogress" # URLにアクセスする htmlが帰ってくる html2 = urllib.request.urlopen(url) # htmlをBeautifulSoupで扱う soup = BeautifulSoup(html2, "html.parser") IP = "" try: IP = (soup.select_one(' tr:nth-child(2) > td:nth-child(3) > a').text) print (time_, IP) if IP in csv_list: print ("同じIPアドレスが存在します", time_, IP) else: writer = csv.writer(f, lineterminator='\n') csv_list.pop(0) csv_list.pop(0) # 1カラム目に時間を挿入します csv_list.append(time_) csv_list.append(IP) # csvに追記敷きます writer.writerow(csv_list) IP = (soup.select_one(' tr:nth-child(3) > td:nth-child(3) > a').text) print (time_, IP) if IP in csv_list: print ("同じIPアドレスが存在します", time_, IP) else: writer = csv.writer(f, lineterminator='\n') csv_list.pop(0) csv_list.pop(0) # 1カラム目に時間を挿入します csv_list.append(time_) csv_list.append(IP) # csvに追記敷きます writer.writerow(csv_list)

試したこと

csv_list = []により毎回,初期化が行われていると考えたため,while文の中で一回だけ
csv_list = []が実行されるようにした.

Pyhton

1i=1 2 3# 永久に実行させます 4while True: 5 if datetime.now().minute != 0 and datetime.now().minute != 30: 6 continue 7 time.sleep(58) 8 9 # csvを追記モードで開きます→ここでcsvを開くのはファイルが大きくなった時にcsvを開くのに時間がかかるためです 10 f = open('IPlist.csv', 'a') 11 12 # csvに記述するレコードを作成します 13 csv_list = [] 14 15 if i >= 2: 16 print("二回目以降です") 17 else: 18 csv_list = [] 19 i+=1

csvの出力結果です.
イメージ説明
16:41と16:42にプログラムを実行しました.二回目の16:42の時は同じものが二回出力されました.
また,一回目と二回目で同じIPアドレスがありました.(csv_listが初期化されてる?)

補足情報(FW/ツールのバージョンなど)

時間がある時に答えて頂けたら嬉しいです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

現在 csv_list

  • 一度を出現したIPを保持する
  • csvに書き込む為のデータを生成する

の2つの機能を担っているようですので、前者だけを行うようにして

Python

1writer = csv.writer(f, lineterminator='\n') 2csv_list.pop(0) 3csv_list.pop(0) 4# 1カラム目に時間を挿入します 5csv_list.append(time_) 6csv_list.append(IP) 7# csvに追記敷きます 8writer.writerow(csv_list)

の箇所(2箇所)を

Python

1writer = csv.writer(f, lineterminator='\n') 2# csv_list にIPを追記する 3csv_list.append(IP) 4# csvに追記敷きます 5writer.writerow([time_, IP])

とすると良いのではないでしょうか

投稿2019/03/20 04:39

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiyoko-kun

2019/03/20 07:28

質問に答えて頂いて、ありがとうございます。 解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問