简介:
用pyhon爬取动态页面时普通的urllib2无法实现,例如下面的京东首页,随着滚动条的下拉会加载新的内容,而urllib2就无法抓取这些内容,此时就需要今天的主角selenium。
selenium是一个用于web应用程序测试的工具。selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括ie、mozilla firefox、mozilla suite等。使用它爬取页面也十分方便,只需要按照访问步骤模拟人在操作就可以了,完全不用操心cookie,session的处理,它甚至可以帮助你输入账户,密码,然后点击登陆按钮,对于上面的滚动条,你只需要让浏览器滚到到最低端,然后保存页面就可以了。以上的这些功能在应对一些反爬虫机制时十分有用。接下来就开始我们的讲解正文,带领大家实现一个需要登录的动态网页的爬取。
案例实现:
使用selnium需要选择一个调用的浏览器并下载好对应的驱动,在桌面版可以选择chrome,firefox等,服务器端可以使用phantomjs,桌面版可以直接调出来浏览器观察到变化,所以一般我们可以在桌面版用chrome等调试好之后,将浏览器改为phantomjs然后上传到服务器使其运行,这里我们直接以phantomjs做演示.
首先时导入模块:
from selenium.webdriver.common.desired_capabilities import desiredcapabilities
from selenium import webdriver
接下来时初始化一个浏览器,参数中可以指定加载网页的一些属性:
cap = webdriver.desiredcapabilities.phantomjs
cap[“phantomjs.page.settings.resourcetimeout”] = 180
cap[“phantomjs.page.settings.loadimages”] = false
driver = webdriver.phantomjs(executable_path=”/home/gaorong/phantomjs-2.1.1-linux-x86_64/bin/phantomjs”, desired_capabilities=cap)
上面初始了phantomjs并设置了浏览器的路径,加载属性选择了资源加载超时时间和不加载图片(我们只关心网页文本)。在 这里 还可以选择其他设置。
设置一些属性,并下载一个网页
driver.set_page_load_timeout(180)
driver.get(‘#’)
time.sleep(5)
driver.save_screenshot(‘./login.png’) #为便于调试,保存网页的截图
由于在服务器端运行难免出错,可以用save_screenshot保存当前网页的页面便于调试。
接下来就是输入账户和密码登陆,以获取网站的cookies,便于后面请求。
#输入username和password
driver.find_element_by_xpath(“/html/body/p[1]/p[1]/login/p[2]/p/form/input[1]”).send_keys(‘*****’)
time.sleep(1)
print ‘input user success!!!’
driver.find_element_by_xpath(“/html/body/p[1]/p[1]/login/p[2]/p/form/input[2]”).send_keys(‘****’)
time.sleep(1)
print ‘input password success!!!’
driver.find_element_by_xpath(“/html/body/p[1]/p[1]/login/p[2]/p/form/button”).click()
time.sleep(5)
上面代码使用find_element_by_xpath获取输入框的位置后输入账户和密码并点击登陆键,可以看到一些都很方便。它会自动跳转到下一个页面,我们只需要sleep几秒等待它。
我们需要爬取的网页信息在某个特定的element里,所以我们需要判断一下这个element是否出现:
try:
element = webdriverwait(driver, 10).until(
ec.presence_of_element_located((by.class_name, ‘pulses’))
)
print ‘find element!!!’
except:
print ‘not find element!!!’
print traceback.format_exc()
driver.quit()
上面判断 class为 ‘pulse’ 这个element是否出现,如果等待10s后还未出现,则selenum会爆出timeouterror错误。
上面就进行了基本的初始化,然后就需要处理动态的内容了,这个网页像京东一样会随着下拉自动出现内容,所以我们需要实现下拉滚动条:
print ‘begin scroll to get info page…’
t1 = time.time()
n = 60 #这里可以控制网页滚动距离
for i in range(1,n+1):
s = “window.scrollto(0,document.body.scrollheight/{0}*{1});”.format(n,i)
#输出滚动位置,网页大小,和时间
print s, len(driver.page_source),time.time()-t1
driver.execute_script(s)
time.sleep(2)
其中driver.page_source就是获取网页文本。当滚动完毕后我们就可以调用它然后写到一个文件里。这样就完成了这个的程序逻辑。
高级:
用selenim可以应对常见的反爬虫策略,因为相当于一个人在浏览网页,但是对于验证码这些还需要做额外的处理,还有一点就是访问速度不能过快,毕竟他需要调用一个浏览器,如果嫌他速度慢的话我们可以在必要的时候使用他,非必要时候可以使用requests库进行操作。
这里有两篇博客大家可以参考查阅:python爬虫利器五之selenium用法 和 常用函数
以上就是详解python爬虫利器selenium使用方法的详细内容,更多请关注 第一php社区 其它相关文章!