我有一個selenium應用程式,它做了一些作業,然后將圖片截圖保存為png:
img = driver.find_element_by_xpath('//div[@id="qrcode"]/img')
with open('image.png', 'wb') as f:
f.write(img.screenshot_as_png)
然后它就會被發到我的手機上。
這一切都在進行中。
在我引入headless之前,這一切都運行得很好:
在我引入headless之前,這一切都運行得很好。
chrome_options = Options()
chrome_options.add_argument('-headless')
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe"/span>, options=chrome_options)
現在,由于某些原因,它只保存了影像的上半部分。我去掉了無頭引數,它可以完美地作業。有什么建議嗎?
uj5u.com熱心網友回復:
不是截圖導致的錯誤。headless瀏覽器的解析度只是簡單地與普通瀏覽器不同而已。
你可以通過這個命令手動調整你的 Selenium 驅動程式的視窗大小。試著改變size,看看你是否能得到全解析度的影像。
chrome_options.add_argument("window-size=1400,600"/span>)
你也可以試試:
chrome_options.add_argument("-start-maximized"/span>)
uj5u.com熱心網友回復:
雖然@Hammad的解決方案似乎是一個合理的解決方案,但即使這不起作用,并且你對請求模塊感興趣,那么你可以嘗試下面的代碼來拍攝螢屏。
span class="hljs-keyword">import requests
path = 'target.jpg'/span>
response = requests.get("Image SRC/URL here", stream=True)
if response.status_code == 200:
with open(path, 'wb') as file:
for pic in response:
file.write(pic)
在這里也可以用URL來代替,你可以傳遞
img = driver.find_element_by_xpath('//div[@id="qrcode"]/img').get_attribute('src')
uj5u.com熱心網友回復:
有些網站有反刮擦機制,涉及到檢測瀏覽器的webdriver屬性。當您為Chrome瀏覽器啟用headless模式時,該屬性不會被瀏覽器設定。因此,向網站表明,請求的來源是通過一個機器人或程式。
您可以嘗試執行能夠在無頭模式下為您的瀏覽器設定webdriver屬性的JavaScript。
但是,也請注意,這只是網站用于檢測機器人或程式的眾多機制之一。
您也可以查看這個答案
。下面是我使用pyppeteer庫撰寫的示例代碼。
import asyncio
從pyppeteer中匯入 launch
# from pyvirtualdisplay import Display
from argparse import ArgumentParser
class HTMLRetriever(object):
_page_source = None
_title = None
def __init__(self, url):
self.url = url
async def load(self):
# with Display(backend='xvfb') as disp:
await self._init_browser()
await self._init_webpage()
await self._connect_website()
await self._take_snapshot()
@classmethod
async def _init_display(cls):
cls.disp = Display(backend='xvfb')
解釋的方法
async def _init_browser(cls):
cls.browser = await launch(headless=True, args=[
"--no-sandbox",
"--單行程",
"--disable-dev-shm-usage",
"--no-zygote",
'--user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
])
@classmethod
async def _init_webpage(cls):
cls.page = await cls.browser.newPage()
await asyncio.sleep(1)
await cls.page.setJavaScriptEnabled(True)
@classmethod
async def _init_webpage_properties(cls):
await cls.page.evaluate(''() =>{
Object.defineProperties(navigator,{
webdriver:{
獲取。() => false
}
})
}''')
await cls.page.evaluation(''() =>{
Object.defineProperties(window,{
chrome:{
獲取。() => true
}
})
}''')
async def _connect_website(self):
await self.page.goto(self.url, {'waitUntil': 'networkidle2', 'timeout': 60000})
await asyncio.sleep(6)
self._title = await self.page.evaluation(''() => {
return document.title
}''')
self._page_source = await self.page.content()
async def _take_snapshot(self):
await self.page.screenshot({'path': f "snapshots/{self.url.strip('https://').strip('http://').replace('. ', '_').replace('/', '-')}.png" })
@屬性
def page_source(self):
return self._page_source
@property
def title(self):
return self._title
async def close(self):
await self.browser.close()
async def main():
parser = ArgumentParser(description='A tool to obtain HTMl of a web URL')
parser.add_argument('-u', '--url', dest='url', type=str, required=True, metavar='URL',
help='要檢索HTML的網站的URL')
args = parser.parse_args()
kwargs = vars(args)
如果不是kwargs.get('url')是None。
retriever = HTMLRetriever(url=kwargs.get('url'))
await retriever.load()
print(retriever.title)
await retriever.close()
如果 __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318352.html
標籤:
上一篇:unix行內腳本包括另一個腳本
