selinum介绍与实践

介绍

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 。
selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器

安装

1.pip install selenium
2.安装浏览器对应版本的driver
chrome:https://liushilive.github.io/github_selenium_drivers/md/Chrome.html,chromedriver下载之后解压,然后把chromedriver驱动添加到python安装路径下的scripts文件夹里面,这样chromedriver就添加到了环境变量里面

检验:成功
在这里插入图片描述

(版本在浏览器设置可查看)
否则可能报错Message: ‘chromedriver’ executable needs to be in PATH

Selenium支持PhantomJS,这样在运行的时候就不会再弹出一个浏览器了。而且PhantomJS的运行效率也很高,还支持各种参数配置。但是有些网站不支持它
PhantomJS安装参考

录制生产脚本

浏览器添加插件selenium IDE
参考:https://zhuanlan.zhihu.com/p/137206279

使用Selenium IDE录制脚本## 编码

引包

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.proxy import ProxyType, Proxy
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

获取driver

chrome
webdriver隐藏:https://www.cnblogs.com/presleyren/p/12936553.html

options = webdriver.ChromeOptions()
options.add_argument(argument='headless')  # 设置无界面,可选,使用无头模式会验证失败
options.add_argument(
    'user-agent='+current_ua)
# 解决访问Https时不受信任SSL证书问题
options.add_argument(
    "service_args=['–ignore-ssl-errors=true', '–ssl-protocol=TLSv1']")  # Python2/3
options.add_argument("--single-process")  # 单进程运行Google Chrome
options.add_argument("--no-sandbox")  # bypass OS security model
options.add_argument(
    "--disable-dev-shm-usage")  # overcome limited resource
options.add_experimental_option("excludeSwitches",
                                ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")
# options.add_argument("--proxy-server=http://110.73.2.248:8123")

driver = webdriver.Chrome(options=options)
# selenium的反爬虫策略 让 Chrome 刚刚打开每一个页面,还没有运行网站自带的 JavaScript代码时,就先执行我们给定的这段代码。
# window.navigator.webdriver true被检测到爬虫
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
                            Object.defineProperty(navigator, 'webdriver', {
                              get: () => false
                            })
                          """
})

firefox

options = webdriver.FirefoxOptions()
options.add_argument('user-agent='+current_ua)
options.add_argument('-headless')
profile = webdriver.FirefoxProfile()
profile.set_preference("dom.webdriver.enabled", False)
proxy = Proxy({
        'proxyType': ProxyType.MANUAL,
        'httpProxy': socket,
        'ftpProxy': socket,
        'sslProxy': socket,
        'noProxy': '',
    })

profile.set_proxy(proxy)
driver = webdriver.Firefox(options=options, firefox_profile=profile)


跳转页面

driver.get(url)

选择器使用方法

find_element_by_xpath()使用的几种方法

# 1、find_element_by_link_text  通过链接文本去找
# 根据登录
send_tag = driver.find_element_by_link_text('登录')
send_tag.click()

# 2、find_element_by_partial_link_text 通过局部文本查找a标签
login_button = driver.find_element_by_partial_link_text('登')
login_button.click()
time.sleep(1)

# 3、find_element_by_class_name 根据class属性名查找
login_tag = driver.find_element_by_class_name('tang-pass-footerBarULogin')
login_tag.click()
time.sleep(1)

# 4、find_element_by_name 根据name属性查找
username = driver.find_element_by_name('userName')
username.send_keys('15622792660')
time.sleep(1)

# 5、find_element_by_id 通过id属性名查找
password = driver.find_element_by_id('TANGRAM__PSP_10__password')
password.send_keys('*******')
time.sleep(1)

# 6、find_element_by_css_selector  根据属性选择器查找
# 根据id查找登录按钮
login_submit = driver.find_element_by_css_selector('#TANGRAM__PSP_10__submit')
# driver.find_element_by_css_selector('.pass-button-submit')
login_submit.click()

# 7、find_element_by_tag_name  根据标签名称查找标签
div = driver.find_element_by_tag_name('div')
print(div.tag_name)
#获取属性
browser.find_element_by_xpath("//div[@class='***']/img").get_attribute("src") # 图像.get_property(“href”)
#定位获取值
browser.find_element_by_xpath("//div[@class='***']/p[1]/span[2]").text
# last()  最后一个节点数

browser.find_element_by_xpath(".//*[@id='select2-drop']/ul/li[last()]).text     # last()是代表最后一个li。可以运算last()-3

等待元素加载

close_button = WebDriverWait(driver, 30).until(
    EC.presence_of_element_located((By.XPATH,close_button_xpath ))
)
ActionChains(driver).move_to_element(close_button).click().perform()

在这里插入图片描述

页面滚动条滑动

参考:python+selenium页面自动化 元素定位实际遇到的各种问题(持续更新)

driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")  # 将页面滚动条滑到底部
driver.execute_script("arguments[0].scrollIntoView();", el)  # 向下滑动滚动条,跳转到目标元素处
driver.execute_script("arguments[0].scrollIntoView(false);", el)  # 向上滑动滚动条,跳转到目标元素处

弹出框

python如何爬取弹出框的内容_python上selenium的弹框操作实现
弹框类型自见解分为四种:

1,页面弹框

2,警告提示框(alert)

3,确认消息框(confirm)

4,提示消息对话(prompt)

#获取警告框,赋予变量名

alert=driver.switch_to.alert

#获取消息框文本在控制台打印

print(alert.text)

alert.accept() #关闭框操作 接受弹框

alert.dismiss() #关闭框操作 取消弹框

验证码识别

参考:https://www.cnblogs.com/zrmw/p/9367188.html

b.switch_to.frame('iframeResult')
sou = b.find_element_by_css_selector('#draggable')
tar = b.find_element_by_css_selector('#droppable')
actions = ActionChains(b)
actions.drag_and_drop(sou, tar)
actions.perform()

获取div节点下li的节点个数

法一:

num=self.driver.execute_script("return $('.jspPane').find('li').length;") # JQuery写法 , 要加上return 才能获取js执行的值!!!

法二:

num=self.driver.execute_script('return document.getElementsByClassName("jspContainer")[0].getElementsByTagName("li").length;') #DOM写法

参考:https://www.cnblogs.com/lweiser/p/11045023.html

获取表格

html = driver.page_source
tables = pd.read_html(html) //返回一个List,里面封装的是Dataframe
//tables = pd.read_html(url) //如果是静态网站可以直接通过url搞定
print(tables[0]) 

xpath

语法可参考:https://www.w3school.com.cn/xpath/xpath_syntax.asp

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行查找。,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
  
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

路径表达式:
在这里插入图片描述

chrome控制台使用xpath:$x(xpath表达式)

$x("//div[@id='Editor_Edit']/div/span/text()")[0]

linux部署

参考:

1.安装selenium

pip install selenium

2.安装 chrome
下载https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
yum install google-chrome-stable

3.安装chrome driver
google-chrome --version 查看版本

查看版本和对应driver版本https://liushilive.github.io/github_selenium_drivers/md/Chrome.html (windows driver下载)

http://chromedriver.storage.googleapis.com/index.html (备用)
http://npm.taobao.org/mirrors/chromedriver/2.41/chromedriver_linux64.zip (备用)

4.报错
运行selenium得时候没有找到驱动

selenium.common.exceptions.WebDriverException: Message: ‘chromedriver’ executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

指定驱动器位置

browser = webdriver.Chrome('PATH')

user agent

from fake_useragent import UserAgent
ua = UserAgent(use_cache_server=False,verify_ssl=False)
{"User-Agent":random.choice(['Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6',
    'Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)',
    'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20',
    'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6',
    'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)',
    'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.3 Mobile/14E277 Safari/603.1.30',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'])

实践

登录实践

from selenium import webdriver
from selenium.webdriver import ActionChains, DesiredCapabilities
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
import json


caps = DesiredCapabilities.CHROME
caps['goog:loggingPrefs'] = {'performance': 'ALL'}#
browser=webdriver.Chrome(desired_capabilities=caps)


#隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
browser.implicitly_wait(10)

browser.get('https://***/#/login')

elem=browser.find_element_by_name("userAccount")#账号
elem.clear()
elem.send_keys("***")
elem=browser.find_element_by_name("password")#密码
elem.clear()
elem.send_keys("***")
elem=browser.find_element_by_name("verify_code")#验证码
elem.clear()
verify_code = ""
elem.send_keys(verify_code)#debug,然后重新给verify_code 赋值
browser.find_element_by_class_name("btn").click() #登录
browser.get('https://***/#/indexContent')#要访问的主页
browser_root = browser.current_window_handle

#不断跳转下一页,直到没有数据
while True:
    print(browser.page_source)#打印页面源代码
    browser.find_element_by_class_name("pagination-next").click() #下一页
    if elem.text.find("未找到")!=-1:
        break
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值