zl程序教程

您现在的位置是:首页 >  其他

当前栏目

010:图片类爬虫项目实战

2023-03-15 22:05:05 时间

之间我们学习了使用Urllib模块手写图片爬虫,在本章内容中,我们会以图片类爬虫为例,为大家讲解如何通过Scrapy框架实现图片爬虫项目。

利用Urllib手写爬虫回顾:

之前在实战的时候使用Urllib手写了爬取京东手机图片信息。 在这里我来写一个简单的输入关键字爬区百度图片搜索第一页的图片。 1、安装requests

2、获取百度图片搜索url信息

通过观察我们可以发现百度图片搜索页面的URL 假设关键字为LOL,则word=LOL 复制出来 http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=LOL 我们需要进行修改。index改成flip

url="https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word="+word+""

3、进行代码编写。

首先导入要使用的模块

import requests
import os
import re

生成一个目录。

word=input("请输入你要下载的图片:")
if not os.path.exists(word):
    os.mkdir(word)

再构造url

url="https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word="+word+""

获取信息进行数据下载保存

r=requests.get(url)
ret=r.content.decode()
result=re.findall('"objURL":"(.*?)",',ret)
for i in result:
    end=re.search('(.jpg|.png|.gif|.jpeg)$',i)#判断是否以该格式结尾
    if end == None:
        i=i+'.jpg'
    try:
        with open(word+'/%s'%i[-10:],'ab') as f:
            img=requests.get(i,timeout=3)
            f.write(img.content)
    except Exception as e:
        print(e)

4、运行我们的爬虫文件

我们可以去当前目录下查看 多出了一个名字为鞠婧祎的目录。

好了。是不是很方便实用、

完整代码如下

import requests
import os
import re

word=input("请输入你要下载的图片:")
if not os.path.exists(word):
    os.mkdir(word)

url="https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word="+word+""

#http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=LOL
#index改成flip
r=requests.get(url)
ret=r.content.decode()

result=re.findall('"objURL":"(.*?)",',ret)

for i in result:

    end=re.search('(.jpg|.png|.gif|.jpeg)$',i)#判断是否以该格式结尾
    if end == None:
        i=i+'.jpg'
    try:
        with open(word+'/%s'%i[-10:],'ab') as f:
            img=requests.get(i,timeout=3)
            f.write(img.content)
    except Exception as e:
        print(e)

图片类爬虫项目功能及思路分析:

接下来开始讲解如何通过Scrapy框架实现图片爬虫项目。

  • 有时候我们需要对互联网中的一些图片进行分析或参考,可以将这些图片爬取到本地储存起来,这样使用会更加方便。
  • 假设我们现在需要做一个商品的图片设计,需要参考网上的一些素材,此时通过手动打开网页查看会很麻烦,我们可以使用爬虫把所有的素材图片都保存到本地使用。

我们本章内容是实现爬取千图网的素材 需要实现的功能有:

  • 1、获取千图网中淘宝设计栏目下的所有图片素材
  • 2、将原图片素材保存到本地的对应目录中

为了提高项目开发的效率,避免在项目开发的过程中思路混乱,我们需要在项目开发前首先理清该项目的实现思路及实现步骤。 实现思路及实现步骤如下:

  • 1、对要爬取的网页进行分析,发现要获取的内容的规律,总结出提取对应数据的格式。总结出自动爬虫各页面的方式
  • 2、创建Scrapy爬虫项目
  • 3、编写好项目对应的 items.pypipelines.pysettings.py
  • 4、创建并编写项目中的爬虫文件,实现爬取当前列表页面的所有原图片(不是缩略图),以及自动爬取各图片列表页

图片类爬虫项目编写实战

首先我们要对爬取的网页进行分析。 打开要爬取的第一个网页: http://www.58pic.com/tb 我们要分析如何提取该页中所有素材的URL地址 此时我们用该页面中其中一个图片为例子来总结相关规律,比如我们以"淘宝精华橄榄油护肤品促销海报W"来看。查看其源代码 可以发现其对应的图片网址为: http://www.58pic.con/taobao/22927027.html 对应图片的缩略图地址为: http://pip.qiantucdn.com/58pic/22/92/70/27p58PIC2hw.jpg!qtwebp226 我们创建一个名为qtpjt的爬虫项目

然后该编写其对应的爬虫文件 将items.py 文件关键部分修改为如下:

import scrapy
class QtpjtItem(scrapy.Item):
	#define the fields for your item here like:
	#name = scrapy.Field()
	picurl = scrapy.Field()
	#建立picurl存储图片网址
	picid = scrapy.Field()
	#建立picid存储图片网址中的用户名

编写好items.py文件之后,我们需要编写pipelines.py文件,将pipelines.py文件修改为如下所示:

import urllib.request
class QtpjtPipeline(object):
    def process_item(self, item, spider):
        for i in range(0,len(item["picurl"])):
            thispic = item["picurl"][i]
            #根据上面总结的规律构造出原图片的URL地址
            trueurl = thispic+"_1024.jpg"
            #构造出图片在本地存储的地址
            localpath = "D:/Python/myweb/part19/pic"+item["picid"][i]+".jpg"
            urllib.request.urlretrieve(trueurl,filename=localpath)
        return item

然后修改配置文件settings.py 我们将配置文件修改为如下:

接下来我们还需要在该爬虫项目中创建对应爬虫,如下所示

此时基于basic模板创建了一个名为qtspd的爬虫

我们需要编写爬虫文件qtspd.py

# -*- coding: utf-8 -*-
import scrapy
import re
from qtpjt.items import QtpjtItem
from scrapy.http import Request

class QtspdSpider(scrapy.Spider):
    name = 'qtspd'
    allowed_domains = ['58pic.com']
    start_urls = ['http://58pic.com/']

    def parse(self, response):
        item = QtpjtItem()
        paturl = "(http://pic.qiantucdn.com/58pic/.*?).jpg"
        #提取对应网址
        item["picurl"] = re.compile(paturl).findall(str(response.body))

        patlocal = "http://pic.qiantucdn.com/58pic/.*?/.*?/.*?/(.*?).jpg"
        item["picid"] = re.compile(patlocal).findall(str(response.body))
        yield  item
        for i in range(1,201):
            nexturl = "http://www.58pic.com/tb/id-"+str(i)+".html"
            yield Request(nexturl,callback=self.parse)

调试与运行: