一篇文章带你了解Python之Selenium自动化爬虫

Python之Selenium自动化爬虫

0.介绍

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器(2018年开发者说暂停开发,chromedriver也可以实现同样的功能)),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。

1.安装

1

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

2.下载浏览器驱动

这里用的谷歌浏览器

CNPM Binaries Mirror

查看自己的浏览器版本下载对应的驱动。

把解压后的驱动放在自己的python.exe 目录下。

3.实例

我之前写过3个实例

Python之Selenium自动化浏览器测试详解_python_脚本之家

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

4.开启无头模式

是否开启无头模式(即是否需要界面)

1

2

3

4

5

6

7

8

9

from selenium.webdriver import Chrome

from selenium.webdriver.chrome.options import Options

option = Options()  # 实例化option对象

option.add_argument("--headless"# 给option对象添加无头参数

option.headless = True #这种方式也可以

if __name__ == '__main__':

    web = Chrome(executable_path='D:\PyProject\spider\venv\Scripts\chromedriver.exe',options=option) # 指定驱动位置,否则从python解释器目录下查找.

    web.get("https://baidu.com")

    print(web.title)

5.保存页面截图

1

2

3

4

5

6

7

8

9

10

11

from selenium.webdriver import Chrome

from selenium.webdriver.chrome.options import Options

option = Options()  # 实例化option对象

option.add_argument("--headless"# 给option对象添加无头参数

if __name__ == '__main__':

    web = Chrome()

    web.maximize_window()  # 浏览器窗口最大化

    web.get("https://baidu.com")

    print(web.title)

    web.save_screenshot('baidu.png'# 保存当前网页的截图  保存到当前文件夹下

    web.close()  # 关闭当前网页

6.模拟输入和点击

1

2

3

4

5

6

7

8

9

10

11

12

13

from selenium.webdriver import Chrome

from selenium.webdriver.chrome.options import Options

option = Options()  # 实例化option对象

option.add_argument("--headless"# 给option对象添加无头参数

if __name__ == '__main__':

    web = Chrome()

    web.maximize_window()  # 浏览器窗口最大化

    web.get("https://baidu.com")

    el = web.find_element_by_id('kw')

    el.send_keys('Harris-H')

    btn = web.find_element_by_id('su')

    btn.click()

    # web.close()  # 关闭当前网页

貌似现在百度可以识别出selenium,还需要图片验证。

a.根据文本值查找节点

1

2

3

4

# 找到文本值为百度一下的节点

driver.find_element_by_link_text("百度一下")

# 根据链接包含的文本获取元素列表,模糊匹配

driver.find_elements_by_partial_link_text("度一下")

b.获取当前节点的文本

1

2

ele.text # 获取当前节点的文本

ele.get_attribute("data-click")  # 获取到属性对应的value

c.打印当前网页的一些信息

1

2

3

print(driver.page_source)  # 打印网页的源码

print(driver.get_cookies())  # 打印出网页的cookie

print(driver.current_url)  # 打印出当前网页的url

d.关闭浏览器

1

2

driver.close()  # 关闭当前网页

driver.quit()  # 直接关闭浏览器

e.模拟鼠标滚动

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

from selenium.webdriver import Chrome

import time

if __name__ == '__main__':

    driver = Chrome()

    driver.get(

        "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=78000241_12_hao_pg&wd=selenium%20js%E6%BB%91%E5%8A%A8&fenlei=256&rsv_pq=8215ec3a00127601&rsv_t=a763fm%2F7SHtPeSVYKeWnxKwKBisdp%2FBe8pVsIapxTsrlUnas7%2F7Hoo6FnDp6WsslfyiRc3iKxP2s&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=31&rsv_sug1=17&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=9266&rsv_sug4=9770")

    #  1.滚动到网页底部

    js = "document.documentElement.scrollTop=1000"

    # 执行js

    driver.execute_script(js)

    time.sleep(2)

    # 滚动到顶部

    js = "document.documentElement.scrollTop=0"

    driver.execute_script(js)  # 执行js

    time.sleep(2)

    driver.close()

7.ChromeOptions

1

2

3

4

5

6

7

8

options = webdriver.ChromeOptions()

options.add_argument("--proxy-server=http://110.52.235.176:9999") # 添加代理

options.add_argument("--headless") # 无头模式

options.add_argument("--lang=en-US") # 网页显示英语

prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2} # 禁止渲染

options.add_experimental_option("prefs", prefs)

driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe",chrome_options=options)

driver.get("http://httpbin.org/ip")

8.验证滑块移动

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

"""

目标:滑动验证码

1.定位按钮

2.按住滑块

3.滑动按钮

"""

import time

from selenium import webdriver

if __name__ == '__main__':

    chrome_obj = webdriver.Chrome()

    chrome_obj.get('https://www.helloweba.net/demo/2017/unlock/')

    # 1.定位滑动按钮

    click_obj = chrome_obj.find_element_by_xpath('//div[@class="bar1 bar"]/div[@class="slide-to-unlock-handle"]')

    # 2.按住

    # 创建一个动作链对象,参数就是浏览器对象

    action_obj = webdriver.ActionChains(chrome_obj)

    # 点击并且按住,参数就是定位的按钮

    action_obj.click_and_hold(click_obj)

    # 得到它的宽高

    size_ = click_obj.size

    width_ = 298 - size_['width'# 滑框的宽度 减去 滑块的 宽度 就是 向x轴移动的距离(向右)

    print(width_)

    # 3.定位滑动坐标

    action_obj.move_by_offset(298-width_, 0).perform()

    # 4.松开滑动

    action_obj.release()

    time.sleep(6)

    chrome_obj.quit()

9.打开多窗口和页面切换

有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到

1

2

3

4

5

6

7

8

from selenium import webdriver

if __name__ == '__main__':

    driver = webdriver.Chrome()

    driver.get("https://www.baidu.com/")

    driver.implicitly_wait(2)

    driver.execute_script("window.open('https://www.douban.com/')")

    driver.switch_to.window(driver.window_handles[1])

    print(driver.page_source)

第二个实例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

if __name__ == '__main__':

    from selenium import webdriver

    import time

    driver = webdriver.Chrome()

    start_url = 'https://www.baidu.com'

    start_url_1 = 'https://www.csdn.net'

    driver.get(start_url)

    time.sleep(5)

    """通过执行js代码,打开浏览器窗口,访问地址"""

    js = 'window.open("{}")'.format(start_url_1)

    driver.execute_script(js)

    time.sleep(5)

    """获取浏览器所有窗口:注意点:窗口的切换是通过下标控制的"""

    win = driver.window_handles

    # 执行切换

    driver.switch_to.window(win[0])

    time.sleep(2)

    driver.switch_to.window(win[1])

    time.sleep(2)

    driver.switch_to.window(win[0])

    time.sleep(2)

    driver.switch_to.window(win[1])

    # 浏览器窗口的关闭

    driver.close()

    # 退出浏览器

    driver.quit()

有时候网页会内嵌另一个html。一般称为iframe

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

from selenium import webdriver

driver = webdriver.Chrome()

start_url = 'https://mail.163.com/'

driver.get(start_url)

"""定位不成功,在有的情况是因为有页面的嵌套导致的

在一个html源码中有多个html页面,示例:一个html嵌套一个html

以上:又称之为iframe的嵌套

"""

# 定位嵌套位置iframe

el_iframe = driver.find_elements_by_tag_name('iframe')

# 执行iframe的切换

driver.switch_to.frame(el_iframe[0])

# 标签定位

driver.find_element_by_name('email').send_keys('邮箱账号')

driver.find_element_by_name('password').send_keys('你的邮箱密码')

driver.find_element_by_id('dologin').click()

10.Cookie操作

1

2

3

4

5

6

7

8

9

10

11

# 1.获取所有的cookie:

for cookie in driver.get_cookies():

    print(cookie)

# 2.根据cookie的key获取value:

value = driver.get_cookie(key)

# 3.删除所有的cookie:

driver.delete_all_cookies()

# 4.删除某个cookie:

driver.delete_cookie(key)

# 添加cookie:

driver.add_cookie({"name":"password","value":"111111"})

11.模拟登录

这里模拟登录我们学校教务处。

1

2

3

4

5

6

7

8

9

10

11

from selenium.webdriver import Chrome

if __name__ == '__main__':

    web = Chrome()

    web.get('http://bkjx.wust.edu.cn/')

    username = web.find_element_by_id('userAccount')

    username.send_keys('xxxxxxx') # 这里填自己的学号

    password = web.find_element_by_id('userPassword')

    password.send_keys('xxxxxxx') # 这里填自己的密码

    btn = web.find_element_by_xpath('//*[@id="ul1"]/li[4]/button')

    btn.click()

    # do something

因为没有滑块啥的验证,所以就很简单qwq。然后后面进行自己的操作即可。

12.使用代理

1

2

3

4

5

6

7

8

9

10

11

12

from selenium import webdriver

import time

options = webdriver.ChromeOptions()

options.add_argument('--proxy-server=http://ip地址'# 代理IP:端口号

# ${chromedriver_path}: chromedriver驱动存放路径

driver = webdriver.Chrome(options=options)

driver.get("https://dev.kdlapi.com/testproxy")

# 获取页面内容

print(driver.page_source)

# 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出

time.sleep(3)

driver.close()

14.更换UA

1

2

3

4

5

6

7

8

9

10

11

12

from selenium import webdriver

import time

agent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'

options = webdriver.ChromeOptions()

options.add_argument('--user-agent=' + agent)

# ${chromedriver_path}: chromedriver驱动存放路径

driver = webdriver.Chrome(options=options)

driver.get("https://www.baidu.com")

# 获取页面内容

print(driver.page_source)

# 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出

time.sleep(3)

15.鼠标悬停

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

if __name__ == '__main__':

    from selenium import webdriver

    from selenium.webdriver.common.action_chains import ActionChains

    driver = webdriver.Chrome()

    import time

    start_url = 'https://lceda.cn/'

    driver.get(start_url)

    # 定位到需要悬停的标签

    move = driver.find_element_by_xpath('//*[@id="headerNav"]/li[1]/a/span')

    # //*[@id="headerNav"]/li[1]/a/span

    # 悬停之后需要点击的标签

    a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[1]/div[3]/div[1]/a[2]')

    # //*[@id="headerNav"]/li[1]/div/a[2]

    # /html/body/div[1]/div[2]/div[1]/div[1]/div[1]/div/div/div[1]/ul/li[1]/div/a[2]

    # 悬停点击执行

    # 创建事件对象

    actions = ActionChains(driver)

    time.sleep(1)

    # 记录操作

    actions.move_to_element(move)

    time.sleep(1.5)

    # 悬停的点击

    actions.click(a)

    time.sleep(1)

    # 开始执行事件

    actions.perform()

16.优缺点

selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易。

selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值