设为首页 加入收藏

TOP

Python爬虫小白入门(五)PhatomJS+Selenium第二篇(一)
2017-10-09 16:54:21 】 浏览:4239
Tags:Python 爬虫 小白 入门 PhatomJS Selenium 第二篇

一、前言


前文介绍了PhatomJS 和Selenium 的用法,工具准备完毕,我们来看看如何使用它们来改造我们之前写的小爬虫。

我们的目的是模拟页面下拉到底部,然后页面会刷出新的内容,每次会加载10张新图片。

大体思路是,用Selenium + PhatomJS 来请求网页,页面加载后模拟下拉操作,可以根据想要获取的图片多少来选择下拉的次数,然后再获取网页中的全部内容。

二、运行环境


我的运行环境如下:

  • 系统版本
    Windows10。

  • Python版本
    Python3.5,推荐使用Anaconda 这个科学计算版本,主要是因为它自带一个包管理工具,可以解决有些包安装错误的问题。去Anaconda官网,选择Python3.5版本,然后下载安装。

  • IDE
    我使用的是PyCharm,是专门为Python开发的IDE。这是JetBrians的产品,点我下载

三、爬虫实战改造


3.1 模拟下拉操作

要想实现网页的下拉操作,需要使用Selenium的一个方法来执行js代码。该方法如下:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

由此可见,使用execute_script方法可以调用java script API在一个加载完成的页面中去执行js代码。可以做任何你想做的操作哦,只要用js写出来就可以了。

改造的爬虫的第一步就是封装一个下拉方法,这个方法要能控制下拉的次数,下拉后要有等待页面加载的时间,以及做一些信息记录(在看下面的代码前自己先想一想啦):

    def scroll_down(self, driver, times):
        for i in range(times):
            print("开始执行第", str(i + 1),"次下拉操作")
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  #执行java script实现网页下拉倒底部
            print("第", str(i + 1), "次下拉操作执行完毕")
            print("第", str(i + 1), "次等待网页加载......")
            time.sleep(20)  # 等待20秒(时间可以根据自己的网速而定),页面加载出来再执行下拉操作

这部分做完之后就是修改页面爬取逻辑,之前是使用request 请求网址,然后找到图片url所在位置,再然后挨个请求图片url。现在,我们要首先使用Selenium 请求网址,然后模拟下拉操作,等待页面加载完毕再遵循原有逻辑挨个请求图片的url。

逻辑部分改造如下:

    def get_pic(self):
        print('开始网页get请求')
        # 使用selenium通过PhantomJS来进行网络请求
        driver = webdriver.PhantomJS()
        driver.get(self.web_url)
        self.scroll_down(driver=driver, times=5)  #执行网页下拉到底部操作,执行5次
        print('开始获取所有a标签')
        all_a = BeautifulSoup(driver.page_source, 'lxml').find_all('a', class_='cV68d')  #获取网页中的class为cV68d的所有a标签
        print('开始创建文件夹')
        self.mkdir(self.folder_path)  #创建文件夹
        print('开始切换文件夹')
        os.chdir(self.folder_path)   #切换路径至上面创建的文件夹

        print("a标签的数量是:", len(all_a))  #这里添加一个查询图片标签的数量,来检查我们下拉操作是否有误
        for a in all_a: #循环每个标签,获取标签中图片的url并且进行网络请求,最后保存图片
            img_str = a['style'] #a标签中完整的style字符串
            print('a标签的style内容是:', img_str)
            first_pos = img_str.index('"') + 1  #获取第一个双引号的位置,然后加1就是url的起始位置
            second_pos = img_str.index('"', first_pos)  #获取第二个双引号的位置
            img_url = img_str[first_pos: second_pos] #使用Python的切片功能截取双引号之间的内容

            #注:为了尽快看到下拉加载的效果,截取高度和宽度部分暂时注释掉,因为图片较大,请求时间较长。
            ##获取高度和宽度的字符在字符串中的位置
            #width_pos = img_url.index('&w=')
            #height_pos = img_url.index('&q=')
            #width_height_str = img_url[width_pos : height_pos] #使用切片功能截取高度和宽度参数,后面用来将该参数替换掉
            #print('高度和宽度数据字符串是:', width_height_str)
            #img_url_final = img_url.replace(width_height_str, '')  #把高度和宽度的字符串替换成空字符
            #print('截取后的图片的url是:', img_url_final)

            #截取url中参数前面、网址后面的字符串为图片名
            name_start_pos = img_url.index('photo')
            name_end_pos = img_url.index('?')
            img_name = img_url[name_start_pos : name_end_pos]
            self.save_img(img_url, img_name) #调用save_img方法来保存图片

逻辑修改完毕。执行一下,发现报错了,图片的url截取错误。那就看看到底是为什么,先输出找到url看看:

看看输出内容,发现通过PhatomJS 请求网页获得的url(https://blablabla) 中,竟然没有双引号,这跟使用Chrome 看到的不一样。好吧,那就按照没有双引号的字符串重新截取图片的url。

其实,我们只需要把url的起始位置和结束逻辑改成通过小括号来获取就可以了:

first_pos = img_str.index('(') + 1  #起始位置是小括号的左边
second_pos = img_str.index(')')  #结束位置是小括号的右边

好啦,这次获取图片的url就没什么问题了,程序可以顺利的执行。

但是,细心的小伙伴儿肯定发现了,我们这个爬虫在爬取的过程中中断了,或者过一段时间网站图片更新了,我再想爬,有好多图片都是重复的,却又重新爬取一遍,浪费时间。那么我们有什么办法来达到去重的效果呢?

3.2 去重

想要做去重,无非就是在爬取图片的时候记录图片名字(图片名字是唯一的)。在爬取图片前,先检查该图片是否已经爬取过,如果没有,则继续爬取,如果已经

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇for循环和while循环 下一篇前两篇转载别人的精彩文章,自己..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目