#selenium
- 这个模块玩儿爬虫的都知道,因为这个可以完全模拟人为的对浏览器的操作,在一些反爬虫做的很完善的站点的时候,大家选取这个模块,可以说是百试不爽。
- 很多浏览器都支持自动操作,我一般用chrome。
- 模块获取元素和定位按钮的方法有很多,这个大家可以具体官方文档。
- 这里只是想踩一下Web页面的渲染问题,也就是,我们在使用selenium定位元素时,如果页面没有把你需要的需要的定位元素或者按钮加载出来咋搞。
强制等待
- 这是最简单粗暴的方式,方法很是简单,那就是sleep
- 这个方法其实挺不靠谱的,就是你虫子爬啊爬,然后你让他睡一会儿,等待页面的加载完成,一种好的现象,它睡醒了,自己需要的东西也出来了,但是如果说是没有,虫子就直接罢工抛异常给你。not fount element。
隐形等待
- 这个就是一种比较老实的等待,那就是利用selenium自带的方dervier.implicitly_wait(等待时间),
- 为啥说这个等待方法很老实了,就是因为,回一直等待这个页面加载渲染完,也就是你上面那个圈圈再也不转了,你的虫子就会在你这个已经加载好的页面上寻找它定位好的元素,然后执行下一步。
- 这个方法虽然笨重,但是如果说你需要的页面的比较简洁,这个方法就比较稳妥,而且你的虫子也会很舒服。
##显性等待 - 这个比起上面的方法来说就好一些,网页加载是一部分一部分的加载,就说明不需要到网页完全加载完再让虫子去爬。
- python早就在selenium中留好方法,就是常说的
- from selenium.webdriver.support.wait import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- 上面的两个数模块
- 方法的话
- WebDriverWait(操作对象,等待时间,等待间隔).until(
EC.presence_of_all_elements_located((等待元素))
) - 等待元素可以使用By定位,这个就不多提及了,因为元素定位的方法更加简答
- 这等待对象中有很多的方法,我上面只提到一种方法,大家可以在文档中根据合适的场景获取合适的方法,进行定位。
结合scrapy
- 结合框架,你可能会说,直接提交表单不就行了么?但是反爬虫的机制中,数据只有发生点击事件,人家的服务器才会给你数据,不然没办法获取
- 这里将常用的框架scrapy,根据需求在不同的需求在不同的阶段进行点击事件。
- 一般都发生在页面爬取然后需要点击获取数据然后再爬取,你就会发现这不就是中间层嘛,
- 在中间层创造一个类,然后去操作浏览器,不过这时候你就会觉得好别扭啊,我之前都获取了一半数据了还要再重头来。
- 你可以使用幽灵浏览器,就是计算机后台模拟打开,不过还是重头来的,我还没有想到其他的解决办法,有之后过来更新,大家也可以评论出来。
部分接口使用
- 说明一下,导入模块
from selenium import webderiver
- 打开浏览器的方法
deriver = webderiver.chrome()
可以使用的浏览器有好多种 - 打开网页的方法
deriver.get(url)
以上面实例化的对象为实例 - 获取当前页面的页面源码
source_text = deriver.page_source
- 使用完以后最好对这个deriver进行释放,她自己不会释放,你需要手动一下
deriver.quit()
和deriver.close()
这两有些区别就是,前者会把自己打开的所有页面干没了,后者之后关闭当前页面。 - 获取页面的图片文件
deriver.get_screenshot_as_file('元素名称')
需要引入模块(先说方法后说库是不是。。。)from selenium.webdriver.common.desired_capabilities import DesiredCapablitlies
- 通过路经定位元素
deriver.find_element_by_xpath('元素路径')
如果要是对其进行点击操作,就在后面加.click()
如果要是需要输入信息就在后面加.send_keys('输入信息')
就妥。