1.简介

selenium可以认为是反反爬虫的最佳利器,它基本可以等同于真实的浏览器访问,用它可以加载到动态数据,也省去了cookie的操作,但是用这个有一个重大的效率问题。所以selenium可以用来爬取一些对爬虫限制很大的网站。

2.基本使用

#  -*-coding:utf8 -*-

#selenium+chromedriver获取动态数据
#selenium相当于是一个机器人。可以模拟人类在浏览器上的一些行为,比如点击,填充数据,删除cookie等。
#chromedirver是一个驱动chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver
#1.Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
#2.Firefox:https://github.com/mozilla/geckodriver/releases
#3.Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver
#4.Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/ #安装selenium
#pip3 install selenium #安装chromedriver:下载完成后,放到不需要权限的纯英文目录下即可 from selenium import webdriver driver_path=r'D:\chromedriver\chromedriver.exe'
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com')
# print(driver.page_source) import time
time.sleep(5)
#关闭页面
# driver.close() #关闭页面
# driver.quit() #退出整个浏览器

3.查找元素

#  -*-coding:utf8 -*-

from selenium import webdriver

driver_path=r'D:\chromedriver\chromedriver.exe'
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com') from selenium.webdriver.common.by import By
#定位元素
'''
1.find_element_by_id:根据id来查找某个元素
inputTag=driver.find_element_by_id('kw')
inputTag=driver.find_element(By.ID,'kw')
2.find_element_by_class_name:根据类名查找元素
submitTag=driver.find_element_by_class_name('su')
submitTag=driver.find_element(By.CLASS_NAME,'su')
3.find_element_by_name:根据name属性的值来查找元素
submitTag=driver.find_element(By.NAME,'su')
submitTag=driver.find_element_by_name('su')
4.find_element_by_tag_name:根据标签名来查找元素
submitTag=driver.find_element_by_tag_name('div')
submitTag=driver.find_element(By.TAG_NAME,'div')
5.find_element_by_xpath:根据xpath语法来获取元素
submitTag=driver.find_element_by_xpath('//div')
submitTag=driver.find_element(By.XPATH,'//div')
6.find_element_by_css_selector:根据css选择器选择元素
submitTag=driver.find_element(By.CSS_SELECTOR,'//div')
submitTag=driver.find_element_by_css_selector('//div') 每个方法都有find_element_by和find_elements_by:查找一个和查找多个的区别
'''
# inputTag=driver.find_element_by_id('kw')
# inputTag=driver.find_element_by_name('wd')
# inputTag=driver.find_element_by_class_name('s_ipt')
# inputTag=driver.find_element_by_xpath('//input[@id="kw"]')
# inputTag=driver.find_element_by_css_selector('.quickdelete-wrap > input')
inputTag=driver.find_elements_by_css_selector('.quickdelete-wrap > input')[0]
inputTag.send_keys('python') #1.如果只是想要解析网页中的数据,那么推荐将网页源代码扔给lxml来解析。因为lxml底层
#使用的是C语言,所以解析效率会更高
#2.如果是想要对元素进行一些操作,比如给一个文本输入值,或者是点击某个按钮,那么就必须使用selenuim给
#我们提供的查找元素的方法 from selenium import webdriver
from lxml import etree
from selenium.webdriver.common.by import By #使用By查找元素
driver_path='D:\chromedriver\chromedriver'
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com') inputTag=driver.find_element(By.ID,'kw')
inputTag.send_keys('python') # get_attribute('innerHTML')的方式可以获取某个元素的html
# get_attribute('outerHTML')

4.操作表单元素

#  -*-coding:utf8 -*-

# 常见的表单元素
# button
# checkbox
# select,下拉列表
# input from selenium import webdriver
from selenium.webdriver.common.by import By
import time driver_path = r'D:\chromedriver\chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)
# driver.get('https://www.baidu.com')
#
# inputTag = driver.find_element(By.ID, 'kw')
# #输入内容python
# inputTag.send_keys('python')
# time.sleep(5)
# #清除输入的内容
# inputTag.clear() #checkbox 选中
# driver.get('https://www.douban.com')
# rememberBth=driver.find_element_by_name('remember')
# rememberBth.click() #选择select
# driver.get('http://www.dobai.cn/')
from selenium.webdriver.support.ui import Select
#使用选择,要用Select先进行实例化
# selectBtn=Select(driver.find_element_by_name('jumpMenu'))
#通过索引进行选择
# selectBtn.select_by_index(1)
#通过value进行选择
# selectBtn.select_by_value('http://m.95xiu.com/')
#通过可见文本选择
# selectBtn.select_by_visible_text('95秀客户端')
#取消所有选中
# selectBtn.deselect_all() #按钮的点击事件
driver.get('https://www.baidu.com') inputTag=driver.find_element_by_id('kw')
inputTag.send_keys('python')
submitTag=driver.find_element_by_id('su')
time.sleep(5)
submitTag.click()

5.行为链

#  -*-coding:utf8 -*-

#行为链
#有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。
#行为链在爬虫中使用不是很多
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time driver_path = r'D:\chromedriver\chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com') inputTag=driver.find_element_by_id('kw')
submitBtn=driver.find_element_by_id('su') actions=ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitBtn)
actions.click()
actions.perform() #还有更多的鼠标相关的操作。
#click_and_hold(element):点击但不松开鼠标
#context_click(element):右键点击
#double_click(element):双击

6.操作cookie

#  -*-coding:utf8 -*-

#cookie操作
#1.获取所有的cookie
# driver.get_cookies()
#2.根据cookie的key获取value
# value=driver.get_cookies(key)
#3.删除所有的cookie
# driver.delete_all_cookies()
#4.删除某个cookie
# driver.delete_cookie(key) import time
from selenium import webdriver
driver_path=r'D:\chromedriver\chromedriver'
driver=webdriver.Chrome(executable_path=driver_path)
#只能获得当前网页https://www.baidu.com的所有cookie信息,并不能获取其他页面的cookie信息
driver.get('https://www.baidu.com') # for cookie in driver.get_cookies():
# print(cookie) print(driver.get_cookie('PSTM')) # driver.delete_cookie('PSTM')
# print(driver.get_cookie('PSTM')) #删除所有cookie
# driver.delete_all_cookies()

7.隐式等待和显式等待

#  -*-coding:utf8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time driver_path = r'D:\chromedriver\chromedriver'
driver = webdriver.Chrome(executable_path=driver_path) # 页面等待:
# 现在的网页越来越多采用了Ajax技术,这样程序便不能确定何时某个元素完全加载出来了。
# 如果实际页面等待时间过长导致某个dom元素还没出来,但是代码直接使用了这个webElement,
# 那么就会抛出NullPointer的异常。为了解决这个问题,所以Selenium提供了
# 两种等待方式:一种是隐式等待、一种是显式等待 # 1.隐式等待:调用driver.implicitly_wait。那么在获取不可用的元素之前,会先等待10秒
driver.get('https://www.douban.com/')
#不设置等待时间,马上报错
# driver.find_element_by_id('shdiasjdsdas')
#设置等待时间
# driver.implicitly_wait(20)
# driver.find_element_by_id('shdiasjdsdas')#等待20s才报错 # 2.显式等待:显式等待是表名某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个
#显示等待更加智能一点
# 最大的时间,如果超过这个时间那么就抛出一个异常
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
#后面可以接一个条件
# WebDriverWait(driver,10).until(
# #某个元素加载完成,只能传一个参数.所以以一个元组传进去
# EC.presence_of_element_located((By.ID,'asdasdasdasda'))
# ) #如果能获取的话,则不会等待10s
element=WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.ID,'anony-book'))
)
print(element)

8.打开多窗口和切换窗口

#  -*-coding:utf8 -*-

#切换页面:
#有时候窗口中有很多子tab页面,这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window
#来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到 from selenium import webdriver
import time driver_path = r'D:\chromedriver\chromedriver'
driver = webdriver.Chrome(executable_path=driver_path) driver.get('https://www.baidu.com')
#又打开一个豆瓣页面
driver.execute_script("window.open('https://www.douban.com')")
#但是打印当前所在网页的话,显示还是百度,要去豆瓣页面的话,需要进行切换
print(driver.current_url) #switch_to_window来进行切换页面
#要切换页面首先要拿到窗口句柄,driver每打开一个页面,会有一个句柄
#放在wind_handles里
# print(driver.window_handles)
driver.switch_to.window(driver.window_handles[1])
print(driver.current_url)

9.使用代理

#  -*-coding:utf8 -*-

#设置代理ip:
#有时候频繁爬取一些网页,服务器发现你是爬虫后会封掉你的ip地址。这时我们可以更换代理ip。
from selenium import webdriver options=webdriver.ChromeOptions()
options.add_argument('--proxy-server=http://113.124.87.163:9999')
driver_path = r'D:\chromedriver\chromedriver'
driver=webdriver.Chrome(executable_path=driver_path,chrome_options=options)
driver.get('http://httpbin.org/ip')

10.补充

#  -*-coding:utf8 -*-

from selenium import webdriver
from selenium.webdriver.remote.webdriver import WebElement
driver_path = r'D:\chromedriver\chromedriver'
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com') submitBtn=driver.find_element_by_id('su')
# print(type(submitBtn))
print(submitBtn.get_attribute('value'))
driver.save_screenshot('baidu.png')#保存屏幕截图

11.实战:爬取拉勾网

#  -*-coding:utf8 -*-
import re
import requests
import time
from lxml import etree headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36',
'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
'Cookie':'JSESSIONID=ABAAABAAAGFABEFFA5F21EB50BF5A6DCE619C8EEA6CB14A; SEARCH_ID=1146364cc73d498abea7c5b4dde4c1e3; user_trace_token=20190417144437-71ba273c-c709-43be-ae40-d1c531c2a4d7; X_HTTP_TOKEN=42daf4b72327b2817743845551bf5e71415983ed09'
} #拉勾设置了反爬机制,每次cookie都会变,该怎么做?后面再学
def request_list_page():
url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
data = {
'first': False,
'pn': 1,
'kd': 'python'
}
for x in range(1, 14):
data['pn'] = x
response = requests.post(url, headers=headers, data=data)
result = response.json()
positions = result['content']['positionResult']['result']
for position in positions:
positionId = position['positionId']
position_url = 'http://www.lagou.com/jobs/%s.html' % positionId
parse_position_detail(position_url)
break
break
# print(response.json())
# json方法,如果返回来的是json数据,这个方法会自动load成字典 def parse_position_detail(url):
response = requests.get(url, headers=headers)
text = response.text
html = etree.HTML(text)
position_name = html.xpath('//span[@class="name"]/text()')[0]
job_request_spans = html.xpath('//dd[@class="job_request"]//span')
salary_span = job_request_spans[0]
salary = salary_span.xpath('.//text()')[0].strip()
city = job_request_spans[1].xpath('.//text()')[0].strip()
city = re.sub(r'[\s/]', '', city, re.S)
work_years = job_request_spans[2].xpath('.//text()')[0].strip()
work_years = re.sub(r'[\s/]', '', work_years, re.S)
education = job_request_spans[3].xpath('.//text()')[0].strip()
education = re.sub(r'[\s/]', '', education, re.S)
desc = "".join(html.xpath("//dd[@class='job_bt']//text()")).strip()
position={
'position_name':position_name,
'salary':salary,
'city':city,
'work_years':work_years,
'education':education,
'desc':desc,
}
print(position) def main():
request_list_page() if __name__ == '__main__':
main()

12.实战:爬取拉勾网

#  -*-coding:utf8 -*-
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from lxml import etree
from selenium.webdriver.common.by import By
import re
import time class LagouSpider(object):
driver_path = r'D:\chromedriver\chromedriver' def __init__(self):
self.driver = webdriver.Chrome(executable_path=LagouSpider.driver_path)
self.url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
self.positions = [] def run(self):
self.driver.get(self.url)
while True:
# self.driver.page_source拿到的是整个网页源代码信息,ajax请求的数据也能看到
source = self.driver.page_source
WebDriverWait(driver=self.driver, timeout=10).until(
#这个等待加载的XPATH不要加text(),否则会异常
EC.presence_of_element_located((By.XPATH, '//div[@class="pager_container"]/span[last()]'))
)
self.parse_list_page(source)
try:
# 一页爬完后,点击下一页,继续爬取
next_btn = self.driver.find_element_by_xpath('//div[@class="pager_container"]/span[last()]')
# 判断一下,下一页是否可以点击,因为最后一页的时候,下一页是无法点击的
if "pager_next_disabled" in next_btn.get_attribute('class'):
pass
else:
next_btn.click()
time.sleep(7)
except Exception:
print(source) def parse_list_page(self, source):
html = etree.HTML(source)
links = html.xpath('//a[@class="position_link"]/@href')
for link in links:
# 当前的页面一个一个的请求
# 设置请求频率
self.request_detail_page(link)
time.sleep(10) def request_detail_page(self, url):
# 切换窗口,打开新的页面
self.driver.execute_script("window.open('%s')" % url)
# 切换到新的窗口上去
self.driver.switch_to.window(self.driver.window_handles[1])
source = self.driver.page_source
WebDriverWait(self.driver, timeout=10).until(
EC.presence_of_element_located((By.XPATH, '//span[@class="name"]'))
)
self.parse_detail_page(source)
# close()是关闭当前页面
self.driver.close()
# 切换回职位列表页
self.driver.switch_to.window(self.driver.window_handles[0]) def parse_detail_page(self, source):
html = etree.HTML(source)
position_name = html.xpath('//span[@class="name"]/text()')[0]
job_request_spans = html.xpath('//dd[@class="job_request"]//span')
salary_span = job_request_spans[0]
salary = salary_span.xpath('.//text()')[0].strip()
city = job_request_spans[1].xpath('.//text()')[0].strip()
city = re.sub(r'[\s/]', '', city, re.S)
work_years = job_request_spans[2].xpath('.//text()')[0].strip()
work_years = re.sub(r'[\s/]', '', work_years, re.S)
education = job_request_spans[3].xpath('.//text()')[0].strip()
education = re.sub(r'[\s/]', '', education, re.S)
desc = "".join(html.xpath("//dd[@class='job_bt']//text()")).strip()
company_name=html.xpath("//h2[@class='fl']/text()")[0].strip()
position = {
'name': position_name,
'company_name':company_name,
'salary': salary,
'city': city,
'work_years': work_years,
'education': education,
'desc': desc
}
self.positions.append(position)
print(position)
print('=' * 40) if __name__ == '__main__':
spider = LagouSpider()
spider.run()
print(spider.positions)

selenium的的更多相关文章

  1. Python爬虫小白入门(四)PhatomJS+Selenium第一篇

    一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...

  2. Selenium的PO模式(Page Object Model)[python版]

     Page Object Model 简称POM  普通的测试用例代码: .... #测试用例 def test_login_mail(self): driver = self.driver driv ...

  3. selenium元素定位篇

    Selenium webdriver是完全模拟用户在对浏览器进行操作,所有用户都是在页面进行的单击.双击.输入.滚动等操作,而webdriver也是一样,所以需要我们指定元素让webdriver进行单 ...

  4. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  5. 幼儿园的 selenium

    from selenium import webdriver     *固定开头     b=webdriver.Firefox()              *打开火狐浏览器    browser. ...

  6. 使用selenium编写脚本常见问题(一)

    前提:我用selenium IDE录制脚本,我用java写的脚本,如果大家想看的清楚明白推荐java/Junit4/Webdriver 我用的是java/TestNG/remote control 1 ...

  7. 关于selenium RC的脚本开发

    第一.需要录制脚本,找个我也不说了.就是在firefox下下载一个selenium-IDE并且安装. 第二.在工具里找到selenium-IDE点击运行. 第三.默认是红色按钮点击状态的,接下来随便你 ...

  8. 基于python的selenium自动化测试环境安装

    1. Python2安装 官方网站:https://www.python.org/downloads/ (python3或新版本已经默认集成了pip包和path,安装的时候打勾就行,可以直接跳过下面第 ...

  9. Selenium+python 配置

    1. 安装python, www.python.org. 下载最新的python,应该是32位的.注意配置环境变量. 2. 安装PIP(pip是一个以Python计算机程序语言写成的软件包管理系统). ...

  10. selenium 使用action进行鼠标,键盘操作

    <!--test.html--> <html> <head> <title>Set Timeout</title> <script&g ...

随机推荐

  1. sprd测试系统跑vts

    android 8.1版本上google新增vts测试,主要针对测试vendor接口, 在sprd ctest系统中,需要注意: 1. 以同一个账号登录ctest远程站点,和本地ctest客户端 2. ...

  2. svn"database disk image is malformed"错误解决

    本文是svn出现类似如下问题的两种解决方案. svn: E200030: database disk image is malformed 一.最简单的方法,复制其它人的.svn/wc.db替换. 二 ...

  3. Centos6.10源码部署zabbix-3.2.6

    环境:Centos6.10   已有lnmp环境  mysql5.7  php7.2 创建zabbix数据库 mysql> create database zabbix character se ...

  4. windows环境jprofiler配置监控tomcat

    1.点击jprofiler/bin/jprofiler.exe文件安装 2.安装后将C:\Users\Administrator\.jprofiler8\config.xml文件复制到指定文件下,如: ...

  5. MySql+EF <二>

    C#使用Mysql+EF架构项目有一系列问题. 一.EF没有Mysql的驱动,这个需要自己安装2个插件 ①mysql-connector-net-6.9.10.msi ②mysql-for-visua ...

  6. Java Spring Boot VS .NetCore (十一)自定义标签 Java Tag Freemarker VS .NetCore Tag TagHelper

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  7. numpy创建array【老鱼学numpy】

    在上一篇文章中,我们已经看到了如何通过numpy创建numpy中的数组,这里再重复一下: import numpy as np # 数组 a = [[1, 2, 3], [4, 5, 6]] prin ...

  8. matplotlib图例-【老鱼学matplotlib】

    图例是啥,直接上图就知道了: 怎么创建上面的图例呢? 很简单,首先在plt.plot()函数中设置label文本属性,然后调用plt.legend()生成图例就可以了,完整的代码如下: import ...

  9. ubuntu创建新用户

    ubuntu和windows一样,可以任意创建或者删除新的用户,windows下比较简单,ubuntu下需要使用命令,不过操作起来不是很繁琐,所以我尽量写的详细一些.  如何创建ubuntu新用户? ...

  10. S0.0 计算机如何看东西

    标签(空格分隔):数字图像处理 opencv 当我们用特定软件打开一张图片或者更改某些位图的格式为txt时,就会发现图像的本质不过就是一堆数据罢了. 采样 我们可以用相机采样到一幅二维图像,图像的分辨 ...