Найти - Пользователи
Полная версия: Не могу сообразить как реализовать парсер чтобы он не парсил повторяющиеся новости
Начало » Python для новичков » Не могу сообразить как реализовать парсер чтобы он не парсил повторяющиеся новости
1
r4khic
Всем привет ! Стоит такая задача:Надо сделать чтобы парсер не парсил повторяющиеся новости.

Сам мой парсер парсит 10 ресурсов.И он парсит ссылку,заголовок,дату,контент новости и после этого он заносит все данные в таблицу для новостей.

Идея моей реализации такая:Проверить url новости в БД.Если такая новость уже есть,то ее не надо добавлять.А если нету то добавить.

Вот структура моей таблицы для новостей.


Вот такой код я написал.Дальше я не могу понять как сделать проверку на url.

 # < Цикл для вызова функции.
    for resource_link in resource_links:
        # < Запрос ссылок новостей из items.
        cursor.execute('SELECT `item_link`  FROM `items`')
        items_links = cursor.fetchall()
        item_page = get_html(resource_link)
        item_title = get_item_title(item_page,title_rule)
        item_datetime = get_item_datetime(item_page,datetime_rule,datetime1_rule)
        item_text_content = get_text_content(item_page,text_rule,text1_rule)
        # < Запись новостей в БД.
        sql = "insert into item (`item_link`,`item_title`,`item_datetime`,`item_text_content`) values (%s,%s,%s,%s)"
        cursor=connection.cursor()
        cursor.execute(sql,(str(resource_link),str(item_title),str(item_datetime),str(item_text_content)))
        cursor.execute('SET NAMES utf8mb4')
        cursor.execute("SET CHARACTER SET utf8mb4")
        cursor.execute("SET character_set_connection=utf8mb4")
        print('Запись в базу данных успешно завершена!')
connection.close()
AD0DE412
а где идет сравнение? или вы не знаете как (или где) его сделать?
зы просто уточняю
Striver
1. Строки загрузки из базы лучше вынести из цикла (выполнять перед ним), зачем N раз делать одну и ту же выборку?
2. Самый простой способ выяснять, обработана ли уже ссылка - запихать все ссылки в множество, и потом проверять, нет ли текущей ссылки в этом множестве.
3. Если её всё-таки не было, то кроме обработки и занесения в базу, запихивать её ещё и в множество.
Вобщем, как-то так:

     cursor.execute('SELECT `item_link`  FROM `items`')
    items_links = cursor.fetchall()
    items_links = set(items_links)
 # < Цикл для вызова функции.
    for resource_link in resource_links:
        # < Запрос ссылок новостей из items.
        if resource_link in items_links:
            continue
        item_page = get_html(resource_link)
        item_title = get_item_title(item_page,title_rule)
        item_datetime = get_item_datetime(item_page,datetime_rule,datetime1_rule)
        item_text_content = get_text_content(item_page,text_rule,text1_rule)
        # < Запись новостей в БД.
        sql = "insert into item (`item_link`,`item_title`,`item_datetime`,`item_text_content`) values (%s,%s,%s,%s)"
        cursor=connection.cursor()
        cursor.execute(sql,(str(resource_link),str(item_title),str(item_datetime),str(item_text_content)))
        cursor.execute('SET NAMES utf8mb4')
        cursor.execute("SET CHARACTER SET utf8mb4")
        cursor.execute("SET character_set_connection=utf8mb4")
        print('Запись в базу данных успешно завершена!')
        items_links.add(resource_link)
connection.close()

Но если у тебя этих ссылок ООЧЧЕЕННЬЬ много (миллионы), и держать их все в памяти нехорошо, то тогда надо оставлять твой вариант с запросом в базу в каждой итерации цикла, только сам запрос сделать с условием:
     cursor.execute('SELECT item_link  FROM items WHERE item_link=%s', (resource_link,))
    if cursor.rowcount >0:
        continue

AD0DE412
 if (что то там):
        continue
интересная конструкция надо бы запомнить
r4khic
Striver
1. Строки загрузки из базы лучше вынести из цикла (выполнять перед ним), зачем N раз делать одну и ту же выборку?
2. Самый простой способ выяснять, обработана ли уже ссылка - запихать все ссылки в множество, и потом проверять, нет ли текущей ссылки в этом множестве.
3. Если её всё-таки не было, то кроме обработки и занесения в базу, запихивать её ещё и в множество.
Вобщем, как-то так:

Использовал ваш код.Вот такая ошибка на выводе:
 zakon
кол-во ссылок: 66
Traceback (most recent call last):
  File "C:/Users/Администратор/PycharmProjects/Task/sql_parser.py", line 109, in <module>
    cursor.execute(sql,(str(resource_link),str(item_title),str(item_datetime),str(item_text_content)))
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pymysql\cursors.py", line 170, in execute
    result = self._query(query)
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pymysql\cursors.py", line 328, in _query
    conn.query(q)
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pymysql\connections.py", line 517, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pymysql\connections.py", line 732, in _read_query_result
    result.read()
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pymysql\connections.py", line 1075, in read
    first_packet = self.connection._read_packet()
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pymysql\connections.py", line 684, in _read_packet
    packet.check_error()
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pymysql\protocol.py", line 220, in check_error
    err.raise_mysql_exception(self._data)
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.IntegrityError: (1062, "Duplicate entry 'https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zader' for key 'item_link'")
Process finished with exit code 1
Striver
Использовал ваш код.Вот такая ошибка на выводе:
Ну, никто не обещал что сходу всё сразу заработает :) Очевидно, подебажить надо.
Проверь, есть ли на самом деле уже сслыка 'https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zader' в базе, проверь, попадает ли она в множество (хотя бы print(items_links) перед циклом поставь), и т.д.
Тут за тебя по-любому никто не сможет это сделать, даже если захочет (что вряд-ли), у нас ведь нет функций get_html, get_item_title, и т.д.
Striver
Сама ссылка https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zader возвращает ошибку 404, а её написание наводит на мысль, что она обрезана: “вор обокравший пять мечетей задер”. Возможно, на каком-то этапе у тебя обрезаются длинные ссылки…
AD0DE412
ммм … https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zaderжан случаем не 3 символа ? + .html
зы https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zaderzhan.html
r4khic
Striver
Ладно благодарю !
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB