Beautifulsoup скребок Python перестает работать правильно после нескольких страниц - PullRequest
0 голосов
/ 19 апреля 2019

Я очищаю свой местный сайт для аренды / покупки квартир и записываю их в файл Excel. Количество рекламных объявлений на сайте составляет около 9500, но мой скребок перестает работать правильно после примерно 1000, а затем, по-видимому, очищает только одно добавление на страницу.

Я добавил

prink(link) 

в цикле, так что он показывает мне, над какой страницей он сейчас работает.

вот результат:

https://ogloszenia.trojmiasto.pl/nieruchomosci-rynek-pierwotny/?strona=34
https://ogloszenia.trojmiasto.pl/nieruchomosci-rynek-pierwotny/?strona=34
https://ogloszenia.trojmiasto.pl/nieruchomosci-rynek-pierwotny/?strona=34
https://ogloszenia.trojmiasto.pl/nieruchomosci-rynek-pierwotny/?strona=34
https://ogloszenia.trojmiasto.pl/nieruchomosci-rynek-pierwotny/?strona=34
https://ogloszenia.trojmiasto.pl/nieruchomosci-rynek-pierwotny/?strona=34
https://ogloszenia.trojmiasto.pl/nieruchomosci-rynek-pierwotny/?strona=35
https://ogloszenia.trojmiasto.pl/nieruchomosci-rynek-pierwotny/?strona=36
https://ogloszenia.trojmiasto.pl/nieruchomosci-rynek-pierwotny/?strona=37
https://ogloszenia.trojmiasto.pl/nieruchomosci-rynek-pierwotny/?strona=38

После страницы 34 загружается только одно дополнение на страницу.

Я попытался изменить диапазон на 50,100 / 100,150 и т. Д., Но он вел себя аналогично, после примерно 25-30 страниц он вел себя как выше.

from bs4 import BeautifulSoup
from requests import get
import pandas as pd
import itertools
import matplotlib.pyplot as plt

headers = ({'User-Agent':
            'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'})

tytuly = []
lokalizacje = []
Ceny = []
Ceny_m = []
Powierzchnie = []
L_pokoi = []
Pietra = []
rok_budowy = []

strona = 0
numer = 0
for strona in range(0,50):
    strona +=1
    link = 'https://ogloszenia.trojmiasto.pl/nieruchomosci-rynek-pierwotny/?' + 'strona=' + str(strona)
    r = get(link, headers = headers)
    zupa = BeautifulSoup(r.text, 'html.parser')
    ogloszenia= zupa.find_all('div', class_="list__item")
    print(link)
    for ogl in ogloszenia:
        try:
            tytul = ogl.find_all('h2', class_ ="list__item__content__title")[0].text
        except IndexError:
            tytul = ''
        try:
            powierzchnia = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[0].text
        except IndexError:
            powierzchnia = ''
        try:    
            liczba_pok = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[1].text
        except IndexError:
            liczba_pok = ''
        try:
            pietro = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[2].text
        except IndexError:
            pietro = ''
        try:
            if pietro == '':
                rok = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[2].text
            else:
                rok = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[3].text 
        except IndexError:
            rok = ''    
        try:
            lokalizacja = ogl.find_all('p', class_ = "list__item__content__subtitle")[0].text
        except IndexError:
            lokalizacja = ''
        try:
            cena = ogl.find_all('p', class_ = "list__item__price__value")[0].text
        except IndexError:
            cena = ''
        try:
            cena_m = ogl.find_all('p', class_ = "list__item__details__info details--info--price")[0].text
        except IndexError:
            cena_m = ''

        print(link)
        sys.getsizeof(tytuly)
        tytuly.append(tytul)
        lokalizacje.append(lokalizacja)
        Ceny.append(cena)
        Ceny_m.append(cena_m) 
        Powierzchnie.append(powierzchnia)  
        Pietra.append(pietro)
        L_pokoi.append(liczba_pok)
        rok_budowy.append(rok)

        kolumny = ["Tytul","Lokalizacja","Cena","Cena za metr","Powierzchnia","Pietro","Liczba pokoi","Rok budowy"]
zrzut = pd.DataFrame({"Tytul": tytuly,
                     "Lokalizacja": lokalizacje,
                     "Cena": Ceny,
                     "Cena za metr": Ceny_m,
                     "Powierzchnia": Powierzchnie,
                     "Pietro": Pietra,
                     "Liczba pokoi": L_pokoi,
                     "Rok budowy": rok_budowy})[kolumny]



zrzut.to_excel('rynek_pierwotnyy.xls')

Я предполагаю, что списки перегружены, и поэтому он ведет себя так. Я думаю, может быть, очистка списков и экспорт в Excel после каждого цикла поможет? Но если я сделаю это так, мне придется добавить файл Excel.

1 Ответ

2 голосов
/ 19 апреля 2019

Я попробовал ваш код в диапазоне 0-50 и 0-100, он работает без вашей проблемы.Возможно проблема в интернете или загрузке страницы.Пожалуйста, попробуйте использовать time.sleep ().Надеюсь, это поможет вам.

...