Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 26, 2019 07:41:49

r4khic
Зарегистрирован: 2019-07-23
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу сообразить как реализовать парсер чтобы он не парсил повторяющиеся новости

Всем привет ! Стоит такая задача:Надо сделать чтобы парсер не парсил повторяющиеся новости.

Сам мой парсер парсит 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()

Офлайн

#2 Авг. 26, 2019 08:03:27

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Не могу сообразить как реализовать парсер чтобы он не парсил повторяющиеся новости

а где идет сравнение? или вы не знаете как (или где) его сделать?
зы просто уточняю



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

есчщо

Отредактировано AD0DE412 (Авг. 26, 2019 08:07:27)

Офлайн

#3 Авг. 26, 2019 08:08:03

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Не могу сообразить как реализовать парсер чтобы он не парсил повторяющиеся новости

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



Отредактировано Striver (Авг. 26, 2019 08:09:41)

Офлайн

#4 Авг. 26, 2019 08:27:11

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Не могу сообразить как реализовать парсер чтобы он не парсил повторяющиеся новости

 if (что то там):
        continue
интересная конструкция надо бы запомнить



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

есчщо

Отредактировано AD0DE412 (Авг. 26, 2019 08:29:22)

Офлайн

#5 Авг. 26, 2019 09:12:06

r4khic
Зарегистрирован: 2019-07-23
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу сообразить как реализовать парсер чтобы он не парсил повторяющиеся новости

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

Офлайн

#6 Авг. 26, 2019 09:47:00

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Не могу сообразить как реализовать парсер чтобы он не парсил повторяющиеся новости

Использовал ваш код.Вот такая ошибка на выводе:
Ну, никто не обещал что сходу всё сразу заработает :) Очевидно, подебажить надо.
Проверь, есть ли на самом деле уже сслыка 'https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zader' в базе, проверь, попадает ли она в множество (хотя бы print(items_links) перед циклом поставь), и т.д.
Тут за тебя по-любому никто не сможет это сделать, даже если захочет (что вряд-ли), у нас ведь нет функций get_html, get_item_title, и т.д.



Офлайн

#7 Авг. 26, 2019 09:51:15

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Не могу сообразить как реализовать парсер чтобы он не парсил повторяющиеся новости

Сама ссылка https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zader возвращает ошибку 404, а её написание наводит на мысль, что она обрезана: “вор обокравший пять мечетей задер”. Возможно, на каком-то этапе у тебя обрезаются длинные ссылки…



Офлайн

#8 Авг. 26, 2019 12:50:38

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Не могу сообразить как реализовать парсер чтобы он не парсил повторяющиеся новости

ммм … https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zaderжан случаем не 3 символа ? + .html
зы https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zaderzhan.html



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

есчщо

Отредактировано AD0DE412 (Авг. 26, 2019 12:57:47)

Офлайн

#9 Авг. 26, 2019 13:12:54

r4khic
Зарегистрирован: 2019-07-23
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу сообразить как реализовать парсер чтобы он не парсил повторяющиеся новости

Striver
Ладно благодарю !

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version