0
votes

Comment gratter toutes les pages sans savoir combien de pages il y a

J'ai la fonction suivante pour rassembler tous les prix, mais j'ai des problèmes de raclage du nombre total de pages. Comment puis-je pouvoir gratter à travers toutes les pages sans connaître la quantité de pages qu'il y a? XXX PRE>

Qu'est-ce que j'ai essayé mais ne semble pas fonctionner P>

for pages in itertools.count(start=1):
    try:
        table = get_data('1').append(table)
    except Exception:
        break


3 commentaires

Vous n'avez pas besoin d'utiliser Urlopen ici si vous importez déjà le module Demandes. Il suffit d'utiliser des demandes.get (URL) à la place. C'est une belle emballeuse autour de Urllib.


Vous n'avez pas non plus besoin de réduire ou d'urllib.Request.


Quelle condition d'erreur est vue ou quel effet souhaitez-vous atténuer? Clarifier les problèmes pourrait nous aider à vous aider davantage. Montrant ce qui ne fonctionne pas aussi pourrait aider les autres à apprendre de cela.


3 Réponses :


-1
votes

Peut-être que vous devriez changer "get_data ('1')" par "get_data (str (page))"?


0 commentaires

0
votes

Essayez avec ce xxx


0 commentaires

2
votes

C'est une excellente occasion de récursivité, à condition que vous n'anticipiez pas plus de 1000 pages, car je pense que Python n'autorise qu'une profondeur de pile maximale de 1000: xxx pré>

donc la fonction get_prices Premier appelle elle-même les paramètres par défaut. Ensuite, il continue à nous appeler et à ajouter des prix supplémentaires sur les prix de la fonction à chaque fois qu'il le fait, jusqu'à ce qu'il atteigne le point où la page suivante ne donne pas le code d'état 200, ou atteint la profondeur de récursivité maximale que vous avez spécifiée. p>

Alternativement, si vous n'aimez pas la récursion ou que vous devez interroger plus de 1000 pages à la fois, vous pouvez utiliser une boucle plus simple, mais moins intéressante, tandis que la boucle: p>

import requests
from bs4 import BeautifulSoup
import pandas as pd

def get_prices():

    prices=[]
    page = 1

    while True:

        url = 'https://www.remax.ca/bc/vancouver--real-estate?page={page}'.format(page=page)
        
        r = requests.get(url)
        if not r:
            break
        if r.status_code != 200:
            break

        soup = BeautifulSoup(r.text, 'html.parser')
        price = soup.find_all('h3', {'class' : 'price'})
        price = pd.DataFrame([(p.text) for p in price]).rename(columns = {0:'Price'})

        prices.append(price)

        page += 1
    
    return prices

prices = get_prices()


1 commentaires

Notez également que vous voulez probablement dormir pendant quelques secondes entre chaque requête, car beaucoup de sites Web vous seront soit 403 si vous dépassez une certaine limite de taux, ou vous vous présentera avec un CAPTCHA. Vous voudrez également fournir des en-têtes.