Python网络爬虫 第六章 自动化

一、selenium引入概述

我们在抓取⼀些普通⽹⻚的时候requests基本上是可以满⾜的,但是,如果遇到⼀些特殊的⽹站,它的数据是经过加密的,但是浏览器却能够正常显示出来。那我们通过requests抓取到的内容可能就不是我们想要的结果了。 例如,电影票房数据,在浏览器上看的时候是正常的。那么按照之前的逻辑,我们只需要看看数据是通过哪个请求拿到的就可以进⾏模拟请求了。
但是!

 简单介绍⼀下selenium, 它本身是⼀个⾃动化测试的⼯具. 可以启动⼀个全新的浏览器.并从浏览器中提取到你想要的内容. 随着各种⽹站的反爬机制的出现. selenium越来越受到各位爬sir的喜爱.

selenium最⼤的缺点其实就⼀个, 慢! 你想啊. 他要启动⼀个第三⽅的软件(浏览器), 并且还要等待浏览器把数据渲染完毕. 这个过程必然是很耗时的. 所以它慢.

接下来, 我们来聊聊selenium如何安装和使⽤.
就像其他第三⽅库⼀样, selenium直接⽤pip就可以安装了

pip install selenium

但是呢, 它与其他库不同的地⽅是他要启动你电脑上的浏览器, 这就需要⼀个驱动程序来辅助.
chrome驱动地址:https://npm.taobao.org/mirrors/chromedriver
这⾥推荐⽤chrome浏览器. 其他浏览器的驱动请⾃⾏百度.

 我这里是windows系统就选择win32

 然后关键的来了. 把你下载的浏览器驱动放在程序所在的⽂件夹. 或者放到python解释器所在的⽂件夹. 两种⼆选其⼀.

python解释器的文件夹在Console上便能看到

 OK~ 前期准备⼯作完毕. 上代码看看, selenium是个什么⻤

# 让selenium启动谷歌浏览器
from selenium.webdriver import Chrome

# 1.创建浏览器对象
web = Chrome()
# 2.打开一个网址
web.get("http://www.baidu.com")

print(web.title)

运⾏⼀下你会发现神奇的事情发⽣了. 浏览器⾃动打开了. 并且输⼊了⽹址. 也能拿到⽹⻚上的title标题.

二、selenium各种神奇操作

selenium不但可以打开浏览器. 还可以对浏览器各种操作. ⽐如, 点 击, 查找. 都可以.
我们直接上案例. 抓取拉钩⽹招聘python⼯程师的招聘信息

1、准备⼯作

2、点击-全国按钮

想要点击这个按钮. 我们需要先定位到这个按钮. 然后再点击selenium想要定位某个元素. 太简单了.


web = Chrome()

web.get("http://lagou.com")

# 找到某个元素. 点击它
el = web.find_element_by_xpath('//*[@id="changeCityBox"]/ul/li[1]/a')
el.click()  # 点击事件

3、搜索python

⼈的过程: 找到⽂本框输⼊"python", 点击"搜索"按钮.
机器的过程: 找到⽂本框输⼊"python", 点击"搜索"按钮.
发现没, ⽤selenium最爽的地⽅就是这⾥. ⼈是怎么操作的. 机器就怎么操作.

web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python") 
web.find_element_by_xpath('//*[@id="search_button"]').click()

send_keys() 这⾥要说⼀下. 如果我们给出的是⼀个字符串. 就是输⼊⽂本. 但是, 如果给出的是⼀个键盘指令, 那就按下键盘. ⽐ 如, 我想要按回⻋按钮. 就是这样的

# 找到输入框. 输入python  =>  输入回车/点击搜索按钮
web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python", Keys.ENTER)

4、提取招聘信息

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys  # 键盘指令

import time

web = Chrome()

web.get("http://lagou.com")

# 找到某个元素. 点击它
el = web.find_element_by_xpath('//*[@id="changeCityBox"]/ul/li[1]/a')
el.click()  # 点击事件

time.sleep(1)  # 让浏览器缓一会儿 等ajax数据加载

# 找到输入框. 输入python  =>  输入回车/点击搜索按钮
web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python", Keys.ENTER)

time.sleep(1)

# 查找存放数据的位置. 进行数据提取
# 找到页面中存放数据的所有的li
li_list = web.find_elements_by_xpath('//*[@id="s_position_list"]/ul/li')
for li in li_list:
    job_name = li.find_element_by_tag_name("h3").text
    job_price = li.find_element_by_xpath("./div[1]/div[1]/div[2]/div/span").text
    company_name = li.find_element_by_xpath('./div[1]/div[2]/div/a').text
    print(company_name, job_name, job_price)


# 自动屏蔽掉了一些js加密解密问题,轻松多了

5、多窗口调度

上面说到我们已经可以通过selenium拿到拉钩⽹的招聘信息了. 但是, 信息不够全⾯. 我们希望得到的不仅仅是⼀个岗位名称和公司名称, 我更想知道更加详细的职位描述以及岗位要求

此时问题就来了. 我们可以在搜索⻚⾯点击进⼊到这个详情⻚. 然后就可以看到想要的职位描述了. 但是, 这时就涉及到如何从⼀个窗⼝转向另⼀个窗⼝了(切换选项卡).
⾸先, 我们先通过selenium定位到搜索⻚上的职位超链接

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import time
web = Chrome()

web.get("http://lagou.com")

web.find_element_by_xpath('//*[@id="cboxClose"]').click()

time.sleep(1)

web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python", Keys.ENTER)

time.sleep(1)
web.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[1]/div[1]/div[1]/div[1]/a/h3').click()

注意! 我们看到的是新窗⼝的内容, 但是在selenium的视⻆⾥, 窗⼝依然停留在刚才那个窗⼝. 此时, 必须要将窗⼝调整到最新的窗⼝上才可以

# 如何进入到进窗口中进行提取
# 注意, 在selenium的眼中. 新窗口默认是不切换过来的. -1最后一个窗口
web.switch_to.window(web.window_handles[-1])

# 在新窗口中提取内容
job_detail = web.find_element_by_xpath('//*[@id="job_detail"]/dd[2]/div').text
print(job_detail)

6 、无头浏览器

我们已经基本了解了selenium的基本使⽤了. 但是呢, 不知各位有没有发现, 每次打开浏览器的时间都⽐较⻓. 这就⽐较耗时了. 我们写的是爬⾍程序. ⽬的是数据. 并不是想看⽹⻚. 那能不能让浏览器在后台跑呢? 答案是可以的,只需要配置好参数即可。

# 准备好参数配置
opt = Options()
# 无头
opt.add_argument("--headless")
# 不显示 让程序在后台运行
opt.add_argument("--disbale-gpu")

web = Chrome(options=opt)  # 把参数配置设置到浏览器中

直接上案例吧. 拿出最开始我们看到的那个⽹⻚. 抓取电影票房.

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.select import Select
import time

# 准备好参数配置
opt = Options()
# 无头
opt.add_argument("--headless")
# 不显示 让程序在后台运行
opt.add_argument("--disbale-gpu")

web = Chrome(options=opt)  # 把参数配置设置到浏览器中

web.get("https://www.endata.com.cn/BoxOffice/BO/Year/index.html")

time.sleep(2)
# 定位到下拉列表
sel_el = web.find_element_by_xpath('//*[@id="OptionDate"]')
# 对元素进行包装, 包装成下拉菜单
sel = Select(sel_el)
# 让浏览器进行调整选项
for i in range(len(sel.options)):  # i就是每一个下拉框选项的索引位置
    sel.select_by_index(i)  # 按照索引进行切换
    time.sleep(2)
    table = web.find_element_by_xpath('//*[@id="TableList"]/table')
    print(table.text)  # 打印所有文本信息
    print("===================================")

print("运行完毕.  ")
web.close()


# 如何拿到页面代码Elements(经过数据加载以及js执行之后的结果的html内容)
print(web.page_source)

三、超级鹰解决验证码

作者:王陸

-------------------------------------------

个性签名:罔谈彼短,靡持己长。做一个谦逊爱学的人!

本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。鉴于博主处于考研复习期间,有什么问题请在评论区中提出,博主尽可能当天回复,加微信好友请注明原因

原文地址:https://www.cnblogs.com/wkfvawl/p/14756413.html