Python + Selenium firefox webdriver - 从网站中提取图像
Posted
技术标签:
【中文标题】Python + Selenium firefox webdriver - 从网站中提取图像【英文标题】:Python + Selenium firefox webdriver - pulling out images out of a website 【发布时间】:2018-03-02 23:59:53 【问题描述】:我正在尝试使用以下方法从网页中提取图像: Python 2.7 + Selenium(使用 FireFox)+ Beautiful Soup。
页面动态加载,因此,我使用 Selenium 进行屏幕抓取。前端的一切看起来都很棒,但是,当我加载所有图像并查看 html 时,我看不到图像的链接。有什么想法可以在这里发生吗?
网站是https://flipp.com/flyers?postal_code=97035, 然后从那里导航到https://flipp.com/weekly_ad/1550082-big-5-sporting-goods-weekly-ad 以查看第一个每周广告(我的工作代码如下)。
为了让事情变得更奇怪,我可以看到图像正在检查器窗口中加载......但我仍然无法在 HTML 中看到它们。关于这里发生了什么的任何想法,以及如何获取更新的 HTML(图像加载后?)
这是我能够从 HTML 中提取的一组图像(通过附加 jpg)。这些仅用于将鼠标悬停在画布上时的弹出窗口。
我想要得到的实际上是构成实际页面/画布的图像。我可以看到它们通过(使用 Firefox 中的流量选项),但由于某种原因它们没有出现在 HTML 中。知道这里发生了什么吗?
工作代码:
#import packages
from time import gmtime, strftime,sleep, time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
#scraping packages
from bs4 import BeautifulSoup
USAPROXY = "177.84.23.122:3128"
def launch_webdriver(PROXY):
PROXY = PROXY
PROXY_HOST = PROXY.rpartition(':')[0]
PROXY_PORT = PROXY.rpartition(':')[2]
fp = webdriver.FirefoxProfile()
# Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5
fp.set_preference("network.proxy.type", 1)
fp.set_preference("network.proxy.http",PROXY_HOST)
fp.set_preference("network.proxy.http_port",int(PROXY_PORT))
fp.set_preference("network.proxy.ssl",PROXY_HOST)
fp.set_preference("network.proxy.ssl_port",int(PROXY_PORT))
fp.set_preference("general.useragent.override","whater_useragent")
fp.update_preferences()
return webdriver.Firefox(firefox_profile=fp)
def test():
driver = launch_webdriver(USAPROXY)
driver.set_page_load_timeout(11)
driver.get("https://flipp.com/flyers?postal_code=97035")
sleep(15)
driver.get("https://flipp.com/weekly_ad/1550082-big-5-sporting-goods-weekly-ad")
sleep(5)
my_html = driver.page_source
soup = BeautifulSoup(my_html,'lxml')
tags=soup.findAll('img') #prints only 3 imgs, there should be 100s
for tag in tags:print tag
print soup.prettify()
#execute script
test()
【问题讨论】:
图片很可能是通过 CSS 分配的。选择元素后,检查Computed
选项卡中的background-image
。如果是这种情况,请使用element.value_of_css_property('background-image')
获取源代码。
【参考方案1】:
您在my_html=driver.page_source
中看不到更新后的HTML 的原因是page_source
在您的页面动态之前抓取了HTML 已加载。在页面加载后尝试这个来获取 HTML:
my_html = driver.execute_script("return document.getElementsByTagName('html')[0].innerHTML")
# or
my_html = driver.find_element_by_tag_name('html').get_attribute('innerHTML')
编辑:
好的,我想我想出了你要找的东西。我找到了一种访问network
资源并获取浏览器正在记录的性能 数据的方法。一旦加载了您想要的页面,调用此函数并传递驱动程序,它应该以您正在寻找的格式返回图像:
def getNetworkImages(driver):
ImageList = []
Resources = driver.execute_script("return window.performance.getEntriesByType('resource');")
for resource in Resources:
if resource['initiatorType'] == 'img': ImageList.append(resource['name'])
for image in ImageList: print(image)
return ImageList
注意:这是用 Chrome 64
和 Chromedriver 2.35
测试的。
【讨论】:
嗨,没有骰子。我在那里睡觉等待HTML加载,并尝试了你的方法。结果相同。图片应该以以下格式加载:f.wishabi.net/flyers/319cafbc-e857-44fd-bd01-3a3864506e54/…,但 HTML 没有显示任何此类内容。 有趣,当我使用上述方法时,我可以看到所有图像,它们在 href="" 下并且没有 base_url。 啊!是的。这些是与实际背景图像不同的图像(那些是弹出图像)。我想要获取的是构成页面的网站的背景图片 嗯,我想我很困惑。您可以发布对您感兴趣的图像进行检查的 HTML 吗? 感谢您的帮助。我添加了两个屏幕截图。一个是您可能看到的(当您将鼠标悬停在页面上时弹出的图像),第二个是我想要获取的图像,但没有显示在 html 中。但是我在我的电脑上看到了它们,所以显然应该有一种方法可以提取它们?【参考方案2】:我对您的代码做了一些小改动,将soup = BeautifulSoup(my_html,'lxml')
替换为soup = BeautifulSoup(my_html,'html.parser')
,如下所示:
代码:
driver.set_page_load_timeout(11)
driver.get("https://flipp.com/flyers?postal_code=97035")
sleep(15)
driver.get("https://flipp.com/weekly_ad/1550082-big-5-sporting-goods-weekly-ad")
sleep(5)
my_html = driver.page_source
soup = BeautifulSoup(my_html,'html.parser')
tags=soup.findAll('img')
for tag in tags:print (tag)
输出:
<img src="/94815ec0/images/page-favourites.svg"/>
<img src="/94815ec0/images/page-flyers.svg"/>
<img src="/94815ec0/images/page-coupons.svg"/>
<img src="/94815ec0/images/profile.png"/>
<img src="/94815ec0/images/signin-google-en.png"/>
<img src="/94815ec0/images/signin-facebook-en.png"/>
<img class="sl-icon" src="/94815ec0/images/sl/list-icon.svg"/>
<img class="logo" contain="true" fit="" href="https://images.wishabi.net/merchants/2143/1399408035/large" is="flipp-lazy-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" style='background-image: url("https://images.wishabi.net/merchants/2143/1399408035/large");'/>
<img src="/94815ec0/images/location.svg"/>
<img class="flyer-thumbnail" cover="true" fit="" href="https://f.wishabi.net/flyers/1568365/web_premium/1519664612.jpg" is="flipp-lazy-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" style='background-image: url("https://f.wishabi.net/flyers/1568365/web_premium/1519664612.jpg");'/>
<img class="logo" contain="true" fit="" href="https://images.wishabi.net/merchants/1417562816/1417562816/large" is="flipp-lazy-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" style='background-image: url("https://images.wishabi.net/merchants/1417562816/1417562816/large");'/>
<img class="flyer-thumbnail" cover="true" fit="" href="https://f.wishabi.net/flyers/1570217/web_premium/1519767026.jpg" is="flipp-lazy-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" style='background-image: url("https://f.wishabi.net/flyers/1570217/web_premium/1519767026.jpg");'/>
<img class="logo" contain="true" fit="" href="https://images.wishabi.net/merchants/2217/1399408048/large" is="flipp-lazy-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" style='background-image: url("https://images.wishabi.net/merchants/2217/1399408048/large");'/>
<img class="flyer-thumbnail" cover="true" fit="" href="https://f.wishabi.net/flyers/1548763/web_premium/1519408077.jpg" is="flipp-lazy-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" style='background-image: url("https://f.wishabi.net/flyers/1548763/web_premium/1519408077.jpg");'/>
<img class="logo" contain="true" fit="" href="https://images.wishabi.net/merchants/2392/1412008375/large" is="flipp-lazy-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" style='background-image: url("https://images.wishabi.net/merchants/2392/1412008375/large");'/>
<img class="flyer-thumbnail" cover="true" fit="" href="https://f.wishabi.net/flyers/1558209/web_premium/1519940192.jpg" is="flipp-lazy-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" style='background-image: url("https://f.wishabi.net/flyers/1558209/web_premium/1519940192.jpg");'/>
<img class="logo" contain="true" fit="" href="https://images.wishabi.net/merchants/2175/1399558010/large" is="flipp-lazy-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" style='background-image: url("https://images.wishabi.net/merchants/2175/1399558010/large");'/>
<img class="flyer-thumbnail" cover="true" fit="" href="https://f.wishabi.net/flyers/1553653/web_premium/1519086192.jpg" is="flipp-lazy-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" style='background-image: url("https://f.wishabi.net/flyers/1553653/web_premium/1519086192.jpg");'/>
<img class="logo" contain="true" fit="" href="https://images.wishabi.net/merchants/1415661435/1415661435/large" is="flipp-lazy-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" style='background-image: url("https://images.wishabi.net/merchants/1415661435/1415661435/large");'/>
<img src="/94815ec0/images/email_notices.png"/>
<img />
<img class="sad-cream"/>
<img class="browser-img chrome"/>
<img class="browser-img ff"/>
<img class="browser-img edge"/>
<img class="browser-img safari"/>
<img id="batBeacon0.08041384361820791" src="https://bat.bing.com/action/0?ti=5463843&Ver=2&mid=e698c347-3982-6279-c6a5-5e5b764b55dd&evt=pageLoad&sid=ab7428c0-1&lt=1647&pi=0&lg=en-US&sw=1366&sh=768&sc=24&tl=Big%205%20Sporting%20Goods%20Weekly%20Ad%20for%20Lake%20Oswego%20this%20week%20(Feb%2025,%202018%20-%20Mar%203,%202018)%20-%20Flipp&kw=flyers,%20coupons,%20shopping%20list,%20deals,%20circulaires,%20coupons,%20liste%20d%E2%80%99achats,%20offres&p=https%3A%2F%2Fflipp.com%2Fweekly_ad%2F1550082-big-5-sporting-goods-weekly-ad&r=&msclkid=N&rn=558478" style="width:0px; height:0px; display:none; visibility:hidden;" />
【讨论】:
嗨!感谢您的尝试 - 我也可以看到这些图像。如果您查看我的第二个屏幕截图 - 有一组图像格式如下 - f.wishabi.net/flyers/319cafbc-e857-44fd-bd01-3a3864506e54/… 注意,其中有几百个,唯一变化的是 3_1_3.jpg 部分(数字变了)。我可以通过firefox中的网络检查器看到那些通过,但是,由于某种原因它们没有出现在html中?对这里发生的事情有什么想法吗?以上是关于Python + Selenium firefox webdriver - 从网站中提取图像的主要内容,如果未能解决你的问题,请参考以下文章
python+selenium自动化环境搭建之后,能打开firefox,却不能执行自动化操作
selenium3+Python+firefox53 兼容问题
python+selenium启动firefox和chrome
Firefox配置文件加载(Selenium+Python)