Очистите все URL-адреса веб-страницы

#python #selenium #url #web-scraping #beautifulsoup

Вопрос:

У меня есть следующий URLадрес https://www.gbgb.org.uk/greyhound-profile/?greyhoundId=517801 где последние 6 цифр являются уникальным идентификатором для конкретного бегуна. Я хочу найти все 6-значные уникальные идентификаторы на этой странице.

Я попытался очистить все URL-адреса на странице (код показан ниже), но, к сожалению, я получаю только резюме высокого уровня. Вместо подробного списка, который должен содержать >5000 бегунов. Я надеюсь получить список/фрейм данных, который показывает:

  1. https://www.gbgb.org.uk/greyhound-profile/?greyhoundId=517801
  2. https://www.gbgb.org.uk/greyhound-profile/?greyhoundId=500000
  3. 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()
 

Это сгенерировало бы фрейм данных, выглядящий следующим образом:

введите описание изображения здесь