0
votes

Utiliser Beautifulsoup pour récupérer des données Web - J'ai des problèmes pour extraire ce dont j'ai besoin

Je souhaite extraire les numéros ASIN des produits sur la page Web ci-dessous. Je suis capable d'extraire certains des autres éléments dont j'ai besoin, mais je ne peux pas extraire les numéros ASIN. Les numéros ASIN suivent l'élément 'data-asin' du HTML sur amazon. Je veux ensuite imprimer la sortie de la même manière que j'ai les autres éléments. Merci d'avance pour votre aide

import csv
from bs4 import BeautifulSoup
from selenium import webdriver

path = "C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(path)

def get_url(search_term):
    """Generate a url from search term"""
    template = 'https://www.amazon.co.uk/s?k={}&ref=nb_sb_noss_2'
    search_term = search_term.replace(' ','+') 
    return template.format(search_term)

url = get_url('Ultrawide monitor')
print(url)

driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')
results = soup.find_all('div',{'data-component-type': 's-search-result'})

item = results [0]

atag = item.h2.a
atag.text
description = atag.text.strip()
url = 'https//www.amazon.com'+atag.get('href')
price_parent = item.find('span', 'a-price')
price = price_parent.find('span', 'a-offscreen').text
rating = item.i.text
review_count = item.find('span', {'class': 'a-size-base', 'dir':     
'auto'}).text

print(description)
print(price)
print(rating)
print(review_count)


0 commentaires

3 Réponses :


0
votes

Consultez le site Web. si les pages sont { https://www.footballindex.co.uk/players/1 , https://www.footballindex.co.uk/players/2 , https://www.footballindex.co.uk/players / 3 ...} Intégrez le scrape au code pour itérer sur toutes les pages

page = 0       
for i in range(1,n): #will iterate till n-1 page
    page = i
    result = requests.get('https://www.footballindex.co.uk/players'+str(page))

    src = result.content

    soup = BeautifulSoup(src,'lxml')

    players1 = soup.find("script").text

    players2 = players1.split('= ', 1)[1]

    players3 = json.loads(players2)


    df = pd.DataFrame(   
    [item['id'],item['country'],item['nationalTeam 
    ,item['sector'],item['nationality'],item['team']
    ,item['buyPrice'],item['sellPrice'],item['penceChange']
    ,item['changePercent']]for item in players3['playersReducer']['players']
    ) 

quelque chose comme ça


1 commentaires

J'ai essayé d'exécuter ce qui précède, mais cela ne fonctionne pas. Merci pour cela. Mais l'URL de la page n'est pas différente pour chaque page du tableau. C'est le même.



1
votes

Vous pouvez récupérer les données directement depuis l'API JSON (et ne pas utiliser BeautifulSoup), par exemple:

...
Processing page 32...
Processing page 33...
                       id      country  nationalTeam    nationality                team  price  scoreSell  penceChange
0            habib-diallo      Senegal         False        Senegal                Metz   1.19       0.71         0.09
1         sehrou-guirassy       France         False         France              Amiens   0.90       0.54         0.05
2     romain-del-castillo       France         False           None              Rennes   0.58       0.35         0.04
3          samuel-bastien      Belgium         False        Belgium      Standard Liège   0.57       0.34         0.04
4          jann-fiete-arp      Germany         False        Germany   FC Bayern München   1.43       0.86         0.03
...                   ...          ...           ...            ...                 ...    ...        ...          ...
3110      kieran-trippier      England         False        England  Atlético de Madrid   0.65       0.39        -0.01
3111        kevin-malcuit       France         False         France              Napoli   0.39       0.23        -0.01
3112       alen-halilovic      Croatia         False        Croatia       sc Heerenveen   0.36       0.22        -0.01
3113    bernardo-espinosa     Colombia         False       Colombia            Espanyol   0.18       0.11        -0.01
3114        johan-djourou  Switzerland         False  Côte d'Ivoire        Hamburger SV   0.12       0.07        -0.01

[3115 rows x 8 columns]

Impressions:

import requests
import pandas as pd

url = 'https://api-prod.footballindex.co.uk/football.allTradable24hrchanges?page={page}&per_page={per_page}&sort=asc'

page = 1
all_data = {}

while True:
    print('Processing page {}...'.format(page))

    data = requests.get(url.format(page=page, per_page=5000)).json()

    if data['count'] == 0:
        break

    # uncomment this to print all data:
    # from pprint import pprint
    # pprint(data)

    all_data.setdefault('id', []).extend(d['id'] for d in data['items'])
    all_data.setdefault('country', []).extend(d['country'] for d in data['items'])
    all_data.setdefault('nationalTeam', []).extend(d['nationalTeam'] for d in data['items'])
    all_data.setdefault('nationality', []).extend(d['nationality'] for d in data['items'])
    all_data.setdefault('team', []).extend(d['team'] for d in data['items'])
    all_data.setdefault('price', []).extend(d['price'] for d in data['items'])
    all_data.setdefault('scoreSell', []).extend(d['scoreSell'] for d in data['items'])
    all_data.setdefault('penceChange', []).extend(d['penceChange'] for d in data['items'])

    page += 1

df = pd.DataFrame(all_data)
print(df)

ÉDITER:

Capture d'écran de Firefox avec l'URL:

entrez la description de l'image ici


7 commentaires

Comment avez-vous trouvé cette URL complète? J'ai pris de la barre d'adresse, mais vous avez probablement tiré un formulaire ailleurs?


@Jmakey J'ai utilisé les outils de développement Firefox (l'onglet Réseau) pour voir où la page fait des requêtes. Il y a quelque chose de similaire dans Chrome aussi ...


demandes a les json.loads sous le capot. En termes simples: data = requests.get(url.format(page=page)).json()


De plus, plutôt que de faire 32 requêtes, augmentez simplement le nombre renvoyé et obtenez-le en 1 requête: url = 'https://api-prod.footballindex.co.uk/football.allTradable24‌​hrchanges?page={page‌​}&per_page=5000&sort‌​=asc'


@Andrej - je ne trouve pas ça nulle part. excuses. C'est nouveau pour moi. Où dans Firefox / Chrome obtenez-vous cette adresse?


@Jmakey J'ai ajouté une capture d'écran avec l'URL et retravaillé l'exemple en fonction des commentaires de chitown88.


Brillant. très appréciée ! Je donnerais des commentaires, mais je suis tout nouveau et le site ne le permettra pas. merci!



1
votes

La solution d'Andrej est correcte, mais vous pouvez légèrement modifier pour obtenir les données complètes en une fois, puis utiliser json_normalize. Juste une autre façon de le faire pour que vous puissiez voir.

import requests
import math
from pandas.io.json import json_normalize

url = 'https://api-prod.footballindex.co.uk/football.allTradable24hrchanges'
per_page = 5000
page = 1
payload = {
'page':'%s' %page,
'per_page':'%s' %per_page,
'sort':'asc'}

print ('Gathering page: %s' %page)
jsonData = requests.get(url, params=payload).json()
total_pages = math.ceil(jsonData['total'] / per_page)

df = json_normalize(jsonData['items'])
cols = ['id', 'country', 'nationalTeam','nationality','team', 'price', 'scoreSell', 'penceChange']
df = df[cols]

if total_pages > 1:
    for page in range(2,total_pages+1):
        print ('Gathering page: %s' %page)
        payload = {
                'page':'%s' %page,
                'per_page':'%s' %per_page,
                'sort':'asc'}

        jsonData = requests.get(url, params=payload).json()
        temp_df = json_normalize(jsonData['items'])
        df = df.append(temp_df[cols], sort=False).reset_index(drop=True)


0 commentaires