Webscraping JSON - PullRequest
       67

Webscraping JSON

0 голосов
/ 31 марта 2020

Я пытаюсь очистить новые сообщения от pastebin, используя там API. Это работает довольно хорошо, но я продолжаю получать повторяющиеся сообщения. Я сейчас пытаюсь сравнить два списка и сказать, какие списки не изменились, однако это делает его чередующимся. Как мне исправить мой метод сравнения списков, чтобы я мог получать самые последние вставки, не получая альтернативных повторов? Вот мой текущий код.


old_response = []
while True:
    try:
        response = s.get("http://scrape.pastebin.com/api_scraping.php?limit=5").json()

        for x in old_response:
            response.remove(x)
        response.remove(old_response)


        for i in range(len(response)):
            print(i)
            time.sleep(2.5)
            logger.info("Posted Link")
            #thread = threading.Thread(target=communicate,args=(response, i))
            #thread.start()
            #thread.join()
        old_response = response[:]
    except Exception as e:
        logger.critical(f"ERROR: {e}")
        pass

Кроме того, поскольку API является частным, я просто покажу, каким будет простой ответ. Допустим, вы очищаете 2 результата. Он вернет два последних результата примерно так:

[
    {
        "scrape_url": "https://scrape.pastebin.com/api_scrape_item.php?i=J2CeszTZ",
        "full_url": "https://pastebin.com/J2CeszTZ",
        "date": "1585606093",
        "key": "J2CeszTZ",
        "size": "98",
        "expire": "0",
        "title": "",
        "syntax": "text",
        "user": "irismar"
    },
    {
        "scrape_url": "https://scrape.pastebin.com/api_scrape_item.php?i=hYJ7Xcmm",
        "full_url": "https://pastebin.com/hYJ7Xcmm",
        "date": "1585606099",
        "key": "hYJ7Xcmm",
        "size": "1371",
        "expire": "0",
        "title": "",
        "syntax": "php",
        "user": ""
    }
]


Вот простой ответ: если мы переосмыслим sh наш URL (http://scrape.pastebin.com/api_scraping.php?limit=2), он вернет нам два последних результата:


[
    {
        "scrape_url": "https://scrape.pastebin.com/api_scrape_item.php?i=ZcMJxCwc",
        "full_url": "https://pastebin.com/ZcMJxCwc",
        "date": "1585606208",
        "key": "ZcMJxCwc",
        "size": "266166",
        "expire": "1585606808",
        "title": "OpenEuCalendar",
        "syntax": "text",
        "user": "scholzsebastian"
    },
    {
        "scrape_url": "https://scrape.pastebin.com/api_scrape_item.php?i=qY5VdbSk",
        "full_url": "https://pastebin.com/qY5VdbSk",
        "date": "1585606143",
        "key": "qY5VdbSk",
        "size": "25",
        "expire": "0",
        "title": "Online jobs",
        "syntax": "text",
        "user": ""
    }
]

Если я работаю с большим количеством наборов данных, он часто чередует посты, я пытаюсь обнаруживать только новые посты и не сохранять повторные вставки. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Я бы настроил словарь для сбора ключей и дат вставок. Когда сервер возвращает элемент, который мы уже знаем (тот же ключ и дата), мы пропускаем его.

Это лучше всего работает при настройке всего объекта в качестве генератора:

import time
import json
import requests
import logging

def scraper():
    seen_items = {}
    api_url = "http://scrape.pastebin.com/api_scraping.php"

    while True:
        try:
            response = requests.get(api_url, {'limit': 5})
            for item in response.json():
                last_known_date = seen_items.get(item['key'])
                if item['date'] != last_known_date:
                    seen_items[item['key']] = item['date']
                    yield item
            time.sleep(2.5)
        except json.JSONDecodeError as e:
            logging.error(f"Server response: {response.text}")
            return

Теперь мы может повторять элементы, как если бы они были списком:

for item in scraper():
    print(item)

Todo

  • Добавить другие обработчики ошибок по отдельности. Избегайте except Exception, это слишком обобщенно c.
  • Добавьте более умный механизм синхронизации, чем time.sleep(2.5).
  • Возможно, добавьте постоянство, переместив seen_items из функции и сохранив его где-нибудь .
1 голос
/ 31 марта 2020

Вместо удаления из текущего я добавлю в старый список, когда появится новый элемент в response. Что-то вроде:

old_response = []
while True:
    try:
        response = s.get("http://scrape.pastebin.com/api_scraping.php?limit=5").json()

        for record in response:
            if record in old_response:
               # we have seen it already, skip it then
               continue

            # We haven't seen it, so let's add it
            old_response.append(record)

        for i in range(len(response)):
            print(i)
            time.sleep(2.5)
            logger.info("Posted Link")
            #thread = threading.Thread(target=communicate,args=(response, i))
            #thread.start()
            #thread.join()

        # This should not be needed anymore
        # old_response = response[:]

    except Exception as e:
        logger.critical(f"ERROR: {e}")
        pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...