Python爬虫学习pythonPythoner集中营

Python爬虫-搜索并下载图片

2016-06-02  本文已影响2029人  SSBun

本文是我学习Python爬虫的笔记,一直想要再学一门语言来扩展自己的知识面,看了看各种语言主要使用的方向,最后决心还是来搞一搞Python.Python给我的第一印象就是语法简洁,格式另类还有各种库的支持,就喜欢这么有个性的语言为了以后深入的学习爬虫,事先肯定是先把语法学了一遍,下面是我实现的一个小爬虫,可以通过百度图库利用关键字来搜索图片并下载

工具准备:

re和requests用法

re就是正则,主要是用来解析数据的,当我们拿到网页的数据时需要从中提取处我们想要的数据,正则匹配就时其中的一个方法,至于正则的写法,这里就不在多讲,想看的在这里正则表达式30分钟入门教程,而re的常用使用手法可以在我的这篇文章里了解Python爬虫-re(正则表达式)模块常用方法,这里我们主要使用其re.findall("正则表达式","被匹配数据",匹配限制(例如:忽略大小写))

requests的封装异常的强大,几乎可以做任何形式的网络请求,这里我们只是使用了其最简单的get请求requests.get("url",timeout=5),详细了解,可以看一下(requests快速入门)

具体的步骤

import requests #首先导入库
import  re
然后设置默认配置
MaxSearchPage = 20 # 收索页数
CurrentPage = 0 # 当前正在搜索的页数
DefaultPath = "/Users/caishilin/Desktop/pictures" # 默认储存位置
NeedSave = 0 # 是否需要储存
图片链接正则和下一页的链接正则
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(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
                 try:                
                      picture = requests.get(imageUrl,timeout=10) # 下载图片并设置超时时间,如果图片地址错误就不继续等待了
                 except:                
                      print("Download image error! errorUrl:" + imageUrl)                
                      continue            
                 pictureSavePath = DefaultPath + imageUrl.replace('/','') # 创建图片保存的路径
                 fp = open(pictureSavePath,'wb') # 以写入二进制的方式打开文件            fp.write(picture.content)
                 fp.close()
           else:   
                global MaxSearchPage
                if CurrentPage <= MaxSearchPage:
                    if nextSource(content):
                        CurrentPage += 1                                         
                        spidler("http://image.baidu.com" + nextSource(content)) # 爬取完毕后通过下一页地址继续爬取
爬虫的开启方法
def  beginSearch(page=1,save=0,savePath="/users/caishilin/Desktop/pictures/"): # (page:爬取页数,save:是否储存,savePath:默认储存路径)
          global MaxSearchPage,NeedSave,DefaultPath
          MaxSearchPage = page
          NeedSave = save
          DefaultPath = savePath
          key = input("Please input you want search 
          StartSource = "http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=" + str(key) + "&ct=201326592&v=flip" # 分析链接可以得到,替换其`word`值后面的数据来收索关键词
          spidler(StartSource)
 调用开启的方法就可以通过关键词搜索图片了
beginSearch(page=1,save=0)

小结

** 因为对Python的理解还不是特别的深入,所以代码比较繁琐,相比较爬虫框架Scrapy来说,直接使用reqests和re显得并不是特别的酷,但是这是学习理解爬虫最好的方式,接下来我会陆陆续续将我学习爬虫框架Scrapy的过程写下来,有错误的地方请指正~**

上一篇下一篇

猜你喜欢

热点阅读