Форум сайта python.su
Здравствуйте, уважаемые питонисты!
Бьюсь уже 2 день над выгрузкой данных в бд от парсинга.
Ниже представлен мой код (я начинающий), в результате этого кода в таблицу добавляется итерация данных (т.е сначала строка с 1 значением, потом с 2, и т.д). Не понимаю как исправить ситуацию, перепробовал множество вариантов - добавление класса было уже результатом почти отчаяния.
Интересуют 2 вещи: 1) Я правильно понимаю, что я изначально выбрал неправильный алгоритм и моя структура принципе неудобно, если да, то в каком направлении копать?
2) Собственно, можно ли в итоге достичь результата с моим кодом, и если да, то как?
ПС лишние бибилиотеки, которые подгружены - они на самом деле не лишние, но эти куски кода у меня пока закомментированы, сюда я их вставлять не стал, чтобы не мешали. Для примера в коде парсится только одна страница, чтобы понять.
ПСС Тут еще загвоздка в том, что на каждом урле указаны свои данные (этаж может быть указан, а может быть и нет)
Благодарю за внимание!
import requests, time, re, pymysql from bs4 import BeautifulSoup from selenium import webdriver from urllib.request import urlretrieve import subprocess url = 'https://www.avito.ru/chelyabinsk/kvartiry/prodam' allpages = [] #основной поток программы - получаем список ссылок r = requests.get(url) response = r.content soup = BeautifulSoup(response, 'html.parser') houses = soup.find('div', class_='item-highlight') ahref = houses.find('a').get('href') listofparams = [] houses = soup.find_all('div', class_='item-highlight') class House: def __init__(self, floor=None, rooms=None, floorhouse=None, typeofhouse=None, allsquare=None): self.floor = floor self.rooms = rooms self.floorhouse = floorhouse self.typeofhouse = typeofhouse self.allsquare = allsquare def __str__(self): print('we have a '+ str(self.floor)) a = House() def goodcontent(objReturn, i=0): global a for letter in objReturn: if letter == ':': category = objReturn[1:i] objReturn = objReturn[i+2:] else: i += 1 continue if category == 'Этаж': a.floor = objReturn # floor = objReturn elif category.startswith('Количество'): a.rooms = objReturn[0] # rooms = objReturn[0] elif category.startswith('Этажей'): a.floorhouse = objReturn # floorhouse = objReturn elif category.startswith('Тип'): a.typeofhouse = objReturn # typeofhouse = objReturn elif category.startswith('Общая'): a.allsquare = objReturn # allsquare = objReturn a = House(a.floor, a.rooms, a.floorhouse, a.typeofhouse, a.allsquare) i = 0 conn = pymysql.connect(host='127.0.0.1', user='root', password=None, db='parser', charset='utf8mb4') cur = conn.cursor() cur.execute('USE parser') cur.execute('INSERT INTO appartaments (floor, room, housefloor, typeofwalls, squarehouse) VALUES (%s, %s, %s, %s, %s)', (a.floor, a.rooms, a.floorhouse, a.typeofhouse, a.allsquare)) conn.commit() cur.close() conn.close() def maincontent(ahref, i=0): global titleAnouncement r = requests.get('https://www.avito.ru/chelyabinsk/kvartiry/1-k_kvartira_43_m_79_et._139234913') respDescr = r.content soup = BeautifulSoup(respDescr, 'html.parser') titleAnouncement = soup.find('span', class_='title-info-title-text').get_text() print(titleAnouncement) countRoom = soup.find('li', class_='item-params-list-item') countRoomReturn = countRoom.get_text() countRoomReturn = goodcontent(countRoomReturn) listofparams.append(countRoomReturn) while i == 0: try: countRoom = countRoom.findNextSibling() countRoomReturn = countRoom.get_text() countRoomReturn = goodcontent(countRoomReturn) except: print('Элементы закончились') break maincontent('dw')
Отредактировано JOHN_16 (Апрель 17, 2018 15:41:19)
Офлайн
У вас в цикле идет генерация данных а потом запись в таблицу - что понятное дело перезапишет предыдущие данные и всегда будет последняя строка
перенесте строки отвечающие за запись в базу в цикл for
Офлайн
ZerGБольшое спасибо за ответ, но перенос строк записи в бд в цикл фор не помог бы - они бы также исполнялись в цикле и получалось бы +4 rows в бд вместо 1. Но ночью уже все таки меня осенило - удалил функцию goodcontent и, чуть-чуть измененную перенес в maincontent )
У вас в цикле идет генерация данных а потом запись в таблицу - что понятное дело перезапишет предыдущие данные и всегда будет последняя строкаперенесте строки отвечающие за запись в базу в цикл for
Отредактировано Santik (Апрель 18, 2018 12:13:11)
Офлайн