Извлеките данные из URL-адреса на веб-странице с помощью beautiful soup. Питон

#python #web-scraping #beautifulsoup

Вопрос:

Я пытаюсь удалить данные (идентификатор insta и количество подписчиков) с URL-адреса внутри веб-страницы: , https://starngage.com/app/global/influencer/ranking/india

Идентификатор элемента URL-адреса : @priyankachopra

Аналогично, я хочу удалить данные со всех ссылок в одной таблице

Может кто-нибудь сказать мне, как это сделать

 import requests
from bs4 import BeautifulSoup as bs

r = requests.get("https://starngage.com/app/global/influencer/ranking/india")
 

Ответ №1:

Вы можете найти данные непосредственно в HTML. Вы можете извлечь нужные вам данные, просто используя beautifulsoup

Вот код.

 from bs4 import BeautifulSoup
from prettytable import PrettyTable

tb = PrettyTable(['Name', 'Insta_ID', 'Followers'])
url = 'https://starngage.com/app/global/influencer/ranking/india'
resp = requests.get(url)

soup = BeautifulSoup(resp.text, 'html.parser')

table = soup.find('table', class_='table-responsive-sm')
td = table.findAll('tr')

for i in td[1:]:
    temp = i.select_one("td:nth-of-type(3)").text
    name, insta_id = temp.split('@')
    followers = i.select_one("td:nth-of-type(6)").text
    tb.add_row([name.strip(), insta_id.strip(), followers.strip()])

print(tb)

 
 Sample Output:

 ------------------------------- --------------------------- ----------- 
|              Name             |          Insta_ID         | Followers |
 ------------------------------- --------------------------- ----------- 
|     Priyanka Chopra Jonas     |       priyankachopra      |   57.9M   |
|      Jacqueline Fernandez     |       jacquelinef143      |   45.9M   |
|    URVASHI RAUTELA 🇮🇳Actor    |       urvashirautela      |   31.7M   |
|          Kapil Sharma         |        kapilsharma        |   28.7M   |
|        Sachin Tendulkar       |      sachintendulkar      |   27.1M   |
|          Amanda Cerny         |        amandacerny        |   25.5M   |
|             Mia K.            |         miakhalifa        |   21.9M   |
|         KARTIK AARYAN         |        kartikaaryan       |   19.7M   |
 

Комментарии:

1. есть ли способ, которым я мог бы открыть ссылку и очистить количество подписчиков оттуда. например: нажмите на @priyankachopra и соскребите данные с этой страницы, аналогично откройте первые 1000 профилей в этой таблице.

2. Да, ты можешь. Перейдите на эту страницу: (вы можете получить эту ссылку из таблицы) и удалите все необходимые данные. https://starngage.com/app/global/influencers/priyankachopra

Ответ №2:

Для визуализации таблицы используется некоторый JavaScript, поэтому requests не удается захватить html-код таблицы. Вместо этого используйте selenium для имитации веб-браузера, посещающего сайт, а затем передайте page_source на BeautifulSoup .

Затем я перебираю строки таблицы, сохраняя каждую insta_id из них follower_count в списке словарей, прежде чем преобразовать все в a pandas DataFrame .

 from bs4 import BeautifulSoup
from selenium import webdriver
import pandas as pd

url = "https://starngage.com/app/global/influencer/ranking/india"

options = webdriver.ChromeOptions()
options.headless = False # page didn't fully load HTML in headless = True

driver = webdriver.Chrome(options=options)
driver.implicitly_wait(2)
driver.get(url)
soup = BeautifulSoup(driver.page_source, "html.parser")
driver.close()

rows = soup.find('table').find_all('tr')

influencers = []
for row in rows[1:]: # skip header row
    cols = row.find_all('td')
    insta_id = '@'   cols[2].text.split('@')[1]
    follower_count = cols[5].text
    influencers.append({'insta_id': insta_id, 'follower_count': follower_count})

df = pd.DataFrame(influencers)

print(df)

                insta_id follower_count
    0    @priyankachopra          57.9M
    1    @jacquelinef143          45.9M
    2    @urvashirautela          31.7M
    3       @kapilsharma          28.7M
    4   @sachintendulkar          27.1M
    ..               ...            ...
    95       @tonykakkar             4M
    96     @reem_sameer8           3.9M
    97  @mominamustehsan           3.9M
    98           @bpraak           3.9M
    99        @djbravo47           3.9M
    
    [100 rows x 2 columns]
 

Комментарии:

1. Я не думаю, что для этого вам нужно использовать Селен. BeautifulSoup работает просто отлично.

2. @Озу Версия без селена, которую вы опубликовали, не работает. Я AttributeError: 'NoneType' object has no attribute 'findAll' слышу это с линии td = table.findAll('tr') . requests не находит html таблицы, так как я предполагаю, что какой-то Javascript все еще работает для заполнения таблицы.