• Phantomjs与Selenium爬取图片


    一、任务描述

      本实验任务主要对网络爬虫进行一些基本操作,通过完成本实验任务,要求学生熟练掌握网络爬虫的网络请求及数据解析,并对网络爬虫的基本操作进行整理并填写工作任务报告。

    二、任务目标

    1、掌握正则表达式

    2、掌握网络爬虫的原理

    三、任务环境

    Ubuntu16.04、Python2.7

    四、任务分析

      学习爬虫,首先是要学习它的原理。打开网址,每页都有很多套图,如果要手动去保存,怎么操作?想应该是这样,从第一页开始,点进第一个套图,然后保存每张图片,然后进行第二个套图……第一页完了之后第二页,从第一个套图开始,保存保存……这就是原理,当然,虽然这样能达到这个目的,但大家应该没有那么多的时间,那么就来学习爬虫,来保存图片。

    五、任务实施

    步骤1、环境准备

      右击Ubuntu操作系统桌面,从弹出菜单中选择【Open in Terminal】命令 打开终端。

      通过【cd /home】切换到home目录下。【ls】查看该目录下的所有内容。

    图1 切换目录

      【mkdir Image】在home目录下创建Image文件夹。

    图2 创建文件夹

    步骤2、爬虫分析

      爬取的MM图片URL为https://mm.taobao.com/search_tstar_model.htm?

      打开浏览器输入该URL,查看界面效果。把所有的MM图片下载下来。

    图3 分析URL

      通过【cd /Image】切换到Image目录下。【vim taobaoMM.py】回车后创建并编辑taobaoMM.py的Python文件。

    图4 切换目录

      回车后进入编辑框内,按键盘【i】进入编辑状态,编译如下程序。

      导入程序所需的所有库。

    图5 导入库

      browserPath是Phantomjs的路径

      homeUrl是爬取的页面

      outputDir是保存的文件夹路径

      parser是解析器

    图6 路径

      加载PhantomJS的浏览器,通过driver.get(url)来访问URL,用BeautifulSoup来对得到爬取的URL进行解析。driver.page_source是网页的全部HTML源码。最后通过主方法来调用main方法。

    图7 获取URL

      编辑完毕后,按【esc】退出编辑状态,【:wq】保存并退出编辑框,【python taobaoMM.py】执行taobaoMM的Python文件。driver.page_source输出的结果是网页的全部HTML源码。

    图8 运行Python文件

      打开访问URL的浏览器,右键选择【Inspect Element(Q)】根据判断得知,MM的所有信息在id为J_GirlsList内。

    图9 分析网址

      【vim taobaoMM.py】再次编辑taobaoMM.py文件。

      在main函数内通过find_element_by_id获得所有信息,正则表达式获取妹子的封面图片以及个人主页的地址。

    图10 解析信息

      在main函数内通过list列表的截取得到妹子的名字地点、身高体重、个人主页地址以及封面图片地址。

    图11 截取信息

      在main函数内将妹子的信息通过zip函数封装(zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表)。再通过for循环,对妹子的信息进行写入。

    图12 信息封装

      定义mkdir函数,判断图片输出的路径是否存在,不存在则创建。

    图13 输出路径

      在主方法内调用mkdir函数,并将输出路径作为参数传递。

    图14 参数传递

      编辑完毕后,按【esc】退出编辑状态,【:wq】保存并退出编辑框,【python taobaoMM.py】执行taobaoMM的Python文件。爬取需要几分钟。静等几分钟后。打开/home/Image/MMImage下。发现生成很多文件夹。

    图15 运行Python文件

      每个目录下都包含MM的主图以及保存信息的txt文件。

    图16 目录信息

      txt文件内包含了MM的基本信息。

    图17 基本信息

    步骤3、源代码

      1. #coding:utf-8
      2. import os
      3. import re
      4. from bs4 import BeautifulSoup
      5. import urllib2
      6. from selenium import webdriver
      7. import sys
      8. reload(sys)
      9. sys.setdefaultencoding( "utf-8" )
      10. browserPath = "/home/soft/phantomjs/bin/phantomjs"
      11. homeUrl = "https://mm.taobao.com/search_tstar_model.htm?"
      12. outputDir = "MMImage/"
      13. parser = "html5lib"
      14. def main():
      15. #PhantomJS浏览器的地址
      16. driver = webdriver.PhantomJS(executable_path=browserPath)
      17. #访问目标网页地址
      18. driver.get(homeUrl)
      19. #解析目标网页的 Html 源码
      20. bsObj = BeautifulSoup(driver.page_source,parser)
      21. #获得主页上所有妹子的姓名、所在城市、身高、体重等信息
      22. girlsList = driver.find_element_by_id("J_GirlsList").text.split(" ")
      23. #获取所有妹子的封面图片
      24. imagesUrl = re.findall(r"//gtd.alicdn.com/sns_logo.*.jpg",driver.page_source)
      25. #解析出妹子的个人主页地址等信息
      26. girlsUrl = bsObj.find_all("a",{"href":re.compile("//.*.htm?(userId=)d*")})
      27. # 所有妹子的名字地点
      28. girlNL = girlsList[::3]
      29. # 所有妹子的身高体重
      30. girlsHW = girlsList [1::3]
      31. # 所有妹子的个人主页地址
      32. girlsHURL = [("http:" + i["href"]) for i in girlsUrl]
      33. # 所有妹子的封面图片地址
      34. girlsPhotoURL = [("https:" + i) for i in imagesUrl]
      35. girlsInfo = zip(girlNL, girlsHW, girlsHURL, girlsPhotoURL)
      36. for girlNL,girlHW,girlHURL,girlCover in girlsInfo:
      37. #建立文件夹
      38. mkdir(outputDir + girlNL)
      39. # 获取妹子封面图片
      40. data = urllib2.urlopen(girlCover).read()
      41. with open(outputDir + girlNL + "/cover.jpg","wb") as f:
      42. f.write(data)
      43. f.close()
      44. with open(outputDir + girlNL + "/information.txt","wb") as a:
      45. a.write("Name And City:" + girlNL + " ")
      46. a.write("Hight And weight:" + girlHW + " ")
      47. a.write("personal homepage:" + girlHURL)
      48. a.close()
      49. driver.close()
      50. def mkdir(path):
      51. #判断路径是否存在
      52. isExists = os.path.exists(path)
      53. #判断结果
      54. if not isExists:
      55. #如果不存在则创建目录
      56. print(" 新建了文件夹",path)
      57. #创建目录操作函数
      58. os.makedirs(path)
      59. else:
      60. #如果目录存在则不创建,并提示目录已存在
      61. print("文件夹", path, "已创建")
      62. if __name__ == "__main__":
      63. if not os.path.exists(outputDir):
      64. os.makedirs(outputDir)
      65. main()
  • 相关阅读:
    视频遮挡问题
    calc兼容性
    javascript变量声明提升
    jquery插件
    prop和attr在 jquery的
    onclick防止冒泡和json对象放入
    git 入门
    去掉ie滚动条兼容性
    单页面应用程序(SPA)
    swiper轮播图插件
  • 原文地址:https://www.cnblogs.com/yu-1104/p/9050410.html
Copyright © 2020-2023  润新知