python3的爬虫笔记11——Selenium和浏览器的一些设置

自从用了Selenium的方法,就停不下来了。毕竟稍微正式点的网站,都是JS动态加载数据。requests虽然速度快,但能用的范围还是有限。在不追求极至效率的情况下,Selenium使用方便简单并且强大。
这里总结一些比较实用的Selenium和PhantomJS、Chrome的设置。

后续跟进更新,会把我以后用到的觉得还算实用的方法放进来。

1.限制页面加载时间

selenium webdriver在get()方法会一直等待页面加载完毕才会执行后面的,可如果加载时间太长会导致后续操作无法进行。有时我们要的信息已经加载出来了,再继续加载网页就没有意义了。
可以通过set_page_load_time()方法来设定时间
然后捕获TimeoutException异常,并通过执行Javascript来停止页面加载 window.stop()

from selenium import webdriver
from selenium.common.exceptions import TimeoutException

driver = webdriver.PhantomJS()
# 设定页面加载限制时间
driver.set_page_load_timeout(5)
driver.maximize_window()

try:
    driver.get('http://phantomjs.org/api/command-line.html')
except TimeoutException:  
    print('加载超过5秒,强制停止加载....') 
    #当页面加载时间超过设定时间,通过执行Javascript来stop加载,即可执行后续动作
    driver.execute_script('window.stop()') 

execute_script()是一个执行Javascript代码的方法。

2.修改浏览器窗口大小

有时候PhantomJS不修改浏览器不修改窗口大小就会有意外的惊喜(报错!),修改的方法也很简单,建议使用PhantomJS访问网页时都先加上。

#自定义窗口大小:
driver.set_window_size(1366,768)
#默认为最大窗口:
driver.maximize_window()

一般用driver.maximize_window()默认最大窗口就行了。

3.修改User-Agent

为了反爬虫或者获取一些移动端网络数据时,需要改变User-Agent。

  • 修改PhantomJS的User-Agent
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.103 Safari/537.36"
)

driver = webdriver.PhantomJS(desired_capabilities=dcap)

driver.get("http://www.baidu.com/")
#利用javascript的方法查看user-agent,须在调用get()后使用。
agent = driver.execute_script("return navigator.userAgent")
print(agent)
driver.quit()

运行结果:

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.103 Safari/537.36

查看当前User-Agent的方法,还可以通过访问 https://httpbin.org/user-agent ,然后提取信息,比如说截个图。

driver.get("https://httpbin.org/user-agent")
#网页截图
driver.save_screenshot('User-Agent.png')

获得截图


  • 修改Chrome的User-Agent
from selenium import webdriver

options = webdriver.ChromeOptions()
# 设置成中文
options.add_argument('lang=zh_CN.UTF-8')
# 添加头部
options.add_argument('user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.103 Safari/537.36"')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://httpbin.org/user-agent")
#driver.quit()

网页运行结果:


实际上我的Chrome的User-Agent(之前说过chromedriver不支持太新版本的chrome)是:

可以看到,user-agent确实是改变了。

4.浏览器无图模式加载网页

大多情况下,图片加载对我们并无意义。无图模式加载能提高网页加载速度,从而提高爬取速度。

  • PhantomJS无图模式

PhantomJS官网中给出了一些PhantomJS的设置参数(点我查看)。

from selenium import webdriver
#不加载图片,开启缓存
SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']
driver = webdriver.PhantomJS(service_args=SERVICE_ARGS)

driver.get("http://huaban.com/")
#网页截图
driver.save_screenshot('screenshot.png')
driver.quit()

还有一个和之前设置user-agent类似的方法,也能实现无图加载的功能。

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

dcap = dict(DesiredCapabilities.PHANTOMJS)
#设置无图模式
dcap["phantomjs.page.settings.loadImages"] = False

driver = webdriver.PhantomJS(desired_capabilities=dcap)

driver.get('http://huaban.com/')
driver.save_screenshot('screenshot.png')

driver.quit()
  • Chrome无图模式
from selenium import webdriver

options = webdriver.ChromeOptions()
#1允许所有图片;2阻止所有图片;3阻止第三方服务器图片
prefs = {
    'profile.default_content_setting_values': {
        'images': 2
    }
}
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(chrome_options=options)

driver.get("http://huaban.com/")
#driver.quit()

运行结果:


5.ip代理
  • PhantomJS
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.proxy import ProxyType
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

proxy = Proxy(
    {
        'proxyType': ProxyType.MANUAL,
        'httpProxy': '171.13.37.182:808'  # 代理ip和端口
    }
)
desired_capabilities = DesiredCapabilities.PHANTOMJS.copy()
# 把代理ip加入
proxy.add_to_capabilities(desired_capabilities)
driver = webdriver.PhantomJS(desired_capabilities=desired_capabilities)
driver.get('http://httpbin.org/ip')
print(driver.page_source)
driver.close()

运行结果:

<html><head></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">{
  "origin": "171.13.37.182"
}
</pre></body></html>

或者(方法基本一致)

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.proxy import ProxyType
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

driver=webdriver.PhantomJS()
proxy=webdriver.Proxy()
proxy.proxy_type=ProxyType.MANUAL
proxy.http_proxy='171.13.37.182:808'

proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
# 新建一个会话,并把参数传入,可以多次修改ip,用start_session实现动态修改ip
driver.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
driver.get('http://httpbin.org/ip')
print(driver.page_source)

driver.quit()
# 还原为系统代理
proxy=webdriver.Proxy()
proxy.proxy_type=ProxyType.DIRECT
proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
driver.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
#driver.get('http://httpbin.org/ip')

亲测都有效,按理说根据PhantomJS的参数说明直接修改service_args中的proxy参数就能实现ip代理,代码也比较精简易读,不过实际运行时无法返回正确信息

#活在理想中,并运行不出来的辣鸡程序23333
from selenium import webdriver
service_args = ['--proxy=171.13.37.182:808','--proxy-type=http']
driver = webdriver.PhantomJS(service_args=service_args)
driver.get('http://httpbin.org/ip')
print(driver.page_source)
driver.quit()

希望有大佬指点下,这个程序为啥不对。。。

  • Chrome
    和修改User-Agent的方法类似
from selenium import webdriver
#打开chrome设置
chrome_options = webdriver.ChromeOptions()
#添加proxy参数
chrome_options.add_argument('--proxy-server=http://58.209.151.126:808')
chrome = webdriver.Chrome(chrome_options=chrome_options)
chrome.get('http://httpbin.org/ip')
print(chrome.page_source)
chrome.quit()
6.鼠标操作

selenium对浏览器操作、鼠标操作等总结
——简友“古佛青灯度流年”的总结,非常详细,还包括了一些键盘操作、多窗口、显示等待预期条件的完整翻译等等,很棒!
个人感觉鼠标操作比较有用的是悬停操作,现在越来越多的网页需要把鼠标放到指定位置才显示新的内容,比如百度知道的问题分类、比如淘宝的价格区间输入框等等。

悬停操作的模板如下

from selenium import webdriver
improt time
#引入ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#定位到要悬停的元素
above =driver.find_element_by_id("xx")
#对定位到的元素执行悬停操作
ActionChains(driver).move_to_element(above).perform()
time.sleep(5)
7.COOKIE设置

使用COOKIE登录可以免去模拟输入账号、密码、验证码的过程。selenium中常见的对cookie主要有以下几种:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')

#获取cookie
driver.get_cookies()
#删除指定cookie
driver.delete_cookie("CookieName")
#删除全部cookie
driver.delete_all_cookies()
#添加cookie,可操作参数为name、value、secure、domain、path。
driver.add_cookie({'name':'AAA', 'value':'BBB'})

本来我直接复制浏览器头里面的COOKIE,发现程序会报错。这里的COOKIE的参数只能是name、value、secure、domain、path。所以我们首先用自带的方法先拿到COOKIE。
下面以登录百度为例,获取COOKIE:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print(driver.get_cookies())
driver.delete_all_cookies()
input('等待登录..')
print(driver.get_cookies())
time.sleep(2)
driver.quit()

浏览器显示百度首页后,程序卡在input中,我们手动登录下,然后回程序界面随便给个输入,即获得了新的cookie。
运行结果:

[{'secure': False, 'path': '/', 'name': 'H_PS_PSSID', 'domain': '.baidu.com', 'value': '1437_21088_22919_22159'}, {'expiry': 3643448945.194736, 'secure': False, 'name': 'BAIDUID', 'path': '/', 'value': '83E3B71AB47A71D9C41D8D6FC4B7DD52:FG=1', 'domain': '.baidu.com'}, {'expiry': 3643448945.1948347, 'secure': False, 'name': 'PSTM', 'path': '/', 'value': '1495965372', 'domain': '.baidu.com'}, {'expiry': 3643448945.194802, 'secure': False, 'name': 'BIDUPSID', 'path': '/', 'value': '83E3B71AB47A71D9C41D8D6FC4B7DD52', 'domain': '.baidu.com'}, {'expiry': 1496829298, 'secure': False, 'name': 'BD_UPN', 'path': '/', 'value': '12314753', 'domain': 'www.baidu.com'}, {'expiry': 1495965299.194861, 'secure': False, 'name': 'BD_LAST_QID', 'path': '/', 'value': '13404962645896014853', 'domain': 'www.baidu.com'}, {'secure': False, 'path': '/', 'name': 'BD_HOME', 'domain': 'www.baidu.com', 'value': '0'}, {'expiry': 1495965303.996251, 'secure': False, 'name': '__bsi', 'path': '/', 'value': '17537283370589855674_00_0_I_R_2_0303_C02F_N_I_I_0', 'domain': '.www.baidu.com'}]
等待登录..
[{'secure': False, 'path': '/', 'name': 'H_PS_PSSID', 'domain': '.baidu.com', 'value': '1421_21121_22747_17001_22158'}, {'expiry': 1527501307.234465, 'secure': False, 'name': 'BAIDUID', 'path': '/', 'value': '37ECD490B4A2D652FE0A0C6264F18DBC:FG=1', 'domain': '.baidu.com'}, {'expiry': 2505117350, 'secure': False, 'name': 'KKK', 'path': '/', 'value': 'KKKKK', 'domain': '.baidu.com'}, {'expiry': 3643448997.013932, 'secure': False, 'name': 'PSKK', 'path': '/', 'value': '149KKK', 'domain': '.baidu.com'}, {'expiry': 2556057600, 'secure': False, 'name': 'KK_UID', 'path': '/', 'value': '0667eKKed5bKKKKK06K71', 'domain': '.www.baidu.com'}, {'expiry': 1496829350, 'secure': False, 'name': 'BD_UPN', 'path': '/', 'value': '12KK753', 'domain': 'www.baidu.com'}, {'expiry': 1496051750.065559, 'secure': False, 'name': 'BDORZ', 'path': '/', 'value': 'B490B5EKK15DKDA1598', 'domain': '.baidu.com'}, {'expiry': 1755165348.82662, 'secure': False, 'name': 'BDUSS', 'path': '/', 'value': 'ZsUzhOYzl4bVZFdk94NFlpSmVTTzAKKKKAAAAAAEAAAAGEUIGYWQ5OTYAAAAAKKKKAAAAAAAAAO-eKlnvKZbE', 'domain': '.baidu.com'}, {'secure': False, 'path': '/', 'name': 'BD_HOME', 'domain': 'www.baidu.com', 'value': '1'}, {'expiry': 2442045350, 'secure': False, 'name': 'sug', 'path': '/', 'value': '3', 'domain': '.www.baidu.com'}, {'expiry': 2442045350, 'secure': False, 'name': 'sugstore', 'path': '/', 'value': '0', 'domain': '.www.baidu.com'}, {'expiry': 2442045350, 'secure': False, 'name': 'ORIGIN', 'path': '/', 'value': '0', 'domain': '.www.baidu.com'}, {'expiry': 2442045350, 'secure': False, 'name': 'bdime', 'path': '/', 'value': '0', 'domain': '.www.baidu.com'}, {'expiry': 1495965355.737065, 'secure': False, 'name': '__bsi', 'path': '/', 'value': '170867479KKKK03KKI_0', 'domain': '.www.baidu.com'}]

然后我们把得到的cookie添加进去:

from selenium import webdriver


driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.delete_all_cookies()
cookie_list =[{'secure': False, 'path': '/', 'name': 'H_PS_PSSID', 'domain': '.baidu.com', 'value': '1421_21121_22747_17001_22158'}, {'expiry': 1527501307.234465, 'secure': False, 'name': 'BAIDUID', 'path': '/', 'value': '37ECD490B4A2D652FE0A0C6264F18DBC:FG=1', 'domain': '.baidu.com'}, {'expiry': 2505117350, 'secure': False, 'name': 'KKK', 'path': '/', 'value': 'KKKKK', 'domain': '.baidu.com'}, {'expiry': 3643448997.013932, 'secure': False, 'name': 'PSKK', 'path': '/', 'value': '149KKK', 'domain': '.baidu.com'}, {'expiry': 2556057600, 'secure': False, 'name': 'KK_UID', 'path': '/', 'value': '0667eKKed5bKKKKK06K71', 'domain': '.www.baidu.com'}, {'expiry': 1496829350, 'secure': False, 'name': 'BD_UPN', 'path': '/', 'value': '12KK753', 'domain': 'www.baidu.com'}, {'expiry': 1496051750.065559, 'secure': False, 'name': 'BDORZ', 'path': '/', 'value': 'B490B5EKK15DKDA1598', 'domain': '.baidu.com'}, {'expiry': 1755165348.82662, 'secure': False, 'name': 'BDUSS', 'path': '/', 'value': 'ZsUzhOYzl4bVZFdk94NFlpSmVTTzAKKKKAAAAAAEAAAAGEUIGYWQ5OTYAAAAAKKKKAAAAAAAAAO-eKlnvKZbE', 'domain': '.baidu.com'}, {'secure': False, 'path': '/', 'name': 'BD_HOME', 'domain': 'www.baidu.com', 'value': '1'}, {'expiry': 2442045350, 'secure': False, 'name': 'sug', 'path': '/', 'value': '3', 'domain': '.www.baidu.com'}, {'expiry': 2442045350, 'secure': False, 'name': 'sugstore', 'path': '/', 'value': '0', 'domain': '.www.baidu.com'}, {'expiry': 2442045350, 'secure': False, 'name': 'ORIGIN', 'path': '/', 'value': '0', 'domain': '.www.baidu.com'}, {'expiry': 2442045350, 'secure': False, 'name': 'bdime', 'path': '/', 'value': '0', 'domain': '.www.baidu.com'}, {'expiry': 1495965355.737065, 'secure': False, 'name': '__bsi', 'path': '/', 'value': '170867479KKKK03KKI_0', 'domain': '.www.baidu.com'}]
for i in cookie_list:
    driver.add_cookie(i)
driver.get('http://www.baidu.com')
input('查看是否登录')

driver.quit()

结果显示登录成功:


8.同一页面前进后退
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.baidu.com/")
browser.get("https://www.taobao.com/")
browser.back()
time.sleep(1)
browser.forward()
browser.close()

结果可以看到Chrome先打开百度,再打开淘宝,然后后退到百度界面,1s延时后,又前进到淘宝界面。

9.新增标签页
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to.window(browser.window_handles[1])
browser.get("https://www.taobao.com")
time.sleep(1)
browser.switch_to.window(browser.window_handles[0])
browser.get("https://python.org")

输出:

['CDwindow-76A3B191548973631D98C130545D6E0C', 'CDwindow-05DF1132B01F6B6B1590CD7CF849E08A']


现象:
先进入百度页面,然后新建标签页,在新建标签页中进入淘宝,然后进入原先百度页面所在的标签页,进入python的官网。
-----------------------------------------------------------------------------------
后续大概会继续更新一些常见的JS函数、区域截图等等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容