BeautifulSoup Find dentro de una página html de instagram


Tengo un problema para encontrar algo con bs4.

Estoy tratando de encontrar automáticamente algunas urls en una página de instagram html y (sabiendo que soy un python noob) no puedo encontrar la forma de buscar automáticamente dentro del código fuente html las urls que están en el ejemplo después de "display_url": http..." .

Quiero hacer que mi búsqueda de secuencias de comandos multiplique la url que aparece a continuación como “display_url” y descargarlas. Deben extraerse tantas veces como aparezcan en el código fuente.


Con bs4 probé el:

 f = urllib.request.urlopen(fileURL) htmlSource = f.read() soup = bs(htmlSource, 'html.parser') metaTag = soup.find_all('meta', {'property': 'og:image'}) imgURL = metaTag[0]['content'] urllib.request.urlretrieve(imgURL, 'fileName.jpg') 

Pero no puedo hacer el soup.find_all(... trabajar / buscarlo. ¿Hay alguna manera de que encuentre esta parte de la página con bs4?

Muchas gracias por tu ayuda.

Aquí hay un ejemplo de mi pequeño código (python) como lo es ahora: https://repl.it/@ClementJpn287/bs

    <path d="  " />   window._sharedData = { "config": { "csrf_token": "", "viewer": {  "viewerId": "" }, "supports_es6": true, "country_code": "FR", "language_code": "fr", "locale": "fr_FR", "entry_data": { "PostPage": [{ "graphql": { "shortcode_media": { "__typename": "GraphSidecar",  "dimensions": { "height": 1080, "width": 1080 }, "gating_info": null, "media_preview": null,  "display_url": "https://scontent-cdt1-1.cdninstagram.com/vp/", "display_resources": [{ "src": "https://scontent-cdt1-1.cdninstagram.com/vp/", "config_width": 640, "config_height": 640 }, { "src": "https://scontent-cdt1-1.cdninstagram.com/vp/", "config_width": 750, "config_height": 750 }, { "src": "https://scontent-cdt1-1.cdninstagram.com/vp/", "config_width": 1080, "config_height": 1080 }], "is_video": false,  

mi código más nuevo

Puede encontrar la etiqueta de secuencia de comandos adecuada y regex la información. He asumido que la primera etiqueta de script que contiene window._sharedData = es la apropiada. Puede jugar como sea necesario.

 from bs4 import BeautifulSoup as bs import re html = '''           ''' soup = bs(html, 'lxml') scripts = soup.select('script[type="text/javascript"]') for script in scripts: if ' window._sharedData =' in script.text: data = script.text break r = re.compile(r'"display_url":(.*)",') print(r.findall(data)) 

Gracias a @thadam puede ser posible acortar lo anterior para:

 soup = bs(html, 'lxml') r = re.compile(r'"display_url":(.*)",') data = soup.find('script', text=r).text print(r.findall(data)) 

El progtwig avanzó y se convirtió en algo así:

 thepage = urllib.request.urlopen(html) soup = BeautifulSoup(thepage, "html.parser") print(soup.title.text) txt = soup.select('script[type="text/javascript"]')[3] texte = txt.get_text() f1 = open("tet.txt", 'w') f1.write(texte) f1.close() with open('tet.txt','r') as f: data=''.join(f.readlines()) print(data[data.index('"display_url":"'):data.index('","display_resources":')+1]) 

Pero ahora algo nuevo apareció:

  • ¿Cómo hacer que la parte url de búsqueda del progtwig (líneas 10, 11) se repita mientras aparece (‘ “display_url”: ” to -> “, “display_resources”: ‘) en el archivo tet.txt ?
  • ¿Se puede usar el bucle while, pero cómo hacer que repita el proceso?

Problema resuelto

Aquí está el código para descargar múltiples imágenes de una URL de instagram con Pythonista 3 en iOS:

  from sys import argv import urllib import urllib.request from bs4 import BeautifulSoup import re import photos import clipboard thepage = "your url" #p.1 thepage = urllib.request.urlopen(html) soup = BeautifulSoup(thepage, "html.parser") print(soup.title.text) txt = soup.select('script[type="text/javascript"]')[3] texte = txt.get_text() fille = open("tet.txt", 'w') fille.write(texte) fille.close() #p.2 g = open('tet.txt','r') data=''.join(g.readlines()) le1 = 0 le2 = 0 hturl = open('url.html', 'w') still_looking = True while still_looking: still_looking = False dat = data.find('play_url', le1) det = data.find('play_resources', le2) if dat >= le1: #urls.append(dat) le1 = dat + 1 still_looking = True if det >= le2: hturl.write(data[dat:det]) le2 = det + 1 still_looking = True hturl.close() #p.3 hturl2 = open('url.html', 'r') dete = ''.join(hturl2.readlines()) le11 = 0 le22 = 0 urls = [] still_looking2 = True while still_looking2: still_looking2 = False dat2 = dete.find('https://scontent-', le11) det2 = dete.find('","dis', le22) if dat2 >= le11: urls.append(dat2) le11 = dat2 + 1 still_looking2 = True if det2 >= le22: urls.append(dete[dat2:det2]) le22 = det2 + 1 still_looking2 = True hturl2.close() #p.4 imgs = len(urls) nbind = imgs nbindr = 3 images = 1 while nbindr < imgs: urllib.request.urlretrieve(urls[nbindr], 'photo.jpg') photos.create_image_asset('photo.jpg') print ('Image ' + str(images) + ' downloaded') nbindr = nbindr +2 images += 1 print("OK") 

Es un poco fastidioso, pero funciona y rápidamente también. Gracias por tu ayuda.