Python-Selenium自动化爬虫

作者:Harris-H??? 时间:2021-04-04 10:55:39 

简单介绍:

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

1.安装

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

2.下载浏览器驱动

这里用的谷歌浏览器

http://npm.taobao.org/mirrors/chromedriver/

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

Python-Selenium自动化爬虫

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

3.实例

3.1下载对应版本的浏览器驱动

http://npm.taobao.org/mirrors/chromedriver/

Python-Selenium自动化爬虫

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

Python-Selenium自动化爬虫

3.2测试code,打开一个网页,并获取网页的标题

from selenium.webdriver import Chrome

if __name__ == '__main__':
    web = Chrome()
    web.get("https://baidu.com")
    print(web.title)

Python-Selenium自动化爬虫

3.3一个小样例

from selenium.webdriver import Chrome

if __name__ == '__main__':
    web = Chrome()
    url = 'https://ac.nowcoder.com/acm/home'
    web.get(url)
    # 获取要点击的a标签
    el = web.find_element_by_xpath('/html/body/div/div[3]/div[1]/div[1]/div[1]/div/a')
    # 点击
    el.click()                          # "/html/body/div/div[3]/div[1]/div[2]/div[2]/div[2]/div[1]/h4/a"
    # 爬取想要的内容
    lists = web.find_elements_by_xpath("/html/body/div/div[3]/div[1]/div[2]/div[@class='platform-item js-item ']/div["
                                       "2]/div[1]/h4/a")
    print(len(lists))
    for i in lists:
        print(i.text)

3.4自动输入并跳转

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import time

if __name__ == '__main__':
    web = Chrome()
    url = 'https://ac.nowcoder.com/acm/home'
    web.get(url)

    el = web.find_element_by_xpath('/html/body/div/div[3]/div[1]/div[1]/div[1]/div/a')

    el.click()
    time.sleep(1)
    input_el = web.find_element_by_xpath('/html/body/div/div[3]/div[1]/div[1]/div[1]/form/input[1]')
    input_el.send_keys('牛客', Keys.ENTER)
    # do something

4.开启无头模式

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

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(executable_path='D:\PyProject\spider\venv\Scripts\chromedriver.exe',options=option) # 指定驱动位置,否则从python解释器目录下查找.
    web.get("https://baidu.com")
    print(web.title)

5.保存页面截图

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.模拟输入和点击

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,还需要图片验证。

6.1根据文本值查找节点

# 找到文本值为百度一下的节点
driver.find_element_by_link_text("百度一下") 
# 根据链接包含的文本获取元素列表,模糊匹配
driver.find_elements_by_partial_link_text("度一下") 

6.2获取当前节点的文本

ele.text # 获取当前节点的文本
ele.get_attribute("data-click")  # 获取到属性对应的value

6.3打印当前网页的一些信息

print(driver.page_source)  # 打印网页的源码
print(driver.get_cookies())  # 打印出网页的cookie
print(driver.current_url)  # 打印出当前网页的url

6.4关闭浏览器driver.close()  # 关闭当前网页

driver.close()  # 关闭当前网页
driver.quit()  # 直接关闭浏览器

6.5模拟鼠标滚动

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

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.滑动按钮

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中找到

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)
 

10.Cookie操作

# 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.模拟登录

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

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.优缺点

selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易。
selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用。

来源:https://blog.csdn.net/weixin_45750972/article/details/122611986

标签:Python,Selenium,自动化,爬虫
0
投稿

猜你喜欢

  • JavaScript实现图片放大预览效果

    2023-08-23 02:41:17
  • python3 scrapy框架的执行流程

    2022-04-12 08:53:35
  • python人工智能tensorflow常见损失函数LOSS汇总

    2023-11-22 18:12:48
  • 浅谈Python中的全局锁(GIL)问题

    2021-10-11 04:16:15
  • sql语句查询重复的数据(最新推荐)

    2024-01-13 08:01:23
  • javascript开发中使用onpropertychange,oninput事件解决onchange事件的不足

    2024-04-26 17:14:12
  • golang之数据验证validator的实现

    2024-04-26 17:36:03
  • PyTorch中torch.matmul()函数常见用法总结

    2023-03-28 16:01:31
  • Perl中chomp和chop的区别介绍

    2023-12-03 18:09:43
  • 语义化的HTML与搜索引擎优化(如何编写纯语义的HTML进行搜索引擎优化)

    2009-12-28 12:42:00
  • SPSS连接mysql数据库的超详细操作教程

    2024-01-21 13:49:25
  • 自动定时备份sqlserver数据库的方法

    2011-11-03 17:28:17
  • js断点调试经验分享

    2023-08-15 06:19:09
  • 给Python入门者的一些编程建议

    2023-09-24 03:22:13
  • tp5递归 无限级分类详解

    2024-05-11 09:53:48
  • Python爬虫简单运用爬取代理IP的实现

    2021-08-25 23:26:42
  • Python2.7简单连接与操作MySQL的方法

    2024-01-25 18:38:56
  • Python实现自动签到脚本功能

    2022-07-24 21:53:40
  • Go实现用户每日限额的方法(例一天只能领三次福利)

    2024-05-22 10:20:09
  • MSSQL基本语法及实例操作语句

    2024-01-28 06:45:16
  • asp之家 网络编程 m.aspxhome.com