Форум сайта python.su
0
Всем привет ! Стоит такая задача:Надо сделать чтобы парсер не парсил повторяющиеся новости.
Сам мой парсер парсит 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()
Офлайн
44
а где идет сравнение? или вы не знаете как (или где) его сделать?
зы просто уточняю
и вставьте ссылку на его url Отредактировано AD0DE412 (Авг. 26, 2019 08:07:27)
Офлайн
22
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)
Офлайн
44
if (что то там): continue
и вставьте ссылку на его url Отредактировано AD0DE412 (Авг. 26, 2019 08:29:22)
Офлайн
0
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
Офлайн
22
Использовал ваш код.Вот такая ошибка на выводе:Ну, никто не обещал что сходу всё сразу заработает :) Очевидно, подебажить надо.
Офлайн
22
Сама ссылка https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zader возвращает ошибку 404, а её написание наводит на мысль, что она обрезана: “вор обокравший пять мечетей задер”. Возможно, на каком-то этапе у тебя обрезаются длинные ссылки…
Офлайн
44
ммм … https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zaderжан случаем не 3 символа ? + .html
зы https://www.zakon.kz/4983032-vor-obokravshiy-pyat-mechetey-zaderzhan.html
и вставьте ссылку на его url Отредактировано AD0DE412 (Авг. 26, 2019 12:57:47)
Офлайн
0
StriverЛадно благодарю !
Офлайн