Уведомления

Группа в Telegram: присоединиться

#1 Апрель 17, 2018 15:07:19

Santik
Зарегистрирован: 2016-07-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись спарсенных данных в бд

Здравствуйте, уважаемые питонисты!
Бьюсь уже 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)

Офлайн

#2 Апрель 18, 2018 12:02:48

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 1465
Репутация: +  43  -
Профиль   Отправить e-mail  

Запись спарсенных данных в бд

У вас в цикле идет генерация данных а потом запись в таблицу - что понятное дело перезапишет предыдущие данные и всегда будет последняя строка
перенесте строки отвечающие за запись в базу в цикл for

Офлайн

#3 Апрель 18, 2018 12:12:02

Santik
Зарегистрирован: 2016-07-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись спарсенных данных в бд

ZerG
У вас в цикле идет генерация данных а потом запись в таблицу - что понятное дело перезапишет предыдущие данные и всегда будет последняя строкаперенесте строки отвечающие за запись в базу в цикл for
Большое спасибо за ответ, но перенос строк записи в бд в цикл фор не помог бы - они бы также исполнялись в цикле и получалось бы +4 rows в бд вместо 1. Но ночью уже все таки меня осенило - удалил функцию goodcontent и, чуть-чуть измененную перенес в maincontent )
еще раз спасибо!
upd + создал еще отдельную функцию для записи данных в бд )

Отредактировано Santik (Апрель 18, 2018 12:13:11)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version