8,463

Selenium、Chrome模拟打开浏览器(chromedriver.exe)、PhantomJS(phantomjs.exe)踩过的坑

这几天采集数据方面接连遇到问题,最初是采用request的方式获取指定url的源码进行数据采集,后来由于业务需求采用基于Selenium结合Chrome模拟打开浏览器的方式进行数据采集。但是再跑一段时间,由于反爬举措的有限,最先想到的就是使用代理ip,但是好像根据网上的设置方式似乎不起作用。针对chrome配置项的设置如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# chrome_options.add_argument("--disable-extensions")
# 设置默认打开是英文
chrome_options.add_experimental_option('prefs', {'intl.accept_languages': 'en'})
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--ignore-ssl-errors')
# 设置代理ip:该方式测试无法正常打开网页
chrome_options.add_argument('--proxy-server="http://ip:port')

# 最大化
# chrome_options.add_argument('--start-maximized')
# chrome_options.add_argument("--window-size=0,5")
#禁止图片加载
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)
#或者  使用下面的设置, 提升速度
chrome_options.add_argument('blink-settings=imagesEnabled=false')

# 携带Cookie
chrome_options.add_argument("user-data-dir=selenium") 

#谷歌无头模式-无界面
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')#谷歌文档提到需要加上这个属性来规避bug

chrome_options.add_argument('disable-infobars') #隐藏"Chrome正在受到自动软件的控制"
chrome_options.add_argument('lang=zh_CN.UTF-8')      # 设置中文
chrome_options.add_argument('window-size=1920x3000') # 指定浏览器分辨率
chrome_options.add_argument('--hide-scrollbars')     # 隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('--remote-debugging-port=9222')

# 更换头部
user_agent = (
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) " +
    "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36"
    )
chrome_options.add_argument('user-agent=%s'%user_agent)

driver = webdriver.Chrome(chrome_options=chrome_options)


#设置cookie
driver.delete_all_cookies()# 删除所有的cookie
driver.add_cookie({'name':'ABC','value':'DEF'})# 携带cookie打开
driver.get_cookies()

# 通过js新打开一个窗口
driver.execute_script('window.open("https://www.baidu.com");')

url = '待采集url'
driver.get(url)
data = driver.page_source.encode('utf-8', 'ignore')
print(data)
driver.quit()

上次还上某宝买了个代理ip进行测试,网上大部分也都说这么设置的,以上设置完以为可以了,结果却打不开网页,如下图:

空白页

后来查阅资料,发现还有一种采集数据的引擎–PhantomJS,该框架虽然没有chrome、firefox出名,但是好像可以采集,也可以用上代理IP,前面文章已经做了简单介绍: 自动化测试之SELENIUM的初步使用。虽然可以成功采集,但是采集的时候会提示一段警告的英文如下图:

控制台警告

一开始没去理会后来去翻译了一下,大概意思是说:selenium已经放弃PhantomJS了,建议使用火狐或者谷歌无界面浏览器。所谓的无界面就是上面设置的”–headless”属性,就是无界面采集。经查阅,应该是我们安装的selenium默认版本较新,不太建议使用PhantomJS引擎了,官方建议我们使用火狐或者谷歌无界面浏览器,我们可以以一种投机的方式处理这个问题,既然是版本较高的原因导致的,那么我们就降低selenium的版本应该可以得到解决,然后我就试着卸载当前selenium==3.141.0的版本:pip uninstall selenium,接着安装低版本:pip install selenium==2.48.0,安装后再跑程序,发现之前的警告信息也随之消失了,如下图:

解决方案

虽然这招可行,不过降版本终究不是最佳方式。既然官方已经给了警告信息,或许这是个过渡阶段,后面可能就真的直接启用,完全用不了了。最佳方案还是用火狐或者谷歌无界面浏览器设置代理ip进行数据采集,针对Selenium、Chrome模拟打开浏览器的代理ip还需要研究一下。经过我的细心分析,终于发现了,其实以上设置代理的方式没问题,只不过ip的类型可能有问题,下面举例子分析,免费的代理ip来自站大爷-专业的大数据基础服务平台,如下图:

站大爷

设置代理ip的完整代码:

from selenium import webdriver
import time
chromeOptions = webdriver.ChromeOptions()
# 设置代理
PROXY = "http://210.22.5.117:3128" # 以下根据不同类型的代理ip作为测试:髙匿、透明、未知
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server={0}'.format(PROXY))
# 一定要注意,=两边不能有空格,不能是这样--proxy-server = 202.20.16.82:10152
browser = webdriver.Chrome(chrome_options = chrome_options)
# 查看本机ip,查看代理是否起作用
browser.get("http://www.baidu.com")
time.sleep(1000)
# 退出,清除浏览器缓存
browser.quit()

1、使用髙匿ip作为代理

经测试匿名ip不论是否支持https、post使用以上方式设置不一定可以访问指定链接:

髙匿IP

2、使用透明ip作为代理-https、posts

经测试透明ip支持https、posts使用以上方式设置可以成功访问指定链接:

透明IP

最后再举个用PhantomJS设置代理ip采集百度的例子:

from selenium import webdriver
import lxml.html
import random
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

def set_header():
    user_agent_list = [
        "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16",
        "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
        "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",
        "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
        "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
        "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",
        "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00",
        "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00",
        "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0",
        "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62",
        "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52",
        "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51",
        "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50",
        "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50",
        "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11",
        "Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11",
        "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11",
        "Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10",
        "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10",
        "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10",
        "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1",
        "Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01",
    ]
    return user_agent_list[random.randint(0, len(user_agent_list )-1)]


def setproxy():
    proxyHost = "180.153.144.138"
    proxyPort = "8800"
    proxyType='http' #socks5
    # 代理隧道验证信息
    service_args = [
    "--proxy-type=%s" % proxyType,
    "--proxy=%(host)s:%(port)s" % {
        "host" : proxyHost,
        "port" : proxyPort,
        }
    ]
    #设置请求头
    user_agent = (
      set_header()
      )
    dcap = dict(DesiredCapabilities.PHANTOMJS)
    dcap["phantomjs.page.settings.userAgent"] = user_agent
    browser = webdriver.PhantomJS(r'C:/PhantomJS/phantomjs-2.1.1-windows/bin/phantomjs.exe', service_args=service_args, desired_capabilities=dcap)
    # browser = webdriver.PhantomJS(r'C:/PhantomJS/phantomjs-2.1.1-windows/bin/phantomjs.exe', desired_capabilities=dcap)
    print('开始打开网页')
    browser.get("https://www.baidu.com")
    data = browser.page_source.encode('utf-8', 'ignore')
    print('获取网页内容')
    order_doc = lxml.html.document_fromstring(data)
    # 获取网页标题
    title = order_doc.xpath('//title/text()')
    print('获取网页标题:',title[0])
    browser.quit()

if __name__ == '__main__':
	setproxy()

结果如下:

007

注:本文为原创作品,如需转载请注明出处 http://www.lhcx821.com/?p=605。

Selenium、Chrome模拟打开浏览器(chromedriver.exe)、PhantomJS(phantomjs.exe)踩过的坑》有1个想法

发表评论

邮箱地址不会被公开。 必填项已用*标注