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

    针对有些动态网站,需要用到自动化测试工具。为了避免封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系统下均完美运行

(2020-06-02说明:无法设置无界面)

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爬虫文件中:

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)

        #插件加载
        chrome_options.add_extension(proxy_auth_plugin_path)

        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()
        #......根据需求直接编写抓取数据代码

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

                                                                       

 

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值