2017-02-09 5 views
2

Я использую BeautifulSoup для извлечения изображений, которые хорошо работают для обычных страниц. Теперь я хочу, чтобы извлечь картину Chromebook с веб-страницы, как этотЗагрузка изображений с BeautifulSoup

https://twitter.com/banprada/statuses/829102430017187841

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

import urllib.request 
import os 
from bs4 import BeautifulSoup 

URL = "http://twitter.com/banprada/statuses/829102430017187841" 
list_dir="D:\\" 
default_dir = os.path.join(list_dir,"Pictures_neu") 
opener = urllib.request.build_opener() 
urllib.request.install_opener(opener) 
soup = BeautifulSoup(urllib.request.urlopen(URL).read()) 
imgs = soup.findAll("img",{"alt":True, "src":True}) 
for img in imgs: 
    img_url = img["src"] 
    filename = os.path.join(default_dir, img_url.split("/")[-1]) 
    img_data = opener.open(img_url) 
    f = open(filename,"wb") 
    f.write(img_data.read()) 
    f.close() 

Есть ли возможность загрузить изображение как-нибудь?

Большое спасибо и привет, Andi

+0

страница имеет JS, которая не отображается, когда вы извлечения веб-страницы с URLLIB –

+0

пытаются использовать JS рендерер LIB как dryscrape упоминается в [здесь] (HTTP: // stackoverflow.com/questions/8049520/web-scraping-javascript-page-with-python) –

+0

Требуемое изображение находится внутри 'iframe', которого нет в исходном источнике страницы. Допустимо ли вам получить решение в 'Python' +' selenium'? – Andersson

ответ

1

Это, как вы можете получить упоминается только изображение с помощью Selenium + requests

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait as wait 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 
import requests 

link = 'https://twitter.com/banprada/statuses/829102430017187841' 
driver = webdriver.PhantomJS() 
driver.get(link) 
wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe[starts-with(@id, 'xdm_default')]"))) 
image_src = driver.find_element_by_tag_name('img').get_attribute('src') 
response = requests.get(image_src).content 
with open('C:\\Users\\You\\Desktop\\Image.jpeg', 'wb') as f: 
    f.write(response) 

Если вы хотите, чтобы получить все изображения из все iframes на странице (исключая изображения на исходном источнике страницы, которые вы можете получить с кодом):

from selenium import webdriver 
from selenium.common.exceptions import WebDriverException 
import requests 
import time 

link = 'https://twitter.com/banprada/statuses/829102430017187841' 
driver = webdriver.Chrome() 
driver.get(link) 
time.sleep(5) # To wait until all iframes completely rendered. Might be increased 
iframe_counter = 0 
while True: 
    try: 
     driver.switch_to_frame(iframe_counter) 
     pictures = driver.find_elements_by_xpath('//img[@src and @alt]') 
     if len(pictures) > 0: 
      for pic in pictures: 
       response = requests.get(pic.get_attribute('src')).content 
       with open('C:\\Users\\You\\Desktop\\Images\\%s.jpeg' % (str(iframe_counter) + str(pictures.index(pic))), 'wb') as f: 
        f.write(response) 
     driver.switch_to_default_content() 
     iframe_counter += 1 
    except WebDriverException: 
     break 

Обратите внимание, что вы можете использовать any webdriver

+0

Отлично! Большое спасибо за ответ! ;) –