Python получает href под тегом div

#python #selenium #selenium-webdriver #selenium-chromedriver #screen-scraping

#python #selenium #selenium-webdriver #selenium-chromedriver #очистка экрана

Вопрос:

Я создаю инструмент с использованием Python, который загружает все фотографии и видео, размещенные пользователем в Instagram. Все, что я хотел сделать сейчас, это извлечь ссылку на все сообщения, чтобы я мог запускать их в цикле и загружать все сообщения.

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

Это href, который я хочу извлечь. Я перепробовал все решения по переполнению стека, но ничего не получилось. Вот почему я задаю этот вопрос. Вот мой код для ссылки на ur:

 import urllib.request as reqq
from selenium import webdriver

url = input("Enter the link:")

browser = webdriver.Chrome("D:\Python_Files\Programs\chromedriver.exe")

browser.get(url)

#URLs of all posts are extracted. This is whr I need help

for x in range(len(extracted_urls)):
    img_url = ""
    vid_url = ""
    
    try:
        
        vid_url = browser.find_element_by_class_name('_5wCQW').find_element_by_tag_name('video').get_attribute('src')
        reqq.urlretrieve(vid_url,f"D:\instavid{x}.mp4")    
        
    except: 
        
        img_url = browser.find_element_by_class_name('KL4Bh').find_element_by_tag_name('img').get_attribute('src')
        reqq.urlretrieve(img_url,f"D:\instaimg{x}.jpg")
    
browser.close()
  

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

1. Можете ли вы поделиться URL-адресом?

2. @AndrejKesely URL-адрес?

3. URL страницы, которую вы хотите удалить.

4. Вот и все: instagram.com/cristiano

Ответ №1:

Вы используете имя класса для идентификации элементов, но оно генерируется программно и не будет работать. Чтобы очистить его, вы можете использовать css-селектор, подобный приведенному ниже

  list = driver.find_elements_by_css_selector('article > div a')
 for element in list:
    print(element.get_attribute('href')) #this will give you all the urls
  

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

1. Спасибо, чувак! Это действительно помогло! Не могли бы вы объяснить, как list = driver.find_elements_by_css_selector('article > div a') это работает? И я могу получить только 12 самых последних сообщений пользователя. Есть ли какой-нибудь способ получить все сообщения?

2. это селектор css, который сначала получает элемент article, «>» означает прямого дочернего элемента «article» и «div a» — это содержащий элемент div (сообщает браузеру так: «дайте мне div, в котором есть элемент «a»). Чтобы получить больше элементов — вам нужно прокрутить страницу. Первые 12 — это те, которые загружены

3. вот как вы можете автоматически прокручивать — dev.to/mr_h/python-selenium-infinite-scrolling-3o12

4. Хорошо, Алин. Если вы считаете, что мой вопрос хорош и был хорошо сформулирован, тогда, пожалуйста, рассмотрите мой вопрос. Спасибо!

Ответ №2:

Попробуйте использовать Beautifulsoup. Вы можете легко анализировать html и xml.

 from bs4 import BeautifulSoup

data = '<div><div><a href="/p/CFShhjj"></a></div></div>'
soup = BeautifulSoup(data, 'html.parser')
for tag in soup.find_all():
if tag.name=='a':
    print(tag['href'])


OUT : /p/CFShhjj
  

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

1. Спасибо! Можете ли вы, пожалуйста, объяснить, как вы получили значение для data ?

2. Я взял фиктивные данные.. вы можете передавать свои HTML-данные

Ответ №3:

Данные, которые вы видите на странице, генерируются программно и хранятся внутри JSON на странице. Используйте этот пример для извлечения мультимедийных данных:

 import re
import json
import requests


url = 'https://www.instagram.com/cristiano/'
html_doc = requests.get(url).text
data = json.loads(re.search(r'window._sharedData = ({.*?});', html_doc).group(1))

def find_media(data):
    if isinstance(data, dict):
        for k, v in data.items():
            if k == '__typename' and v in ('GraphImage', 'GraphVideo'): 
                yield data
            else:
                yield from find_media(v)
    elif isinstance(data, list):
        for v in data:
            yield from find_media(v)

for media in find_media(data):
    print('http://instagram.com/p/{}/'.format(media['shortcode']))
    if media['__typename'] == 'GraphImage':
        print(media['display_url']) 
    else:
        print(media['video_url']) 
  

С принтами:

 ...

http://instagram.com/p/CE2D7zcAFrq/
https://instagram.fbts6-1.fna.fbcdn.net/v/t51.2885-15/e35/s1080x1080/118883515_338753734147784_3257042213665207515_n.jpg?_nc_ht=instagram.fbts6-1.fna.fbcdn.netamp;_nc_cat=108amp;_nc_ohc=Duxo0dZ3q8oAX8ps1u6amp;_nc_tp=15amp;oh=e52995d9569e7dde5c348a5eb1c4a886amp;oe=5F8F1B14
http://instagram.com/p/CE2D7zbAMrJ/
https://instagram.fbts6-1.fna.fbcdn.net/v/t51.2885-15/e35/s1080x1080/119056544_318190815934349_3868576271600213484_n.jpg?_nc_ht=instagram.fbts6-1.fna.fbcdn.netamp;_nc_cat=105amp;_nc_ohc=Sfy0ykNdpxsAX9kOZqyamp;_nc_tp=15amp;oh=b48009b98e0a4b6483f79902d3253d12amp;oe=5F8F11FB
http://instagram.com/p/CEy7I6yAm9i/
https://instagram.fbts6-1.fna.fbcdn.net/v/t51.2885-15/e35/s1080x1080/118877779_2707314466207997_7737960511758007253_n.jpg?_nc_ht=instagram.fbts6-1.fna.fbcdn.netamp;_nc_cat=1amp;_nc_ohc=prF2yBSpK34AX8TSiuXamp;_nc_tp=15amp;oh=bdfc5b9d1914bdd3470209a64a5e155bamp;oe=5F8DEBFF
http://instagram.com/p/CEy7I6yg2Op/
https://instagram.fbts6-1.fna.fbcdn.net/v/t51.2885-15/e35/s1080x1080/118784068_748127092633181_2341530667249985288_n.jpg?_nc_ht=instagram.fbts6-1.fna.fbcdn.netamp;_nc_cat=105amp;_nc_ohc=_ynvOYOBxY4AX_B22yFamp;_nc_tp=15amp;oh=e5e9d716421cd3ea0edb71adeebe8ebeamp;oe=5F8F3798
http://instagram.com/p/CEy7I6zA6nU/
https://instagram.fbts6-1.fna.fbcdn.net/v/t51.2885-15/e35/s1080x1080/118555638_778542006213962_8711737455993781057_n.jpg?_nc_ht=instagram.fbts6-1.fna.fbcdn.netamp;_nc_cat=102amp;_nc_ohc=MVPAjHvN3QkAX9uawMnamp;_nc_tp=15amp;oh=cefd5a6162af11327ab9d1d4bf94df7aamp;oe=5F8FCF5B
http://instagram.com/p/CEy7I63Aq9f/
https://instagram.fbts6-1.fna.fbcdn.net/v/t51.2885-15/e35/s1080x1080/118782135_760435874772485_2807641115290436245_n.jpg?_nc_ht=instagram.fbts6-1.fna.fbcdn.netamp;_nc_cat=105amp;_nc_ohc=SUZnVsn1EU4AX8MUj30amp;_nc_tp=15amp;oh=7937a7c235a54b271a869596c837fae6amp;oe=5F907287
http://instagram.com/p/CEy7I64AvaZ/
https://instagram.fbts6-1.fna.fbcdn.net/v/t51.2885-15/e35/s1080x1080/118651624_163760538669975_655651222517528584_n.jpg?_nc_ht=instagram.fbts6-1.fna.fbcdn.netamp;_nc_cat=103amp;_nc_ohc=8mj5Ysn75pMAX9dpSDAamp;_nc_tp=15amp;oh=6c33025592ee8f4569ad5d016e69785bamp;oe=5F8FF67B
  

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

1. Привет! Спасибо, чувак! Но поскольку он слишком длинный, я придерживаюсь ответа Алина Стелиана. Но я действительно ценю ваши усилия. Спасибо!

2. Если вы считаете, что мой вопрос хорош и был хорошо сформулирован, тогда, пожалуйста, рассмотрите мой вопрос. Спасибо!