2017-01-25 7 views
2

то, что я пытаюсь сделать, это извлекать данные с динамической страницы, которая постоянно перезагружается с информацией. Способ, которым я настроен, заключается в том, что он обновляется каждые 60 секунд. Проблема в том, что старые данные не удаляются со страницы, поэтому, когда программа просматривает данные после обновления, есть дубликаты.Скремблирование динамических данных и исключение дубликатов с помощью BS4, Selenium in Python

Примечание: программа спит в начале, так как изначально нет сообщений для очистки.

Я ищу способ или решение использовать последнюю запись (в данном случае это сообщения [-1]) в качестве отправной точки для поиска, чтобы предотвратить дублирование.

Цените всю помощь! Спасибо.

driver.get(URL) 
while 1==1: 
    time.sleep(60) 
    chat_page = driver.page_source 
    chat_soup = BeautifulSoup(chat_page,'lxml') 
    messages = chat_soup.findAll('div', attrs={'class':'message first'}) 
    for message in messages: 
     username = message.div.h2.span.strong.text 
     text = message.find('div', attrs={'class':'markup'}).get_text() 
     timestamp = message.find('span', attrs={'class':'timestamp'}).get_text() 
     today = str(datetime.date.today()) 
     timestamp = timestamp.replace('Today', today) 

     usernames.append(username) 
     timestamps.append(timestamp) 
     texts.append(text) 
     print(timestamp, username," : ",text) 

Я создал временное решение, которое проверяет каждую запись перед входом в мою базу данных SQLite3. Программа может работать, используя «INSERT OR IGNORE». К сожалению, программа постоянно проверяет дубликаты, поскольку у нее нет возможности отфильтровать данные, которые уже были очищены. Ниже мое временное решение:

driver.get(URL) 
while 1==1: 
    chat_page = driver.page_source 
    chat_soup = BeautifulSoup(chat_page,'lxml') 
    messages = chat_soup.findAll('div', attrs={'class':'message first'}) 
    for message in reversed(messages): 
     username = message.div.h2.span.strong.text 
     usernames.append(username) 
     text = message.find('div', attrs={'class':'markup'}).get_text() 
     text = text.replace('"', '') 
     text = text.replace("'", "") 
     username = username.replace('"', '') 
     username = username.replace("'", "") 
     timestamp = message.find('span', attrs={'class':'timestamp'}).get_text() 
     today = str(datetime.date.today()) 
     timestamp = timestamp.replace('Today', today) 
     isbot = message.find('span', attrs={'class':'bot-tag'}) 
     if (isbot): 
      username = '(BOT) ' + username 
     sql = '''INSERT OR IGNORE INTO 'chats' ('timestamp', 'username', 'text') VALUES ("%s", "%s", "%s")''' % (timestamp, username, text) 
     conn.executescript(sql) 

ответ

0

Итак, вы ищете способ избежать проверки каждой записи для дубликатов? Предполагая, что каждая временная метка является уникальным значением, и что reversed(messages) в порядке от последнего сообщения до самого старого сообщения.

timestamp_array = [] 
while 1==1: 
    chat_page = driver.page_source 
    chat_soup = BeautifulSoup(chat_page,'lxml') 
    messages = chat_soup.findAll('div', attrs={'class':'message first'}) 
    for message in reversed(messages): 
     username = message.div.h2.span.strong.text 
     usernames.append(username) 
     text = message.find('div', attrs={'class':'markup'}).get_text() 
     text = text.replace('"', '') 
     text = text.replace("'", "") 
     username = username.replace('"', '') 
     username = username.replace("'", "") 
     timestamp = message.find('span', attrs={'class':'timestamp'}).get_text() 
     today = str(datetime.date.today()) 
     timestamp = timestamp.replace('Today', today) 
     isbot = message.find('span', attrs={'class':'bot-tag'}) 
     if (isbot): 
      username = '(BOT) ' + username 
     if timestamp in timestamp_array: 
      break 
     timestamp_array.append(timestamp) 
     sql = '''INSERT OR IGNORE INTO 'chats' ('timestamp', 'username', 'text') VALUES ("%s", "%s", "%s")''' % (timestamp, username, text) 
     conn.executescript(sql) 

Это произойдет после того, как будет достигнут первый дубликат.

+0

Вы полагаете, что все, что мне нужно сделать, это добавить обратное() к моему для заявления? Я не понимаю вашего предложения полностью, я просмотрел документацию для этого. – dg4e

+0

Я пробовал это решение, и он просто изменил порядок, но не помогает, извините. – dg4e

+0

Похоже, что вы искали итерацию, начиная с последнего элемента 'messages'? Не могли бы вы уточнить ** «Я ищу способ или решение использовать последнюю запись (в данном случае это сообщения [-1]) в качестве отправной точки для поиска» ** –

1

Я нашел решение, использующее set.difference, которое хорошо работает.

В моей проблеме есть определенное количество данных, которое существует за один раз (скажем, 10). Мы хотим получить новые ценности без старого.

olddata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
newdata = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14] 
unique_data = set(newdata).difference(olddata) 

=

{11, 12, 13, 14} 

Final Рабочий код:

while 1==1: 
    chat_page = driver.page_source 
    chat_soup = BeautifulSoup(chat_page,'lxml') 
    messages = chat_soup.findAll('div', attrs={'class':'message first'}) 
    messages_dedupe = set(messages).difference(oldlist) 
    for message in messages_dedupe: 
     username = message.div.h2.span.strong.text 
     text = message.find('div', attrs={'class':'markup'}).get_text() 
     timestamp = message.find('span', attrs={'class':'timestamp'}).get_text() 
     today = str(datetime.date.today()) 
     timestamp = timestamp.replace('Today', today) 
     isbot = message.find('span', attrs={'class':'bot-tag'}) 
     if (isbot): 
      username = '(BOT) ' + username 
     usernames.append(username) 
     timestamps.append(timestamp) 
     texts.append(text) 
     oldlist = messages 
     sqlvalues = (username, timestamp, text) 
     c.execute("INSERT OR IGNORE INTO db (username, timestamp, text) VALUES (?, ?, ?)", sqlvalues) 
     conn.commit() 
     print(timestamp, username,":",text) 
    time.sleep(20)