背景介绍
最近在为部门编写一个网站截图工具,将输入网址自动截取全站截图。
方案思考
python+selenium+webdriver
github:
https://github.com/iamjasonchoi/Screenshot
主要代码如下:
————————————————
from selenium import webdriver from selenium.webdriver.chrome.options import Options import requests from bs4 import BeautifulSoup import time from tld import get_fld import os i = 0 # 目前暂时先用一个计数来表示图片的文件名 def getScreenShot(url): ''' 此函数用于根据url访问网页,并截图到本地文件夹 ''' global i # 全局变量 chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') # 设置浏览器参数 chrome_options.add_argument("--window-size=1440,1024") chrome_options.add_argument("--hide-scrollbars") brower = webdriver.Chrome(chrome_options=chrome_options) # 创建一个chrome的webdrive brower.maximize_window() # 设置全屏截图 js_height = "return document.body.clientHeight" path = "/Users/xxx/PycharmProjects/CutwebV2/venv/pic/" + get_fld(url) + "/" #path = "C:/pic/" + urlparse.urlparse(url).netloc + "/" # 判断路径是否存在 isExists = os.path.exists(path) # 判断结果 if not isExists: # 如果不存在则创建目录 # 创建目录操作函数 os.makedirs(path) else: path = "/Users/xxx/PycharmProjects/CutwebV2/venv/pic/" + get_fld(url) + "/" #path = "C:/pic/" + urlparse.urlparse(url).netloc + "/" picName = path + get_fld(url) + "_" + str(i) + ".png" # 指定保存文件的文件名 brower.get(url) # 获取url i += 1 try: brower.get(url) k = 1 height = brower.execute_script(js_height) # 获取整张网页的截图,而不只是当前屏幕范围内的 while True: if k * 500 < height: js_move = "window.scrollTo(0,{})".format(k * 500) print("============working============") brower.execute_script(js_move) time.sleep(0.2) height = brower.execute_script(js_height) k += 1 else: break scroll_width = brower.execute_script('return document.body.parentNode.scrollWidth') scroll_height = brower.execute_script('return document.body.parentNode.scrollHeight') brower.set_window_size(scroll_width, scroll_height) brower.get_screenshot_as_file(picName) time.sleep(0.1) except Exception as e: print(picName, e) brower.save_screenshot(picName) # 保存截图 brower.close() # 关闭webdriver def getHTMLText(url): ''' 此函数用于获取网页的html文档 ''' try: # 获取服务器的响应内容,并设置最大请求时间为6秒 res = requests.get(url, timeout=6) # 判断返回状态码是否为200 res.raise_for_status() # 设置该html文档可能的编码 res.encoding = res.apparent_encoding # 返回网页HTML代码 return res.text except: return '产生异常' def main(): ''' 主函数 ''' # 目标网页,这个可以换成一个你想要的网站 #url = raw_input("请输入网址【形如http://www.xxx.com】: "); #url = "' " + url + "'" #test #url = 'http://tjhglngy.com/' f = open("urls.txt", "r") urlList = f.readlines() for url in urlList: try: demo = getHTMLText(url) # 获取html代码 # 解析HTML代码 soup = BeautifulSoup(demo, 'html.parser') # 模糊搜索HTML代码的所有包含href属性的<a>标签 a_labels = soup.find_all('a', attrs={'href': True}) hash_set = set() # 创建一个哈希表,避免对同一个网站重复截图,每当访问一个网站后,将网址加入到哈希表中,如果哈希表中已经有这个网址,则不再截图 # 获取所有<a>标签中的href对应的值,即超链接 for a in a_labels: s = url + a.get('href') if s not in hash_set: # 如果这个超链接不在哈希表中 hash_set.add(s) # 添加这超链接到哈希表 getScreenShot(s) # 获取这个网站的截图 return url + '站点截图完成!' except: return '产生异常了' if __name__ == "__main__": main()