无界面浏览器
phantomjs是selenium子包webdriver下面的一个浏览器,本身是一个浏览器(headless browser),更详细的使用教程可移步:[官方文档]http://selenium-python-zh.readthedocs.io/en/latest/index.html
phantomjs 配置问题
很多博客写phantomjs使用教程并不是写的很详细,或许我看得不够详细,直到在工作过程中遇到问题,才花时间详细了解一下。
配置使用,建议记一下
from selenium import webdriver
# 引入配置对象DesiredCapabilities
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
dcap = dict(DesiredCapabilities.PHANTOMJS)
#从USER_AGENTS列表中随机选一个浏览器头,伪装浏览器
dcap["phantomjs.page.settings.userAgent"] = (random.choice(USER_AGENTS))
# 不载入图片,爬页面速度会快很多
dcap["phantomjs.page.settings.loadImages"] = False
# 设置代理
service_args = ['--proxy=127.0.0.1:9999','--proxy-type=socks5']
#打开带配置信息的phantomJS浏览器
driver = webdriver.PhantomJS(phantomjs_driver_path, desired_capabilities=dcap,service_args=service_args)
# 隐式等待5秒,可以自己调节
driver.implicitly_wait(5)
# 设置10秒页面超时返回,类似于requests.get()的timeout选项,driver.get()没有timeout选项
# 以前遇到过driver.get(url)一直不返回,但也不报错的问题,这时程序会卡住,设置超时选项能解决这个问题。
driver.set_page_load_timeout(10)
# 设置10秒脚本超时时间
driver.set_script_timeout(10)
需要记住的点:
(一):浏览器头设置
dcap["phantomjs.page.settings.userAgent"] = (random.choice(USER_AGENTS))
(二):图片是否载入问题
dcap["phantomjs.page.settings.loadImages"] = False
(三):代理设置
service_args = ['--proxy=127.0.0.1:9999','--proxy-type=socks5']
(四):页面连接超时时间设置
driver.set_script_timeout(10)
phantomjs进程自启动问题
因为在服务器上开启了定时任务,当把定时任务关掉后,还是会发现phantomjs会占用内存,百度(用不了梯子)了好些个方法,找到了解决的办法,这里稍微记录一下。
phantomjs 对多进程的支持性极不稳定,会出现一些莫名的问题,但是phantomjs 相对于Google浏览器占用内存少,轻量级,无界面,是一大可取之处。
(1) 代码问题:
问题代码因为这一串代码,很粗心的没有用 try catch 方法包起来,只是简单的退出来,集成在scrapy 这个框架里,难免不出现问题。
正确代码姿势:
driver = webdriver.PhantomJS()
try:
driver.get(request.url)
print('current_url1 >>>>', driver.current_url)
time.sleep(1)
content = driver.page_source.encode('utf-8')
driver.quit()
except Exception as e:
driver.quit()
加上了try catch
总结:
生活中加上 try catch 语句总免会减少些奇葩的bug 发生,难道不是吗?heh.......
网友评论