51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1511|回复: 0
打印 上一主题 下一主题

Python + PySpider 抓取百度图片搜索的图片

[复制链接]
  • TA的每日心情
    无聊
    1 小时前
  • 签到天数: 528 天

    连续签到: 1 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-11-29 14:17:57 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    说明:
    1. 1、PySpider 是一个方便并且功能强大的Python爬虫框架
    2. 2、PySpider 依赖于PhantomJS
    3. 3、windows平台,PySpider 与64位的Python兼容不太好,需要使用32位Python
    4. 4、本文环境:Python3.5(32位)+PhantomJS2.1.1+PySpider 0.4.0
    复制代码
    环境配置
    1.安装Python(32位)
      下载地址:https://www.python.org/downloads/windows/
      下载Windows x86 executable installer后按指示安装,并将安装路径加入环境变量
    2.列表内容
      下载地址:http://phantomjs.org/download.html
      下载后解压,并将bin目录放入环境变量(命令行phantomjs -v测试)
    3.安装PySpider
      使用pip安装:命令行输入 pip install pyspider
      验证安装结果:
        安装完成后,命令行输入 pyspider all,然后浏览器访问http://localhost:5000
        如果正常出现PySpider页面,则说明安装成功

    开始抓取
    1.获取抓取链接
      在百度图片http://image.baidu.com/里随便输入搜索,将搜索结果页地址作为我们抓取的链接。我这里输入“猫咪”,然后获取到的链接是https://image.baidu.com/search/i ... =%E7%8C%AB%E5%92%AA

    2.新建PySpider项目
      命令行输入 pyspider all,然后浏览器访问http://localhost:5000
      点击右下角的“Create”按钮




    输入项目名称和我们第一步获取到的URL


    然后点击“Create”即可完成创建,并打开项目的编辑界面。具体使用方式请自行百度


    3.抓取思路
      搜索结果页面本身已包含所有的图片,通过图片标签就可以获取到。但此种方法获取的图片分辨率较低,我们需要获取分辨率较高的图片。
      搜索结果页,点击图片,会进入图片详情页,这里展示的图片分辨率较高,符合我们的要求。
      所以,我们的目标就是:搜索结果页获取图片详情页的地址列表,然后再遍历进入详情页获取图片的URL,最后下载保存到本地。
      下面正式开始抓取

    4.index_page中获取图片详情页地址列表
      使用PySpider内置的PyQuery,通过css匹配到我们要找的链接标签,然后获取链接的地址,通过PySpider的crawl方法传递给detail_page处理图片详情页数据。
      crawl方法的save参数会传递给detail_page数据,可通过detail_page方法的response参数获取
    1. def index_page(self, response):
    2.         count = 1
    3.         #获取图片详情链接标签列表
    4.         for each in response.doc('.imgbox a').items():
    5.             url = each.attr.href
    6.             #进入图片详情页
    7.             self.crawl(url, callback=self.detail_page,validate_cert=False, fetch_type="js",save={"count":count})
    8.             count +=1
    复制代码
    5. detail_page中获取图片地址并下载
      此处也是通过PyQuery匹配到图片标签,然后获取图片地址,最后交由自定义的下载方法save_img去下载图片并保存本地
    1. def detail_page(self, response):
    2.         #获取图片标签
    3.         imgElem = response.doc(".currentImg")
    4.         #获取图片地址
    5.         imgUrl = imgElem.attr.src
    6.         if imgUrl:
    7.             #获取图片文件后缀
    8.             extension = self.tool.get_extension(imgUrl)
    9.             #拼接图片名
    10.             file_name = str(response.save["count"]) + "." + extension
    11.             self.crawl(imgUrl,callback=self.save_img,save={"file_name":file_name},validate_cert=False)
    复制代码
     6. 保存图片方法

    1. #保存图片
    2.     def save_img(self,response):
    3.         content = response.content
    4.         file_name = response.save["file_name"]
    5.         file_path = self.dir_path + os.path.sep + file_name
    6.         self.tool.save_img(content,file_path)
    复制代码
     7. 创建文件夹、保存图片的工具类
    1. #工具类   
    2. class Tool:
    3.     def __init__(self):
    4.         self.dir = DIR_PATH
    5.         #创建文件夹(如果不存在)
    6.         if not os.path.exists(self.dir):                        
    7.             os.makedirs(self.dir)                                         
    8.     #保存图片
    9.     def save_img(self,content,path):
    10.         f = open(path,"wb" )
    11.         f.write(content)
    12.         f.close()

    13.     #获取url后缀名
    14.     def get_extension(self,url):                           
    15.         extension = url.split(".")[-1]
    16.         return extension   
    复制代码
     8. 完整代码
    1. #!/usr/bin/env python
    2. # -*- encoding: utf-8 -*-
    3. # Created on 2017-03-29 14:56:10
    4. # Project: BaiduPictures

    5. from pyspider.libs.base_handler import *
    6. import os

    7. #图片存放目录
    8. DIR_PATH = "D:\python_workspace\pyspider_baiduPicture"
    9. class Handler(BaseHandler):
    10.     crawl_config = {
    11.     }

    12.     def __init__(self):
    13.         self.base_url = "https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E7%8C%AB%E5%92%AA&oq=%E7%8C%AB%E5%92%AA&rsp=-1"
    14.         self.dir_path = DIR_PATH
    15.         self.tool = Tool()

    16.     @every(minutes=24 * 60)
    17.     def on_start(self):
    18.         #validate_cert:是否验证SSL;fetch_type:为了支持JS
    19.         self.crawl(self.base_url, callback=self.index_page, validate_cert=False, fetch_type="js")

    20.     @config(age=10 * 24 * 60 * 60)
    21.     def index_page(self, response):
    22.         count = 1
    23.         #获取图片详情链接标签列表
    24.         for each in response.doc('.imgbox a').items():
    25.             url = each.attr.href
    26.             #进入图片详情页
    27.             self.crawl(url, callback=self.detail_page,validate_cert=False, fetch_type="js",save={"count":count})
    28.             count +=1

    29.     @config(priority=2)
    30.     def detail_page(self, response):
    31.         #获取图片标签
    32.         imgElem = response.doc(".currentImg")
    33.         #获取图片地址
    34.         imgUrl = imgElem.attr.src
    35.         if imgUrl:
    36.             #获取图片文件后缀
    37.             extension = self.tool.get_extension(imgUrl)
    38.             #拼接图片名
    39.             file_name = str(response.save["count"]) + "." + extension
    40.             self.crawl(imgUrl,callback=self.save_img,save={"file_name":file_name},validate_cert=False)

    41.     #保存图片
    42.     def save_img(self,response):
    43.         content = response.content
    44.         file_name = response.save["file_name"]
    45.         file_path = self.dir_path + os.path.sep + file_name
    46.         self.tool.save_img(content,file_path)

    47. #工具类   
    48. class Tool:
    49.     def __init__(self):
    50.         self.dir = DIR_PATH
    51.         #创建文件夹(如果不存在)
    52.         if not os.path.exists(self.dir):                        
    53.             os.makedirs(self.dir)                                         
    54.     #保存图片
    55.     def save_img(self,content,path):
    56.         f = open(path,"wb" )
    57.         f.write(content)
    58.         f.close()

    59.     #获取url后缀名
    60.     def get_extension(self,url):                           
    61.         extension = url.split(".")[-1]
    62.         return extension      
    复制代码


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-18 11:23 , Processed in 0.064957 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表