我们在抓取⼀些普通⽹⻚的时候requests基本上是可以满⾜的. 但是, 如果遇到⼀些特殊的⽹站. 它的数据是经过加密的. 但是呢, 浏览器却 能够正常显示出来. 那我们通过requests抓取到的内容可能就不是我 们想要的结果了.
使用selenium前需要安装浏览器相应版本的驱动并移动到python解释器的目录下 下载链接 chromedriver.storage.googleapis.com/index.html
from selenium.webdriver import Chrome # 导⼊⾕歌浏览器的类
web = Chrome(executable_path="chromedriver")# 创建浏览器对象
web.get("http://www.baidu.com") # 输⼊⽹址
print(web.title) # 打印title
运⾏⼀下你会发现神奇的事情发⽣了. 浏览器⾃动打开了. 并且输⼊ 了⽹址. 也能拿到⽹⻚上的title标题.
el =web.find_element(By.XPATH,'//*[@id="changeCityBox"]/p[1]/a') # 定位到需要点击元素的位置
el.click() # 点击元素
又如果是定位到可以输入信息的标签要输入就可以
# 找到输入框,输入python ==>输入回车
el = web.find_element(By.XPATH,'//*[@id="search_input"]').send_keys("python",Keys.ENTER)
***********使用selenium时必须注意: 使用时当切换到其他页面时一定要用time.sleep()缓一缓,因为你页面可能还没加载完你就执行下面的操作狠狠很有可能它就会这样: 如果不知道具体该睡多久可以这样处理:
while 1:
try:
res=web.find_element(By.XPATH,'//*[@id="repo-content-pjax-container"]//*[@class="branch"]').text
print('已定位到元素')
endtime= time.time()
break
except:
print("还未定位到元素!")
time.sleep(1)
print(res)
print('定位耗费时间:' + str(endtime-start_time))
有iframe时需要注意:
# 注意有iframe的情况也需先跳转进入iframe窗口进行爬取
web.switch_to.frame("iframe_ref")
# 要想从iframe切回来 ;
web.switch_to.default_content() 切换到原页面
在使用selenium时若打开了多个页面并且想在多个页面反复横跳可以这样:
web.switch_to.window(web.window_handles[0]) #[0]就是主网页中第一个网页
对于有下拉框的那种点击切换页面的情况可以这样:
sel_el =web.find_element(By.XPATH,'//*[@id="msgCenter"]/span[2]') # 先定位到select标签
sel =Select(sel_el) # 扔给Select
for i in range(len(sel.options)): #i就是每个下拉框索引位置
sel.select_by_index(i) # 切换选项
超级鹰的使用可以在平台是去下载源码进行使用,一看就会。
定位到验证码的xpath
img = web.find_element(By.XPATH,'/html/body/div[3]/div/div[3]/div[1]/form/div/img').screenshot_as_png
这个方法可以返回一个png格式的截图,这样就可以把图片给超级鹰识别返回验证码输入。over!
同上丢给超级鹰后返回的是需要点击地方的坐标,然后就可遍历返回的坐标,以此使用ActionChains里的事件链去点击相应位置就可以解决 ActionChains(“放入element”).move_to_element_with_offset(放入点击元素横,纵坐标) 最后还要.perform进行提交才能执行这个事件链
这类比较坑的地方就是会被服务器识别出我们不是人。。。 所以需要伪装我们
option = Options() # 防止被检验出
option.add_argument('--disable-blink-features=AutomationControlled')
web = Chrome(options=option)
伪装后就使用ActionChains里的事件链就可以解决了
ActionChains(web).drag_and_drop_by_offset(btn,300,0).perform() # btn是滑块区域,300,0就是滑块横坐标的始起点。perform提交就大功告成
这两个方法需要引入库
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.options import Options
感谢你能看到最后,给大家准备了一些福利!
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
CSDN大礼包:全网最全《Python学习资料》免费赠送!(安全链接,放心点击)
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python兼职渠道推荐*
学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
CSDN大礼包:全网最全《Python学习资料》免费赠送!(安全链接,放心点击)
若有侵权,请联系删除