python抓取网页图片

一.python语言特点

1.没有括号、分号

2.严格依靠对齐方式来替代括号

3.if语句后加冒号“:”

4.引用全局变量使用global后再引用

5.变量定义不需要定义类型


二.以下为转载

工具准备:

  • 不要多想,挑个IDE吧,我用的是PyCharm(免费的~嗯,今年刚刚免费的)
  • 打开PyCharm的设置(找找在哪,我都是直接commond+,的,如果你有commond键的话)在Project下选择Project Interpreter然后点击左下角的加号,在输入框中输入requests,收索后安装,其实还有很多其他的安装方法,使用pip,在终端中敲入那些代码,然后还有什么其他的东西,不过还是这样比较偷懒(其实前面的坑我都爬过了)
  • Python为最新版,2.7应该也没问题,并未使用Scrapy爬虫框架,也没有使用lxml,仅仅使用re正则和requests网络请求
  • 安装requests

    安装很简单,我是win系统,就在这里下载了安装包(网页中download the zipball处链接),然后$ python setup.py install就装好了。
    当然,有easy_installpip的朋友可以直接使用:easy_install requests或者pip install requests来安装。
    至于Linux用户,这个页面还有其他安装方法。
    测试在IDLE中输入import requests,如果没提示错误,那说明已经安装成功了!


re和requests用法

  • re正则
    re就是正则,主要是用来解析数据的,当我们拿到网页的数据时需要从中提取处我们想要的数据,正则匹配就时其中的一个方法,至于正则的写法,这里就不在多讲,想看的在这里正则表达式30分钟入门教程,而re的常用使用手法可以在我的这篇文章里了解Python爬虫-re(正则表达式)模块常用方法,这里我们主要使用其re.findall("正则表达式","被匹配数据",匹配限制(例如:忽略大小写))
  • requests网络请求
    requests的封装异常的强大,几乎可以做任何形式的网络请求,这里我们只是使用了其最简单的get请求requests.get("url",timeout=5),详细了解,可以看一下(requests快速入门)

    具体的步骤

  • 首先是想清楚想要做什么,你想要获取什么数据(没有目标哪来的动力啊),这里我们是想要通过百度图片来后去图片链接及内容,我想要搜索关键字,并可以指定搜索的数据量,选择是否保存及保存的路径~
  • 需求有了,就要去分析要爬去的网页结构了,看一下我们的数据都在哪,我们这次要扒去的图片来自百度图片
  • 首先进入百度图库,你所看见的页面当向下滑动的时候可以不停的刷新,这是一个动态的网页,而我们可以选择更简单的方法,就是点击网页上方的传统翻页版本

    QQ20160602-0@2x.png
  • 接下来就是我们熟悉的翻页界面,你可以点击第几页来获取更多的图片

    QQ20160602-1@2x.png
  • 点击鼠标的右键可以查看网页的源代码,大概就是这个样子的,我们get下来的数据,就是这个啦,我们需要在这里面找到各个图片的链接下一页的链接,然而有点懵,这么多的数据,我们想要的在哪里呢?

    QQ20160602-2@2x.png
  • 不着急,我们可以通过浏览器的开发者工具来查看网页的元素,我用的是Chrome,打开Developer Tools来查看网页样式,当你的鼠标从结构表中划过时会实时显示此段代码所对应的位置区域,我们可以通过此方法,快速的找到图片所对应的位置:


    QQ20160602-3@2x.png


    找到了一张图片的路径和下一页的路径,我们可以在源码中搜索结果找到他们的位置,并分析如何书写正则来获取信息:

三.代码部分

#导入库
import requests #http库
import  re #正则库
import os #文件夹操作的库

#设置参数
MaxSearchPage = 1 # 收索页数
CurrentPage = 1 # 当前正在搜索的页数
DefaultPath = "pictures/" # 默认储存位置(相对路径使用“/”)
NeedSave = 0 # 是否需要储存
Number = 1 #图片起始命名

#正则
def imageFiler(content): # 通过正则获取当前页面的图片地址数组
        return re.findall('"objURL":"(.*?)"',content,re.S)
def nextSource(content): # 通过正则获取下一页的网址
        next = re.findall('<div id="page">.*<a href="(.*?)" class="n">',content,re.S)[0]
        print("---------" + "http://image.baidu.com" + next)
        return next

#核心代码
def spidler(key, source):
        content = requests.get(source).text  # 通过链接获取内容
        imageArr = imageFiler(content) # 获取图片数组
        global CurrentPage
        print("Current page:" + str(CurrentPage) + "**********************************")
        for imageUrl in imageArr: #遍历图片
            print(imageUrl)
            global  NeedSave
            if NeedSave:  # 如果需要保存保存
               global DefaultPath, number
               try:
                    picture = requests.get(imageUrl,timeout=10) # 下载图片并设置超时时间,如果图片地址错误就不继续等待了
               except:
                    print("Download image error! errorUrl:" + imageUrl)
                    continue
               pictureSavePath = DefaultPath + str(key) + "/" + str(Number) + ".jpg" # 创建图片保存的路径
               print(pictureSavePath)
               fp = open(pictureSavePath,'wb') # 以写入二进制的方式打开文件
               fp.write(picture.content)
               fp.close()
               number += 1
        else:
              global MaxSearchPage
              if CurrentPage < MaxSearchPage:
                  if nextSource(content):
                      CurrentPage += 1
                      spidler(key, "http://image.baidu.com" + nextSource(content)) # 爬取完毕后通过下一页地址继续爬取

#启动
def  beginSearch(key):
        global DefaultPath, CurrentPage
        if not os.path.isdir(DefaultPath + str(key)): #if的非判断
            os.mkdir(DefaultPath + str(key)) #建立指定文件夹
        CurrentPage = 1 #重置当前页数
        StartSource = "http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=" + str(key) + "&ct=201326592&v=flip" # 分析链接可以得到,替换其`word`值后面的数据来收索关键词
        spidler(key, StartSource)

#主程序
beginSearch("18岁男")
beginSearch("19岁男")


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值