资源经验分享解决selenium+chromedriver +IP代理插件,设置无界面报错的问题

解决selenium+chromedriver +IP代理插件,设置无界面报错的问题

2019-12-20 | |  110 |   0

原标题:解决selenium+chromedriver +IP代理插件,设置无界面报错的问题

原文来自:CSDN      原文链接:https://blog.csdn.net/qq_36853469/article/details/103441480


针对有些动态网站,需要用到自动化测试工具。为了避免封IP保证抓取到数据,使用了IP代理;为了提高效率,想要设置成无界面模式,但是不管是windows下还是Linux下,一旦两者结合时,直接报错。

报错代码如下:

selenium.common.exceptions.WebDriverException: Message: unknown error: failed to wait for extension background page to load: chrome-extension://kmfmlecicfolmocapbbhilogaebehllm/_generated_background_page.html
from unknown error: page could not be found: chrome-extension://kmfmlecicfolmocapbbhilogaebehllm/_generated_background_page.html

说明:方案一在windows系统下还是无效的,方案二理论上所有系统通用,需要的可以直接看方案二

方案一:Linux下伪无界面模式

1.selenium+chromedriver 使用代理插件+无界面时报错:

 错误代码如上就是上面给出的

差点翻遍谷歌和百度都没有找到解决办法.快绝望的时候看到篇博客,完美解决,博客原文后面再找时没找到了....

2.安装Xvfb虚拟界面工具和xdpyinfo

yum install Xvfb -y
yum install xdpyinfo

3. 安装Python虚拟桌面  pyvirtualdisplay

pip3 install pyvirtualdisplay

4. 在chromedriver启动前启动一个显示器

from selenium import webdriver
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 800))
display.start()

5. 浏览器属性设置

chrome_options = Options()
        proxy_auth_plugin_path = self.set_id_proxy()
        chrome_options.add_extension(proxy_auth_plugin_path)
 
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        chrome_options.add_argument('blink-settings=imagesEnabled=false')
 
        prefs = {'profile.managed_default_content_settings.images': 2}
        chrome_options.add_experimental_option('prefs', prefs)
 
        #chrome_options.add_argument('--headless') #不设置,其实是有界面
        self.driver = webdriver.Chrome(options=chrome_options)
        self.wait = WebDriverWait(self.driver, 20)  # 设置等待时间20秒

6. 测试

self.driver.get(url)
print(self.driver.page_source)

成功获取到页面数据 

                     

方案二:借助scrapy框架,windows,linux系统下均完美运行

1.新建scrapy项目,新建spider,items.py中添加好相关字段

2.setting.py中将下载中间件DOWNLOADER_MIDDLEWARES 和管道ITEM_PIPELINES打开

DOWNLOADER_MIDDLEWARES = {'wbScrapy.middlewares.wbscrapyDownloaderMiddleware': 543,}
ITEM_PIPELINES = {'wbScrapy.pipelines.wbscrapyPipeline': 300,}

3.修改middlewares.py,process_request(self, request, spider)函数中添加代理信息

#具体代理信息自行配置,这里是阿布云
 def process_request(self, request, spider):
    request.meta["proxy"] = proxyServer
    request.headers["Proxy-Authorization"] = proxyAuth

4. spider爬虫文件中:

# -*- coding: UTF-8 -*-
import scrapy
from wbScrapy.items import WbscrapyItem
from scrapy import Request
import time
import re
from selenium import webdriver
from time import sleep
import random
import json
from lxml import etree
import requests
 
class WbSpider(scrapy.Spider):
    name = 'spiderNames'
    allowed_domains = ['']
    start_urls = ['']
    bash_url = ''
 
 
    def __init__(self):
        '''
        浏览器配置初始化
        '''
        self.chromedriverPath = r"./chromedriver.exe" #windows下驱动位置,linux下不需要
        from selenium.webdriver.chrome.options import Options
        chrome_options = Options()
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('blink-settings=imagesEnabled=false')
        chrome_options.add_argument('--disable-gpu')
        prefs = {'profile.managed_default_content_settings.images': 2}
        chrome_options.add_experimental_option('prefs', prefs)
 
        self.driver = webdriver.Chrome(executable_path=self.chromedriverPath, options=chrome_options)
        self.driver.set_page_load_timeout(60)
        self.flag = True 
 
    # 当爬虫退出的时候关闭Chrome
    def spider_closed(self, spider):
        self.driver.quit()
 
    def start_requests(self):#调起爬虫中间件,让脚本走代理
        full_url = "https://www.baidu.com/" #随便写个接口进来,转走
        yield scrapy.Request(full_url,callback=self.parse, dont_filter=True)
 
    def parse(self,reponse):
        item = WbscrapyItem()
        #......根据需求直接编写抓取数据代码

最终效果:通过终端打印+本地抓取到的数据,说明无界面+代理插件生效

                                                                       03.png

 

 

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:kaggle竞赛练手( CIFAR-10 - Object Recognition in Images)

下一篇:windows下虚拟环境的安装与使用

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...