对于一些简单的动态网页,可以使用我们之前提起过的逆向分析法
之前写过动态网页的逆向分析法。
但是有一些网站非常复杂,如天猫产品评论,使用逆向分析法很难找到请求的url地址。除此之外,有些网站对爬虫非常不友好,会对地址和数据进行加密,分析起来异常困难,如QQ邮箱、百度登录等。
因此,这里介绍另一种方法,即使用浏览器渲染引擎。这个方法在爬取过程中会打开一个浏览器加载该网页,自动操作浏览器浏览各个网页。用一句简单而通俗的话说,就是使用浏览器渲染方法将爬取动态网页变成爬取静态网页。我们可以用Python的Selenium库模拟浏览器完成抓取。
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,浏览器自动按照脚本代码做出单击、输入、打开、验证等操作,就像真正的用户在操作一样。
Selenium支持各种浏览器,包括Chrome、Safari、Firefox等主流界面式浏览器,也支持无界面浏览器。通俗的说Selenium通过浏览器驱动,可以对浏览器进行控制。Selenium的安装既包括Selenium模块的安装,也包括浏览器驱动的下载和安装。
推荐使用谷歌的Chrome浏览器。
一、 安装Selenium
Selenium模块安装 Selenium现在最新的版本为3.1,由于2.X和3.X在使用上有差别,本书选择3.0以上版本。Selenium官方地址为: http://www.seleniumhq.org/。可选择下载后安装。由于pip使用的源多为国外镜像,网速较慢。可以使用pip -i参数,指定国内镜像源。
无镜像下载:
pip install selenium
有镜像下载:
pip install selenium -i https:/pypi.tuna.tsinghua.edu.cn/simple
// https://pypi.tuna.tsinghua.edu.cn/simple为清华镜像
当然你也可以去找其他镜像 。
二、浏览器驱动下载
浏览器驱动的下载安装
浏览器驱动也是一个独立的程序,是由浏览器厂商提供的,不同的浏览器需要不同的浏览器驱动。比如Chrome浏览器和火狐浏览器有各自不同的驱动程序。
浏览器驱动在接收到我们自动化程序发送的界面操作请求后,会转发请求给浏览器,
让浏览器去执行对应的自动化操作。浏览器执行完操作后,会将自动化的结果返回给浏览器驱动,浏览器驱动再通过HTTP响应的消息返回给我们的自动化程序的客户端库。自动化程序的客户端库接收到响应后,将结果转化为数据对象返回给程序代码。
在下载Chrome浏览器驱动前,首先确定Chrome浏览器的版本。点击Chrome浏览器“自定义及控制Goole Chrome”按钮,选择“帮助”、“关于Google Chrome(G)”,查看浏览器的实际版本号。
chromedriver的版本一定要与Chrome的版本一致(也不是很严格 ),不然就不起作用。
有两个下载地址:
例如我的版本书是90.0.4430.212 但是我在官网上并没有找到版本号相同的,这个时候呢,就可以找版本号相近的。所以我找的90.0.4430.24这个版本的chromedriver。
然后就看你的自己的系统是什么 下载对应的版本就好了。
然后就是配置环境的问题了 ,我没有配置。因为不配置也行 [手动滑稽]。
要是需要配置环境的同学 ,也可以去搜索一下啦怎么配置啦!
三、Selenium基本使用
from selenium import webdriver #导入webdriver
import time
wd=webdriver.Chrome("D:\..\chromedriver.exe") #获取Chrome驱动实例
wd.get("https://www.baidu.com") #打开百度
time.sleep(3) #睡眠3秒
print(wd.page_source)
wd.close() #关闭当前一个窗口
3.1 元素选择器
从命名上看,定位一个元素的单词是element,定位多个单词使用的单词是elements。
从使用角度来讲,定位一个元素,返回的类型是元素对象;定位多个元素,返回的数据类型则是列表。
通过get_attribute函数来获取元素的属性,参数可以是合法的html标签属性
举个栗子!
get_attribute(“outerHTML”):
from selenium import webdriver
import time
wd=webdriver.Chrome("D:\..\chromedriver.exe")
wd.get("https://www.baidu.com") #打开百度
time.sleep(5) #睡眠5秒,否则有可能页面未加载完成
elementbyselector=wd.find_element_by_css_selector("#s-top-left")#css选择器定位元素
print(elementbyselector.get_attribute("outerHTML"))
elementbyid=wd.find_element_by_id("s-top-left")#ID定位元素
print(elementbyid.text)
wd.close() #关闭当前一个窗口
get_attribute(“innerHTML”):
from selenium import webdriver
import time
wd=webdriver.Chrome("D:\..\chromedriver.exe")
wd.get("https://www.baidu.com") #打开百度
time.sleep(5) #睡眠5秒,否则有可能页面未加载完成
elementbyselector=wd.find_element_by_css_selector("#s-top-left")#css选择器定位元素
print(elementbyselector.get_attribute("innerHTML"))
get_attribute(“textContent”):
from selenium import webdriver
import time
wd=webdriver.Chrome("D:\..\chromedriver.exe")
wd.get("https://www.baidu.com") #打开百度
time.sleep(5) #睡眠5秒,否则有可能页面未加载完成
elementbyselector=wd.find_element_by_css_selector("#s-top-left")#css选择器定位元素
print(elementbyselector.get_attribute("textContent"))# 获取元素标签的内容
对比运行出来的结果:
发现"outerHTML"是包含有外面的div的 而"innerHTML"是直接爬取的div里面的标签。
3.2 CSS选择器
除了以上选择器外,Selenium提供的find_element_by_link_text、find_element_by_ partial_link_text方法可以根据超链接的文本来进行查找,在定位上提供了很大的便利性,推荐使用。
其实这个两个查找可以对比记忆 我们学过的精确查找(find_element_by_link_text)和模糊查找(find_element_by_ partial_link_text)。
举个栗子!
from selenium import webdriver
import time
wd=webdriver.Chrome("D:\..\chromedriver.exe")
wd.get("https://www.baidu.com") #打开百度
time.sleep(3) #睡眠3秒,否则有可能页面未加载完成
element=wd.find_element_by_link_text("新闻")
print(element.get_attribute("outerHTML"))
element1=wd.find_element_by_partial_link_text("闻")
print(element1.text)
wd.close() #关闭当前一个窗口
3.3 操纵元素的方法
操控元素通常包括点击元素、在输入框中输入文本、获取元素包含的信息。其中获取元素包含的信息,主要是获取属性element.get_attribute(“属性名”)和文本element.text在“元素选择器”中已经使用。 点击元素是模拟用户鼠标点击操作,如点击新闻链接。find_element_by_link_text函数进行定位后通过“click()”实现单击操作。
案例 : 如我们想打开百度点击左上角的新闻。(不要问为什么不自己手动打开,因为不想 )
用我们的python代码如何操作
from selenium import webdriver
import time
wd=webdriver.Chrome("D:\..\\chromedriver.exe")
wd.get("https://www.baidu.com") #打开百度
time.sleep(3)
wd.find_element_by_link_text("新闻").click() #点击新闻链接
wd.close() #关闭当前一个窗口
我们来加深一点点难度 ,在百度搜索框里搜素 “qq邮箱”
在页面中输入数据,常见于文本框中输入文本。在input标签中输入数据,使用send_keys(“字符串”)。首先需要定位元素,然后使用send_keys发送数据。中间不可忽略的步骤为等待时间的处理,暂时使用time.sleep,后边会详细讲解。增加等待时间是为了尽量避免出现,元素还未加载完成,导致操纵元素失败的问题。
1、搜先我们来定位一下搜索框
打开百度网页 - F12 - 点击搜索框 - 查找到源代码-我找的id(你可以找其他的)
2、找到搜索框之后 ,按相同的步骤找我们旁边的百度一下 的id。
3、代码实现:
from selenium import webdriver
import time
wd=webdriver.Chrome("D:\..\chromedriver.exe")
wd.get("https://www.baidu.com") #打开百度
time.sleep(3)
wd.find_element_by_id("kw").send_keys("qq邮箱")#发送数据
time.sleep(3)
wd.find_element_by_id("su").click()#点击检索按钮
time.sleep(3)
print(wd.page_source) #获取页面html文本
wd.close() #关闭当前一个窗口
3.3 登录一个qq邮箱试试?
一步一步来!
打开QQ邮箱的网页 (当然你也可以从百度一步一步点到邮箱界面):
同理找密码和找登录的id
from selenium import webdriver
import time
driver_path="D:\..\chromedriver.exe"
dirver=webdriver.Chrome(executable_path=driver_path)
dirver.get("https://mail.qq.com/")
time.sleep(3)
dirver.find_element_by_id("u").send_keys("你的账号")
dirver.find_element_by_id("p").send_keys("你的密码")
dirver.find_element_by_id("login_button").click()
print(dirver.page_source)
#关闭 当前窗口 关闭全部窗口 dirver.quit
dirver.close()
当你按照这样的步骤一步一步走下来后 ,你就 会报错,对没错,会报错。
Message: no such element: Unable to locate element: {“method”:“css selector”,“selector”:"[id=“u”]"} (Session info: chrome=90.0.4430.212)
说什么查找不到我们的id 定位错误???
其实有时候同一网页由于点击按钮在网页内出现新的页面可能是内部产生了新的frame,利用F12查看对应xpath的更上层结构,需要先利用switch_to.frame(),在进行定位就行了
然后我们加上switch_to.frame(“login_frame”)就可以咯!
driver_path="D:\..\chromedriver.exe"
dirver=webdriver.Chrome(executable_path=driver_path)
dirver.get("https://mail.qq.com/")
time.sleep(3)
dirver.switch_to.frame("login_frame")
dirver.find_element_by_id("u").send_keys("你的账号")
dirver.find_element_by_id("p").send_keys("你的密码")
dirver.find_element_by_id("login_button").click()
print(dirver.page_source)
#关闭 当前窗口 关闭全部窗口 dirver.quit
dirver.close()
转载:https://blog.csdn.net/qq_46924416/article/details/116795890