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()

至此,便完成了表情包的下载。

本文标签: 动态网页 爬虫 实战 案例 网络