Как автоматически удалить дубликаты данных Web Scraper в Django - PullRequest
0 голосов
/ 21 июня 2019

У меня есть webscrapper в Python. Он сохраняет результат в модели django, поэтому, когда я обновляю страницу, он запускает webscrapper, дублируя уже существующие данные. Я попытался удалить данные с помощью списка (dict.fromkeys (my2)) , но безрезультатно.

views.py

def Scrappy(request):

        session = requests.Session()
        session.headers = {
            "User-Agent": 'User-Agent'}

        url = 'https://www.google.com/blog/'

        content = session.get(url, verify=False,).content

        soup = BeautifulSoup(content, "html.parser")


        obj1 = soup.find_all(
            'div', {'class': 'td_module_3 td_module_wrap td-animation-stack'})

        obj2 = soup.find_all(
            'div', {'class': 'td_module_10 td_module_wrap td-animation-stack'})

        for x in obj1:
            linkX = x.find('a', {'class': 'td-image-wrap'})

            #saving the fetched data into variables

            link_x = linkX.get('href')
            title_x = linkX.get('title')
            img_src_x = x.find('img', {'class': 'entry-thumb'})['src']
            link_x.replace(u"\u2019",  "-")
            link_x.decode('utf-16', 'ignore')
            img_src_x.replace(u"\u2019", "-")
            img_src_x.decode('utf-16', 'ignore')
            new_Web = WebScraper()
            new_Web.web_title = title_x
            new_Web.web_url = str(link_x)
            new_Web.my_img = str(img_src_x)
            try:
                my = {new_Web}
                my = list(dict.fromkeys(my))
                new_Web.save()

            except:
                pass
            # new_Web.save()




        for y in obj2:
            linkY = y.find('a', {'class': 'td-image-wrap'})

            #saving the fetched data into variables

            link_y = linkY.get('href')
            title_y = linkY.get('title')
            img_src_y = y.find('img', {'class': 'entry-thumb'})['src']
            img_src_y.replace(u"\u2019", "-")
            img_src_y.decode('utf-16', 'ignore')
            link_y.replace(u"\u2019", "-")
            link_y.decode('utf-16', 'ignore')

            new_Web2 = WebScraper()
            new_Web2.web_title = title_y
            new_Web2.web_url = str(link_y)
            new_Web2.my_img = str(img_src_y)
            try:
                my2 = ["new_Web2"]
                my2 = list(dict.fromkeys(my2))
                new_Web2.save()

            except:
                pass
            # new_Web2.save()


        return redirect('Veb-View')

Я ожидаю, что не буду создавать дубликаты элементов в БД, так как это излишне заполняет базу данных. Пожалуйста, поделитесь методом или ссылкой, как автоматически удалять дубликаты. Заранее спасибо.

1 Ответ

1 голос
/ 21 июня 2019

вы можете использовать get_or_create, чтобы избежать дубликатов, таких как

new_Web2,created = WebScraper.objects.get_or_create(web_title=title_y,web_url=str(link_y),my_img=str(img_src_y))
if created:
  print("new object created")
else:
  print("existing object retrived")

, get_or_create возвращает объект, связывающийся с кортежем, и логическое поле, которое сообщает, что новый объект создан или нет

...