#python #selenium #url #web-scraping #beautifulsoup
Вопрос:
У меня есть следующий URL—адрес https://www.gbgb.org.uk/greyhound-profile/?greyhoundId=517801 где последние 6 цифр являются уникальным идентификатором для конкретного бегуна. Я хочу найти все 6-значные уникальные идентификаторы на этой странице.
Я попытался очистить все URL-адреса на странице (код показан ниже), но, к сожалению, я получаю только резюме высокого уровня. Вместо подробного списка, который должен содержать >5000 бегунов. Я надеюсь получить список/фрейм данных, который показывает:
- https://www.gbgb.org.uk/greyhound-profile/?greyhoundId=517801
- https://www.gbgb.org.uk/greyhound-profile/?greyhoundId=500000
- https://www.gbgb.org.uk/greyhound-profile/?greyhoundId=500005
и т.д.
Это то, что мне удавалось делать до сих пор. Я ценю любую помощь!
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
import re
req = Request("https://www.gbgb.org.uk//greyhound-profile//")
html_page = urlopen(req)
soup = BeautifulSoup(html_page, "lxml")
links = []
for link in soup.findAll('a'):
links.append(link.get('href'))
print(links)
Заранее спасибо за помощь!
Комментарии:
1. Веб-страница (
https://www.gbgb.org.uk//greyhound-profile//
), к которой вы обращаетесь, не имеет URL-адреса с...?greyhoundId=xxxxxx
2. Это странно, потому что gbgb.org.uk/greyhound-profile/?greyhoundId=517801 это определенно страница. Кроме того, когда я использую свой код, он возвращает мне все URL-адреса высокого уровня, т. е. ‘ gbgb.org.uk/about » и » gbgb.org.uk/welfare-care «. Есть идеи, что мне нужно сделать, чтобы углубиться в конкретные gbgb.org.uk/greyhound-profile/?greyhoundId=xxxxxx
3. что такое «резюме высокого уровня»? Вы на 100% уверены, что получите правильно отрисованную веб-страницу с
requests
помощью ?4. это фрагмент мои результаты в виде списка. ‘ gbgb.орг.УК ‘, ‘ gbgb.орг.Великобритания/о ‘, ‘ gbgb.орг.Великобритания/благополучия-забота ‘, ‘ gbgb.орг.Великобритания/гонки ‘, ‘ gbgb.орг.Великобритания/правила-правила ‘, ‘#поиск’, ‘ gbgb.орг.Великобритания/мой-питомник ‘, ‘ gbgb.орг.УК/о/о-нас . Мне нужно получить все gbgb.org.uk/greyhound-profile/?greyhoundId=xxxxxx Где «xxxxxx» — уникальный идентификатор 6 целых чисел. Спасибо
5. Почему бы вам не попробовать все 6-значные целые числа в цикле for?
Ответ №1:
Данные загружаются динамически из внешнего URL-адреса API. Вы можете использовать следующий пример загрузки данных (с идентификаторами):
import json
import requests
api_url = "https://api.gbgb.org.uk/api/results/dog/517801" # <-- 517801 is the ID from your URL in the question
params = {"page": "1", "itemsPerPage": "20", "race_type": "race"}
page = 1
while True:
params["page"] = page
data = requests.get(api_url, params=params).json()
# uncomment this to print all data:
# print(json.dumps(data, indent=4))
if not data["items"]:
break
for i in data["items"]:
print(
"{:<30} {}".format(
i.get("winnerOr2ndName", ""), i.get("winnerOr2ndId", "")
)
)
page = 1
С принтами:
Ferndale Boom 534358
Laganore Mustang 543937
Tickity Kara 535237
Thor 511842
Ballyboughlewiss 519556
Beef Cakes 551323
Distant Millie 546674
Lissan Kels 525148
Rosstemple Marko 534276
Happy Harry 550042
Porthall Ella 550841
Southlodge Eden 531677
Effernogue Beef 547416
Faydas Truffle 528780
Johns Lass 538763
Faydas Truffle 528780
Toms Hero 543659
Affane Buzz 547555
Emkay Flyer 531456
Ballymac Tilly 492923
Kilcrea Duke 542178
Sporting Sultan 541880
Droopys Poet 542020
Shortwood Elle 527241
Rosstemple Marko 534276
Erics Bozo 541863
Swift Launch 536667
Longsearch 523017
Swift Launch 536667
Takemyhand 535023
Floral Print 527192
Rustys Aero 497270
Autumn Dapper 519528
Droopys Kiwi 511989
Deep Chest 520634
Newtack Henry 525511
Indian Nightmare 524636
Lady Mascara 528399
Tarsna Yankee 517373
Leathems Act 516918
Final Star 514015
Ascot Faye 500812
Ballymac Ernie 503569
Ответ №2:
вы можете преобразовать содержимое результата в фрейм данных pandas, а затем просто использовать столбцы winnerOr2ndName и winnerOr2ndId
Пример
import json
import requests
import pandas as pd
def get_items(dog_id):
url = f"https://api.gbgb.org.uk/api/results/dog/{dog_id}?page=-1"
params = {"page": "-1", "itemsPerPage": "20", "race_type": "race"}
response = requests.get(url, params=params).json()
MAX_PAGES = response["meta"]["pageCount"]
result = pd.DataFrame(pd.DataFrame(response["items"]).loc[:, ['winnerOr2ndName','winnerOr2ndId']].dropna())
result["winnerOr2ndId"] = result["winnerOr2ndId"].astype(int)
while int(params.get("page"))<MAX_PAGES:
params["page"] = str(int(params.get("page")) 1)
response = requests.get(url, params=params).json()
new_items = pd.DataFrame(pd.DataFrame(response["items"]).loc[:, ['winnerOr2ndName','winnerOr2ndId']].dropna())
new_items["winnerOr2ndId"] = new_items["winnerOr2ndId"].astype(int)
result = pd.concat([result, new_items])
return result.drop_duplicates()
Это сгенерировало бы фрейм данных, выглядящий следующим образом: