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)
3 Réponses :
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
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.
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:
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.allTradable24hrchanges?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!
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)