爬虫
前言(使用场景)
我们在抓取⼀些普通⽹⻚的时候requests基本上是可以满⾜的. 但是,
如果遇到⼀些特殊的⽹站. 它的数据是经过加密的. 但是呢, 浏览器却
能够正常显示出来. 那我们通过requests抓取到的内容可能就不是我
们想要的结果了.
一、前期准备工作
使用selenium前需要安装浏览器相应版本的驱动并移动到python解释器的目录下
下载链接 http://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标题.
案例:
利用抓包工具可以定位想要标签的xpath
然后利用
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) # 切换选项
使用selenium利用验证码识别平台(超级鹰)进行各种类型验证码验证:
超级鹰的使用可以在平台是去下载源码进行使用,一看就会。
验证根据图像识别验证码输入类:
定位到验证码的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