#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 все еще работает для заполнения таблицы.