上接: 第七章:异步爬虫(协程法)
下接:12306模拟登录+验证码识别+滑块验证
环境安装:
pip install selenium
下载一个浏览器的驱动程序:
from selenium import webdriver
#实例化一个浏览器对象
bro=webdriver.Chrome()
#让浏览器发起一个指定的url对应请求
bro.get('http://baidu.com')
#获取浏览器当前页面的源码数据
代码:
from selenium import webdriver
from lxml import etree
from time import sleep
#实例化一个浏览器对象
bro=webdriver.Chrome()
#让浏览器发起一个指定的url对应请求
bro.get('http://scxk.nmpa.gov.cn:81/xk/')
#获取浏览器当前页面的源码数据
page_text=bro.page_source
#解析企业名称
tree = etree.HTML(page_text)
li_list=tree.xpath('//*[@id="gzlist"]/li')
for li in li_list:
name = li.xpath('./dl/@title')[0]
print(name)
pass
#关闭浏览器
sleep(5)
bro.quit()
get(url)
find
系列的方法send_keys('xxx')
excute_script('jsCode')
back(),forward()
quit()
以在淘宝网进行搜索Iphone为例:
①定位搜索框位置
②模拟点击“搜索”的过程
③模拟鼠标滑轮滑动的过程(它的本质是一段json代码):
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome()
bro.get('https://www.taobao.com/')
#定位到搜索框+标签的交互
search_input=bro.find_element_by_id('q')
#标签的交互
search_input.send_keys('Iphone')
#执行一组js代码
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(2)
#点击搜索按钮
btn=bro.find_element_by_css_selector('.btn-search')
btn.click()
bro.get('https://baidu.com')
sleep(2)
#回退页面
bro.back()
#前进页面
bro.forward()
sleep(5)
bro.quit()
一张页面往往可以嵌套一张子页面,爬取子页面信息就可以通过iframe。
实验网址
如果定位的标签存在于iframe标签中,则必须使用switch_to.fram(id)
action = AcitonChains(bro)
click_and_hold(div)
:长按且点击操作move_by_offset(x,y)
控制滑块在左右上下移动的幅度perform()
让动作链立即执行action.release()
释放动作链对象from selenium import webdriver
from lxml import etree
from time import sleep
#导入动作链对应的类
from selenium.webdriver import ActionChains
bro = webdriver.Chrome()
bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
#如果定位的标签是存在于iframe标签中的则必须通过如下操作进行标签定位
#因为默认定位是在外部大页面从而找不到
#进行作用域切换
bro.switch_to.frame('iframeResult')
div = bro.find_element_by_id('draggable')
#一些列的动作链触发ActionChains
action=ActionChains(bro)
#点击且长按指定的标签
action.click_and_hold(div)
for i in range(5):
#move_by_offset(x,y)表示水平上下的移动
#perform()表示立即执行动作链操作
action.move_by_offset(17,0).perform()
sleep(1)
pass
#释放动作链
action.release()
print(div)
代码如下:
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome()
bro.get('https://qzone.qq.com/')
bro.switch_to.frame('login_frame')
a_tag=bro.find_element_by_id("switcher_plogin")
a_tag.click()
user_name_tag=bro.find_element_by_id('u')
password_tag=bro.find_element_by_id('p')
sleep(1)
user_name_tag.send_keys('your accout')
sleep(1)
password_tag.send_keys('password')
sleep(1)
btn=bro.find_element_by_id('login_button')
btn.click()
sleep(3)
bro.quit()
上述一些自动页面往往会弹出来显示,当我们不想看到这些页面只需要它们在后台运行时(这种行为我们称为无头浏览器),就可以用到谷歌无头浏览器相关的知识点:
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
bro = webdriver.Chrome(options=chrome_options)
# 如果没有把chromedriver加入到PATH中,就需要指明路径 executable_path='/home/chromedriver'
bro.get("https://www.baidu.com")
print(bro.page_source)
sleep(2)
bro.quit()
同样的无头浏览器还有phantomls(但它已经不更新了,主要还是用谷歌无头浏览器)。
当然正是因为提供自动化操作的板块以selenium为主,所以很多门户网站随即选择检测请求是不是selenium发出的(比如用浏览器访问淘宝等网站的参数window.navigator.webdriver的值为undefined;而使用selenium访问则该值为true),如果是就果断屏蔽,从而为了反爬衍生出新的技术:规避检测识别
只需要设置Chromedriver的启动参数即可解决问题。在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches,它的值为[‘enable-automation’],完整代码如下∶
from time import sleep
from selenium import webdriver
#实现无可视化界面
from selenium.webdriver.chrome.options import Options
#规避检测
from selenium.webdriver import ChromeOptions
#实现无可视化界面的操作
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#实现规避检测
option = ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])
#如何实现让selenium规避被检测的风险
bro = webdriver.Chrome(options=option)
#无可视化界面(无头浏览器)
bro.get("https://www.baidu.com")
print(bro.page_source)
sleep(2)
bro.quit()