在一些实际项目中,经常需要进行网页截图,这里就分享一个通过scrapy+selenium进行网页截图。

首先我们需要安装selenium库

pip intall selenium

当我们使用selenium进行截图时通常使用的方法类是:

get_screenshot_as_file(截图保存路径)
# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleepdriver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
# 通常情况下我们需要等待页面加载完成后截图 所以此处睡眠2秒
driver.get_screenshot_as_file("./截图.png")
sleep(2)
driver.quit()

那么如何利用scrapy联合 selenium呢
首先我们创建一个类 然后定义好 登录帐号密码 各种组件xpath路径等变量

class BjobOrderRecordSpider(scrapy.Spider):# 爬虫名字name = 'bjob_record_spider'# 用户名输入框username_input_eml = '//*[@id="__layout"]/div/div[1]/div/div/div/div[2]/div/div[2]/form[1]/div[1]/div/div[1]/input'username = 'xxxx'# 用户名输入框password_input_eml = '//*[@id="__layout"]/div/div[1]/div/div/div/div[2]/div/div[2]/form[1]/div[2]/div/div[1]/input'password = 'xxx'login_url = 'http://xxx.cn/b2badmin/order/orderList'# 截图来源load_execl_data = 'F:\\xxxxx.xlsx'# 来源 sheetsheet1 = '办公用品及低值易耗品'# 截图保存文件headerimg_save_path_name = '文件名'# 截图保存文件headerimg_save_order_sn_name = 'EC单号'# 登录按钮login_eml = '//*[@id="__layout"]/div/div[1]/div/div/div/div[2]/div/div[2]/form[1]/div[3]/div/button'# 搜索按钮seach_q_eml = '/html/body/div/div/div[3]/section/div/div[2]/section/div[1]/div/div[1]/div/label[1]/span'# 搜索按钮seach_eml = '//*[@id="app"]/div/div[3]/section/div/div[1]/div/div[1]/div[2]/button[1]'# 搜索按钮detail_eml = '/html/body/div[1]/div/div[3]/section/div/div[2]/section/div[2]/div[1]/div[3]/table/tbody/tr/td[6]/div/span/span/span/span/div/span'detail_eml2 = '/html/body/div[1]/div/div[3]/section/div/div[2]/section/div[2]/div[1]/div[3]/table/tbody/tr/td[6]/div/span/span/span/span/div/div'# 搜索单号输入框 /html/body/div/div/div[3]/section/div/div[1]/div/div[1]/div[1]/form/div[1]/div/div[2]/inputqgdid_eml = '/html/body/div/div/div[3]/section/div/div[1]/div/div[1]/div[1]/form/div[1]/div/div[2]/input'# 截图保存目录shot_dir = 'F:\\xxxx\\网页截图\\xxxx\\'

然后再 初始化一个 selenium浏览器 对象

    def __init__(self, *args, **kwargs):self.pool3 = self.mysql_connection3()# driver = 'Chrome'driver = 'Firefox'if driver == 'Chrome':# ### 指定使用的浏览器 chromechrome_options = ChromeOptions()chrome_options.add_argument('--no-sandbox')  # 解决DevToolsActivePort文件不存在的报错chrome_options.add_argument('window-size=1920x1080')  # 指定浏览器分辨率chrome_options.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug # 禁用GPU加速chrome_options.add_argument('--start-maximized')  # 浏览器最大化chrome_options.add_argument('--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"')  # 设置请求头的User-Agent# chrome_options.add_argument('--disable-infobars')  # 禁用浏览器正在被自动化程序控制的提示chrome_options.add_argument('--incognito')  # 隐身模式(无痕模式)# chrome_options.add_argument('--disable-javascript')  # 禁用javascript ## chrome_options.add_argument('--ignore-certificate-errors')  # 禁用扩展插件并实现窗口最大化 ## chrome_options.add_argument('–disable-software-rasterizer') ## chrome_options.add_argument('--disable-extensions') #self.browser = webdriver.Chrome(# executable_path='E:/workspace/mypython/zcygov/zcygov/tool/chromedriver_win32/chromedriver.exe',# executable_path='E:/workspace/mypython/zcygov/zcygov/tool/chromedriver_win32/chromedriver_modify.exe',# executable_path='E:/workspace/mypython/zcygov/zcygov/tool/vip/chromedriver.exe',chrome_options=chrome_options# desired_capabilities=caps)else:# ### 指定使用的浏览器 Firefoxfirefox_options = FirefoxOptions()firefox_options.add_argument('--no-sandbox')  # 解决DevToolsActivePort文件不存在的报错firefox_options.add_argument('--window-size=1920x1080')  # 指定浏览器分辨率firefox_options.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug # 禁用GPU加速# firefox_options.add_argument('--hide-scrollbars')  # 隐藏滚动条, 应对一些特殊页面# firefox_options.add_argument('--blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度# firefox_options.add_argument('--headless')  # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败firefox_options.add_argument('--start-maximized')  # 浏览器最大化# firefox_options.add_argument('--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"')  # 设置请求头的User-Agent# firefox_options.add_argument(#     '--user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0"')  # 设置请求头的User-Agentfirefox_options.add_argument('--disable-infobars')  # 禁用浏览器正在被自动化程序控制的提示firefox_options.add_argument('--incognito')  # 隐身模式(无痕模式)# firefox_options.add_argument('--disable-javascript')  # 禁用javascript ## firefox_options.add_argument('--ignore-certificate-errors')  # 禁用扩展插件并实现窗口最大化 ## firefox_options.add_argument('–disable-software-rasterizer') ## firefox_options.add_argument('--disable-extensions') ## profile_directory = r'C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\s92h17dk.default-release'# profile = webdriver.FirefoxProfile(profile_directory)self.browser = webdriver.Firefox(# profile# executable_path='F:\spider_project\shuyingSpider\geckodriver\geckodriver.exe',firefox_options=firefox_options,)# ######分隔线#######self.driver = None  # 实例seleniumself.cookies = None  # 用来保存cookiesuper(BjobOrderRecordSpider, self).__init__(*args, **kwargs)

之后便是业务代码 如 登录、获取订单列表 获取订单详情 截图 等模块的封装

def start_requests(self):# return self.login()  # 登录self.browser.get(self.login_url)username = self.browser.find_element_by_xpath(self.username_input_eml)password = self.browser.find_element_by_xpath(self.password_input_eml)username.clear()username.send_keys(self.username)password.clear()password.send_keys(self.password)# 模拟点击“登录”按钮self.browser.find_element_by_xpath(self.login_eml).click()time.sleep(2)self.getScreenShot()
 # 截图详细步骤def getScreenShot(self):bjob_order_list = self.select_all3("select * from xxxxx'", ())i_num = 0for loadd in bjob_order_list:i_num = i_num + 1print("截图进度:", i_num)typeState = str(loadd["type"])company_name = loadd["company_name"]qgdId_e = loadd["sc_order"]win = loadd["win"]if win != "xx":print("非xx %s" % qgdId_e)continueorder_sn = loadd["img_name"]if os.path.isdir('%s%s\\%s' % (self.shot_dir, company_name, typeState)) == False:os.makedirs('%s%s\\%s' % (self.shot_dir, company_name, typeState))if os.path.exists('%s\\%s\\%s\\%s-1_01.png' % (self.shot_dir, company_name, typeState, order_sn)):print("文件已经存在", '%s\\%s\\%s\\%s-1_01.png' % (self.shot_dir, company_name, typeState, order_sn))continuetime.sleep(1)# 请购单号qgdId = self.browser.find_element_by_xpath(self.qgdid_eml)qgdId.clear()qgdId.send_keys(str(qgdId_e).strip())# 点击搜索self.clickElement(self.seach_eml)time.sleep(3)# 搜索前置步骤self.clickElement(self.seach_q_eml)time.sleep(1)# 打开点击查看详情句柄if self.isElementPresent(self.detail_eml) == False:if self.isElementPresent(self.detail_eml2) == False:continueelse:self.clickElement(self.detail_eml2)else:self.clickElement(self.detail_eml)# self.clickElement(self.detail_eml)time.sleep(3)windows = self.browser.current_window_handle  # 定位当前页面句柄time.sleep(2)all_handles = self.browser.window_handles  # 获取全部页面句柄if len(all_handles) >= 2:self.screenshotByhandles(all_handles, windows, order_sn, company_name, typeState)self.browser.switch_to.window(windows)
 # 切换网页句柄def screenshotByhandles(self, all_handles, windows, order_sn, company_name, typeState):i = 0for handle in all_handles:  # 遍历全部页面句柄if handle != windows:  # 判断条件i = i + 1s = str(i)self.browser.switch_to.window(handle)  # 切换到新页面width = self.browser.execute_script("return document.documentElement.scrollWidth")height = self.browser.execute_script("return document.documentElement.scrollHeight")time.sleep(1)# 将浏览器的宽高设置成刚刚获取的宽高self.browser.set_window_size(width, 2048)# 详情截图self.clickElement('//*[@id="tab-first"]')self.shotToFile(order_sn, s, company_name, typeState, 1)# 商品明细self.clickElement('//*[@id="tab-second"]')self.shotToFile(order_sn, s, company_name, typeState, 2)
 # 截图def shotToFile(self, order_sn, s, company_name, typeState, type=1):try:pathscreenshot = '%s%s\\%s\\%s-%s_0%s.png' % (self.shot_dir, company_name, typeState, order_sn, s, str(type))pathscreenshot = str(pathscreenshot).replace('\t', '').replace('\n', '').strip()self.browser.get_screenshot_as_file(pathscreenshot)if type == 2:self.browser.close()except Exception as e:print(e)time.sleep(2)self.shotToFile(order_sn, s, type, company_name, typeState)
# 判断元素标签是否存在def isElementPresent(self, by):"""用来判断元素标签是否存在,"""try:# element = self.browser.find_element(by=by, value=value)# element = self.browser.find_element(by=by)self.browser.find_element_by_xpath(by)# 原文是except NoSuchElementException, e:except NoSuchElementException as e:# 发生了NoSuchElementException异常,说明页面中未找到该元素,返回Falsereturn Falseelse:# 没有发生异常,表示在页面中找到了该元素,返回Truereturn True
 # 获取execl数据def loadExeclData(self, path, sheetname="Sheet1"):data_path = path  # 文件的绝对路径sheetname = sheetnameget_data = ExcelData(data_path, sheetname, 0)  # 定义get_data对象datas = get_data.readExcel(1)return datas

python爬虫-scrapy基于selenium进行网页截图相关推荐

  1. python爬虫scrapy框架爬取网页数据_Scrapy-Python

    scrapy Scrapy:Python的爬虫框架 实例Demo 抓取:汽车之家.瓜子.链家 等数据信息 版本+环境库 Python2.7 + Scrapy1.12 初窥Scrapy Scrapy是一 ...

  2. python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取

    python爬虫–Scrapy框架–Scrapy+selenium实现动态爬取 前言 本文基于数据分析竞赛爬虫阶段,对使用scrapy + selenium进行政策文本爬虫进行记录.用于个人爬虫学习记 ...

  3. python爬虫——scrapy+selenium爬取新浪微博及评论

    本文主要对爬取过程中所用到的知识做简单总结,最后有项目链接. 一.项目简介 本项目利用python的scrapy框架+selenium模拟登陆微博来爬取带有关键字的微博及微博下面的评论(1 .2级评论 ...

  4. Python爬虫——Scrapy 简介和安装

    文章目录 Python爬虫--Scrapy 简介和安装 1.Scrapy 简介 2.Scrapy 下载安装 Python爬虫--Scrapy 简介和安装 1.Scrapy 简介 Scrapy 简介 S ...

  5. Python爬虫4.4 — selenium高级用法教程

    Python爬虫4.4 - selenium高级用法教程 综述 Headless Chrome 设置请求头 设置代理IP 常用启动项参数options设置 Cookie操作 selenium设置coo ...

  6. Python集成scrapy和selenium爬取苏宁图书

    Python集成scrapy和selenium爬取苏宁图书 环境:python3.6 pycharm2018.1.3 前言 本人渣渣一枚,为爬虫苏宁图书获取数据,将获得的数据保存在MangoDB中,现 ...

  7. python爬虫之初恋 selenium

    selenium 是一个web应用测试工具,能够真正的模拟人去操作浏览器. 用她来爬数据比较直观,灵活,和传统的爬虫不同的是, 她真的是打开浏览器,输入表单,点击按钮,模拟登陆,获得数据,样样行.完全 ...

  8. Python爬虫4.2 — ajax(动态网页数据抓取)用法教程

    Python爬虫4.2 - ajax[动态网页数据]用法教程 综述 AJAX 介绍 什么是AJAX 实例说明 请求分析 获取方式 实例说明 其他博文链接 综述 本系列文档用于对Python爬虫技术的学 ...

  9. python爬虫代理和selenium

    python爬虫代理和selenium 1.代理ip的使用 1.1 获取蘑菇代理中的代理ip def get_ip():response=requests.get('http://piping.mog ...

  10. Python爬虫 - scrapy - 爬取妹子图 Lv1

    0. 前言 这是一个利用python scrapy框架爬取网站图片的实例,本人也是在学习当中,在这做个记录,也希望能帮到需要的人.爬取妹子图的实例打算分成三部分来写,尝试完善实用性. 系统环境 Sys ...

最新文章

  1. 受精卵或非“生命起始”?网友:教材是不是要改了……
  2. MYSQL连接一段时间不操作后出现异常的解决方案
  3. 基本套接字总结(@function)
  4. 自己动手写一个印钞机 第二章
  5. 如何用文本档编辑c语言,c语言读写word文档
  6. CSS-posiziton
  7. android 渠道方案,Android多渠道打包时获取当前渠道的方法
  8. 可定制的PHP缩略图生成程式(需要GD库支持)
  9. js+css淡入效果
  10. [Bzoj2152]聪聪可可
  11. linux 使用VI命令怎么删除输入内容,linux系统vi编辑器常用命令及使用方法。
  12. Maxwell简单使用
  13. PWM占空比和电机转速有什么线性关系
  14. 一道简单的百度笔试题
  15. 桌面应用程序与web应用程序
  16. 拼多多2018-六一儿童节
  17. 还在用Excel做报表?建议你试试这个数据填报系统_光点科技
  18. 这篇文章教给你图片怎么去雾的几个方法
  19. 独孤思维:闷声发财,实操第二天出单,项目越做越香
  20. Linux重定向+管道命令+环境变量PATH

热门文章

  1. 如何调研如何写调研报告
  2. 匿名四轴上位机使用方法
  3. DirectX--给视频加马赛克、字符OSD
  4. Python之爬虫之BeautifulSoup学习
  5. 移动硬盘打不开(不用格式化)修复方法
  6. iOS 什么是MVC
  7. N次剩余 最基础的laji入门
  8. Java最常见208道面试题:Java大土豆答案
  9. 阿里云服务器无法ping通,ping不同阿里云服务器
  10. java多线程技术体系