admin 管理员组文章数量: 887017
Python网络爬虫案例实战:动态网页爬取:selenium爬取动态网页
利用“审查元素”功能找到源地址十分容易,但是有些网站非常复杂。除此之外,有一些数据真实地址的URL 也十分冗长和复杂,有些网站为了规避这些爬取会对地址进行加密。
因此,在此介绍另一种方法,即使用浏览器渲染引擎,直接用浏览器在显示网页时解析HTML,应用CSS样式并执行JavaScript的语句。此方法在爬虫过程中会打开一个浏览器,加载该网页,自动操作浏览器浏览各个网页,顺便把数据抓下来。通俗地说,就是使用浏览器渲染方法,将爬取动态网页变成了爬取静态网页。
可以用 Python的 selenium库模拟浏览器完成爬取。selenium是一个用于 Web 应用程序测试的工具。selenium测试直接运行在浏览器中,浏览器自动按照脚本代码做出单击、输入、打开、验证等操作,就像真正的用户在操作一样。
4.4.1安装 selenium
selenium的安装非常简单,和其他的Python库一样,可以用pip安装,代码为:
pip install selenium
selenium的脚本可以控制浏览器进行操作,可以实现多个浏览器的调用,包括 IE(7、8、9、10、11)、Firefox、Safari、Google Chrome、Opera等。
安装完成后打开终端,输入python回车,进入Python,如图4-21所示。
接着,在终端中输入from selenium import webdriver并回车。若未报错则成功,如图4-22所示;若失败则重新安装selenium模块。
若输入 web = webdriver.Firefox()并回车,则打开浏览器。正常情况下会打开一个这样的Firefox,如图4-23所示。
在图4-23中的地址栏带有黄色条纹,还有个小机器人图标。如果出现错误“seleniummon.exceptions.WebDriverException:Message:'geckodriver’executable needs to be in PATH.”,即证明没有安装驱动,这时只需要安装驱动即可。
Mac版 Firefox驱动的下载地址为:http://download.csdn/download/qq_ 34122135/10203884,下载完驱动,解压得到 geckodriver,然后把文件移到/usr/local/bin下面,并赋给x执行权限即可。安装完驱动,然后测试一下用Python 代码控制浏览器打开a百度首页。
from selenium import webdriver
wb = webdriver.Firefox()
wb.get("http://www.baidu")
#打印网页源码
print(wb.page_source)
执行程序得到如图4-24所示界面。可以看到,启动了一个带小机器人图标的Firefox,并且打开了百度首页,控制台也输出了百度首页的所有源码,如图4-25所示。
至此,基本环境就已经配置好了,接下来开始爬取表情包。
4.4.2爬取百度表情包
我们可以使用百度图片捜索功能来实现表情包爬虫。
首先,先打开百度图片,搜索“表情包”,如图4-26所示。
接下来只要分析一下网页结构,按规则过滤就可以得到图片链接了。
用Firefox自带的工具查看即可,在网页上右击弹出快捷菜单,选择“查看元素”命令就可以很清晰地看到文档结构了,如图4-27所示。
其中,对环境结构进行了配置:
至此,环境已经配置好了,文档结构也分析完了,接下来编写代码。下面是下载图片的模块 download.py,代码为:
# -*- coding=utf-8 -*-
from selenium import webdriver
from netutil import download
class ImgSpider(object):
# wd 搜索的关键字,maxPage最大下载的页数
def __init__(self, wd="", maxPage = 5):
# 百度图片搜索的http请求
self.url = "https://image.baidu/search/flip?tn=baiduimage&ie=utf-8&word="+wd
# 打开火狐浏览器
self.wb = webdriver.Firefox()
# 设置最大下载你页数
self.deep = maxPage
self.start = 1
# 打开第一页
def first(self):
# 打开url获取第一页结果
self.wb.get(self.url)
# 解析网页
self.parse()
# 读取下一页
self.onNext()
# 递归读取下一页,直到条件不满足
def onNext(self):
# 当前页码加1
self.start += 1
# 解析网页
self.parse()
# 通过xpath方法匹配页码指示器
element = self.wb.find_element_by_xpath("//div[@id='page']")
for el in element.find_elements_by_xpath(".//span[@class='pc']"):
# 获取页码
str = el.text
num = int(str)
# 比较页码,不满足条件则关闭程序
if num > self.deep:
self.close()
# 继续执行下一页操作
if num == self.start:
el.click()
self.onNext()
# 解析下载图片
def parse(self):
# 通过xpath匹配当前网页的所有图片的最上层节点
imgs = self.wb.find_element_by_xpath('''//div[@id="wrapper"]''')
i = 0
# 匹配所有的图片节点,遍历下载
for img in imgs.find_elements_by_xpath(".//img"):
i = i + 1
# 获取img标签的连接
url = img.get_attribute("src")
print(url)
# 给下载模块下载图片
download.downloadByHttp(url)
#关闭爬虫
def close(self):
self.wb.quit()
exit()
#开始抓取数据 关键字和最大页数
spider = ImgSpider("表情包", 5)
spider.first()
至此,便完成了表情包的下载。
版权声明:本文标题:Python网络爬虫案例实战:动态网页爬取:selenium爬取动态网页 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726436443h960312.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论