几页后,Python的beautifulsoup刮板停止正常工作

时间:2019-04-19 08:06:24

标签: python list web-scraping beautifulsoup

我正在刮擦本地站点以出租/购买公寓,并将其写入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 个答案:

答案 0 :(得分:2)

我尝试了0-50和0-100范围内的代码,它可以正常工作。也许问题出在互联网或网页加载上。请尝试使用time.sleep()。希望它能对您有所帮助。