前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Selenium自动化爬虫

Selenium自动化爬虫

作者头像
北山啦
发布2022-11-27 13:02:17
1.2K0
发布2022-11-27 13:02:17
举报
文章被收录于专栏:北山啦的博客

Python爬虫入门之 Selenium自动化爬虫

Selenium官方文档

在这里插入图片描述
在这里插入图片描述

1. Selenium的安装配置

代码语言:javascript
复制
pip install selenium

selenium配置

2. 基本请求

代码语言:javascript
复制
from selenium import webdriver

# 创建实例 
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.xxx()

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

# 请求百度首页
browser.get("https://movie.douban.com/top250") 

# 关闭当前页面
browser.close()
# 退出浏览器
browser.quit()

3. 常用操作

浏览器方法

浏览器方法

作用

browser.get(url)

请求url

browser.quit()

关闭浏览器

browser.close()

关闭当前页面

browser.page_source

获取源码

browser.page_source.find(‘keyword’)

在源码中查找

browser.maximize_window() - 浏览器窗口最大化

窗口最大化

节点操作:

节点操作

作用

node.send_keys(’’)

在文本框填写内容

node.click()

点击

node.get_attribute(‘href/id/name’)

获取节点属性

node.text

获取节点文本

3.1 获取cookie

代码语言:javascript
复制
browser.get_cookies()

3.2 获取url

代码语言:javascript
复制
browser.current_url

3.3 获取源码

代码语言:javascript
复制
browser.page_source

3.4 切换Frame

Selenium 打开页面后,默认是在父级 Frame 里面操作,如果页面中还有子 Frame,Selenium 是不能获取到子 Frame 里面的节点的。这时就需要使用 switch_to.frame 方法来切换 Frame。

示例如下:

  • 这个在网易云音乐下载和模拟QQ邮箱登录的案例中会讲到。
代码语言:javascript
复制
browser.switch_to_frame('id name')

4. 查找节点

4.1 单个节点

做一个展示:

有多种方式,深入的方法可以通过官方文档进行系统的学习。

代码语言:javascript
复制
# 根据name值查找
find_element_by_name('sunrisecai')
# 根据id值查找
find_element_by_id('sunrisecai')
# 根据xpath查找
find_element_by_xpath('sunrisecai')
# 根据CSS选择器查找
find_element_by_css_selector('sunrisecai')

等价:

find_element(),里面填写需要查找的节点即可。

代码语言:javascript
复制
from selenium.webdriver.common.by import By

# 根据name值查找
find_element(By.NAME,'sunrisecai')
# 根据id值查找
find_element(By.ID,'sunrisecai')
# 根据xpath查找
find_element(By.XPATH,'sunrisecai')
# 根据CSS选择器查找
find_element(By.CSS_SELECTOR,'sunrisecai')

4.2 多个节点

单个节点与多个节点的区别如下所示:

节点

区别

区别

单个节点

find_element

find_element_by_xxx

多个节点

find_elements

find_elements_by_xxx

可以看到基本上是一致的,不同点在于多个节点的element多了一个s,即elements。

5. 模拟填写表单、点击等

填写表单:

代码语言:javascript
复制
# 首先定位到文本框
text_box = browser.find_element_by_xpath('xxx')

# 清空文本框
text_box.clear()

# 输入文字
text_box.send_keys('xxx')

模拟点击:

代码语言:javascript
复制
# 点击搜索
browser.find_element_by_xpath('xxx').click()

5.1 模拟登录Python Tip

登录Python Tip:http://www.pythontip.com/user/login

代码语言:javascript
复制
from selenium import webdriver

url = "http://www.pythontip.com/user/login"

# 实例化浏览器
browser = webdriver.Chrome()
# 最大化窗口
browser.maximize_window() 
# 请求网页
browser.get(url) 

# 输入账号密码
browser.find_element_by_xpath('//*[@id="editor_name"]').send_keys('PythonXC')
browser.find_element_by_xpath('//*[@id="editor_pwd"]').send_keys('pythonxiaocai')
# 点击登录
browser.find_element_by_xpath('//*[@id="apLogin"]/fieldset/div[3]/input').click()

6. 执行Js

页面进度条下拉操作:

  • 京东商城的爬取案例中会用到
代码语言:javascript
复制
browser.execute_script( 'window.scrollTo(0,document.body.scrollHeight)')

7. 隐式等待 和 显式等待

在使用Selenium访问网页的过程中,有时候需要等待网页的加载,所以有时候就需要延时等待一定的实践,确保网页里你需要的内容都加载出来。

7.1 隐式等待

当使用隐式等待执行测试的时候,如果 Selenium 没有在 DOM 中找到节点,将继续等待,超出设定时间后,则抛出找不到节点的异常。

这里用 implicitly_wait 方法实现隐式等待。

示例如下:

代码语言:javascript
复制
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


class JdSpider(object):
    def __init__(self):
        self.url = 'https://www.jd.com/' 
        self.browser = webdriver.Chrome()
        # 隐式等待
        # self.browser.implicitly_wait(10) 


    def get_page(self):
        self.browser.get(self.url)
        self.browser.find_element_by_xpath('//*[@id="key"]').send_keys('爬虫书籍')
        self.browser.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click()
   
		# 常规等待
    	# time.sleep(5)
        next_button = self.browser.find_element_by_class_name('pn-next')
        next_button.click()
        
    def main(self):
        self.get_page()


spider= JdSpider()
spider.main()

7.2 显式等待

指定要查找的节点,再指定一个最长等待时间。如果在指定时间内加载出来了这个节点,就返回查找的节点;如果到了指定时间没有加载出该节点,则抛出超时异常。

示例如下:

代码语言:javascript
复制
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


class JdSpider(object):
    def __init__(self):
        self.url = 'https://www.jd.com/' 
        self.browser = webdriver.Chrome()
        self.wait = WebDriverWait(self.browser,10)
        # 隐式等待
        # self.browser.implicitly_wait(10) 


    def get_page(self):
        self.browser.get(self.url)
        self.browser.find_element_by_xpath('//*[@id="key"]').send_keys('爬虫书籍')
        self.browser.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click()
        
        # 常规等待
        # time.sleep(5)
        # next_button = self.browser.find_element_by_class_name('pn-next')
        # next_button.click()
        
        # 显式等待
        next_button=self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,'pn-next')))
        next_button.click()

    def main(self):
        self.get_page()


spider= JdSpider()
spider.main()

8. 防止Selenium被屏蔽

代码语言:javascript
复制
from selenium import webdriver
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Chrome(options=option)
# 关闭自动化扩展信息
option.add_experimental_option('useAutomationExtension',False)

browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',{'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefined})'})
browser.get('https://antispider1.scrape.cuiqingcai.com/')

Boss直聘案例展示:

代码语言:javascript
复制
from selenium import webdriver
from selenium.webdriver import ChromeOptions


option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Chrome(options=option)

# 关闭自动化扩展信息
# option.add_experimental_option('useAutomationExtension',False)

# browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',{'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefined})'})

url = 'https://www.zhipin.com/'
browser.get(url)


# 输入职位
browser.find_element_by_xpath('//*[@id="wrap"]/div[4]/div/div/div[1]/form/div[2]/p/input').send_keys('Python')
# 点击搜索
browser.find_element_by_xpath('//*[@id="wrap"]/div[4]/div/div/div[1]/form/button').click()

9. 无头模式

如果你觉得每次运行代码弹出来的浏览器窗口太烦人,那么不妨试一下Selenium的无头模式,即不会弹出浏览器窗口。

代码语言:javascript
复制
from selenium import webdriver
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_argument('--headless')
browser = webdriver.Chrome(options=option)

url = 'https://www.baidu.com'
browser.get(url)
browser.save_screenshot('baidu.png')

10. 案例讲解

10.1 模拟豆瓣登录

  • QQ邮箱登录的操作是一致的。
代码语言:javascript
复制
from selenium import webdriver

url = 'https://www.douban.com/'
browser = webdriver.Chrome()
browser.get(url)

# 切换到frame
frame_node = browser.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe')
browser.switch_to.frame(frame_node)

# 选择密码登录
browser.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()
# 输入账号密码
browser.find_element_by_xpath('//*[@id="username"]').send_keys('18306658370')
browser.find_element_by_xpath('//*[@id="password"]').send_keys('db@1234')
# 点击登录
browser.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[5]/a').click()

10.2 网易云音乐下载

搜索链接:

代码语言:javascript
复制
search_url = 'https://music.163.com/#/search/m/?s={}'

网易云音乐API:

代码语言:javascript
复制
api_url = 'http://music.163.com/song/media/outer/url?id={}'
10.2.1 下载音乐
代码语言:javascript
复制
import requests
resp = requests.get(url,headers=headers)
with open('xxx.mp3','wb') as f:
    f.write(resp.content)
10.2.2 获取歌曲ID
  1. 获取源码,歌曲的ID在源码里边
  2. 从源码中提取歌曲id歌曲名称歌手
代码语言:javascript
复制
import re

# 切换到g_iframe页面
browser.switch_to_frame("g_iframe")
html = browser.page_source

# 正则提取歌曲信息
song_id = re.findall('a href="/song\?id=(.*?)"', html)
song_name = re.findall(('<b title="(.*?)"'), html)
singer = re.findall('span class="s-fc7">(.*?)</span>', html)

for id, name, singer in zip(song_id, song_name, singer):
    print(id,name,singer)

到这里就结束了,如果对你有帮助,欢迎点赞关注评论,你的点赞对我很重要

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python爬虫入门之 Selenium自动化爬虫
    • 1. Selenium的安装配置
      • 2. 基本请求
        • 3. 常用操作
          • 3.1 获取cookie
          • 3.2 获取url
          • 3.3 获取源码
          • 3.4 切换Frame
        • 4. 查找节点
          • 4.1 单个节点
          • 4.2 多个节点
        • 5. 模拟填写表单、点击等
          • 5.1 模拟登录Python Tip
        • 6. 执行Js
          • 7. 隐式等待 和 显式等待
            • 7.1 隐式等待
            • 7.2 显式等待
          • 8. 防止Selenium被屏蔽
            • 9. 无头模式
              • 10. 案例讲解
                • 10.1 模拟豆瓣登录
                • 10.2 网易云音乐下载
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档