利用Scrapy爬取壁纸图片_Jay丶千珏的博客-程序员信息网

技术标签: Python编程由简到繁  

这次我们利用scrapy来爬取一个壁纸图片网站的壁纸图片,并且把它下载下来。地址链接为:http://pic.netbian.com/,这里我们爬取美食分类的图片。

1.首先我们先要去建立一个scrapy框架,定义爬虫类等等。

2.在image.py中写代码。

# -*- coding: utf-8 -*-
import scrapy
from ..items import  ImagenetItem

class ImageSpider(scrapy.Spider):
    name = 'image'
    allowed_domains = ['pic.netbian.com']
    start_urls = ['http://pic.netbian.com/4kmeishi/']

    def parse(self, response):
    # 根据响应来找到指定的内容,现在找到的是img的src属性
        img_list=response.xpath('//ul[@class="clearfix"]/li/a/img/@src')
        print(img_list)
        for img in img_list:
            item=ImagenetItem()
            # 拼接url,得到完整的网址
            src='http://pic.netbian.com'+img.extract()
            # print(src)
            # 将得到的下载地址放入数据模型中
            ## 下载地址要包在列表当中
            item['src']=[src]
            # 将数据模型传输给管道
            yield item
        #获取下一页的链接
        next_url=response.xpath('//div[@class="page"]/a[text()="下一页"]/@href').extract()
        print('-------------------------------------------------------'
        if len(next_url)!=0:
            # print(next_url)
            url='http://pic.netbian.com'+next_url[0]
            # 将url传给scrapy.Request 得到的结果继续用self.parse进行处理
            yield scrapy.Request(url=url,callback=self.parse)

这个就是首先获取图片的链接,拼接成完整的网址。然后把图片的下载链接传到管道里面。然后获取下一页的链接,把这个链接返回到最开始的地方使用,获取下一页的图片所有链接。

3.items.py中书写代码如下。

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class ImagenetItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    src=scrapy.Field()
    pass

4.settings.py中做以下操作。

# ROBOTSTXT_OBEY = True或者等于False

TEM_PIPELINES = {
   # 'imageNet.pipelines.ImagenetPipeline': 300,
   #  scrapy中专门负责图片下载的管道
    'scrapy.pipelines.images.ImagesPipeline':1
}
# 图片的存储路径
IMAGES_STORE='imageDownLoad'
# 图片的下载地址,这是根据item中的字段来设置哪一个内容需要被下载
IMAGES_URLS_FIELD='src'

在终端中输入命令:scrapy crawl image,按下回车,会得到以下的内容

这个就是我们爬取下载下来的图片。这样便算是完成了这个简单的项目。

再给大家说一下scrapy整个的运作流程,我从网上找到了一个很形象的叙说

制作 Scrapy 爬虫 一共需要4步:

  1. 新建项目 (scrapy startproject xxx):新建一个新的爬虫项目
  2. 明确目标 (编写items.py):明确你想要抓取的目标
  3. 制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
  4. 存储内容 (pipelines.py):设计管道存储爬取内容

scrapy.cfg :项目的配置文件

imageNet :项目的Python模块,将会从这里引用代码

items.py :项目的目标文件

pipelines.py :项目的管道文件

settings.py :项目的设置文件

spiders/:存储爬虫代码目录

Scrapy的运作流程

代码写好,程序开始运行...

  1. 引擎:Hi!Spider, 你要处理哪一个网站?

  2. Spider:老大要我处理xxxx.com。

  3. 引擎:你把第一个需要处理的URL给我吧。

  4. Spider:给你,第一个URL是xxxxxxx.com。

  5. 引擎调度器,我这有request请求你帮我排序入队一下。

  6. 调度器:好的,正在处理你等一下。

  7. 引擎调度器,把你处理好的request请求给我。

  8. 调度器:给你,这是我处理好的request

  9. 引擎:下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求

  10. 下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)

  11. 引擎Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的)

  12. Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。

  13. 引擎管道 我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。

  14. 管道:调度器:好的,现在就做!

我们在书写代码的时候,可能会根据个人的书写喜好原因等等,顺序会不太一样,本人的编写代码顺序如下:

1.我们先新建立好一个scrapy框架和爬虫类等等。

2.编写代码,获取我们所需要的内容,这里我们是获取到了图片的链接。然后对链接进行处理,拼接等等。 src='http://pic.netbian.com'+img.extract()

3.获取下一页的链接,拼凑成完整的网址,并且利用 yield scrapy.Request(url=url,callback=self.parse)构成一个循环。

4.进入到items.py中,编写我们获取的内容变量。src=scrapy.Field()

5.回到image.py中,引入模块:from ..items import  ImagenetItem,编写上: 

item=ImagenetItem()
item['src']=[src]
 yield item

6.进入到settings.py中,编写程序:

# ROBOTSTXT_OBEY = True或者等于False

TEM_PIPELINES = {
   # 'imageNet.pipelines.ImagenetPipeline': 300,
   #  scrapy中专门负责图片下载的管道
    'scrapy.pipelines.images.ImagesPipeline':1
}
# 图片的存储路径
IMAGES_STORE='imageDownLoad'
# 图片的下载地址,这是根据item中的字段来设置哪一个内容需要被下载
IMAGES_URLS_FIELD='src'

这里imageDownLoad是一个路径,你也可以在桌面或者其他文件夹下新建一个文件夹。把imageDownLoad替换成新建文件夹的路径。

IMAGES_URLS_FIELD='src'中src就是我们想要下载图片的链接。

7.终端中,输入命令,scrapy crawl image,静静的等它下完就好了。

好了,本次的分享就先告一段落,本人会不定时的继续和大家分享有关python的知识的。

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42543244/article/details/81457743

智能推荐

IPv4地址共享技术知多少_ipv4共享地址_ipbaobao的博客-程序员信息网

 在我们能够迁移到IPv6之前,IPv4地址肯定就耗光了,因此我们必须渡过一段时间,不仅有IPv4与IPv6共存,而且是IPv4地址共享的时代。 IPv4地址共享技术大致有两类。一种是运营商运营NAT,给用户分配的是RFC1918的地址;另外一种是为用户分配公开IPv4地址,通过划分不同的port区间共享。前一种技术的典型代表是Carrier Grade NAT (CGN), 也

spark常用命令总结_何以MDay的博客-程序员信息网

spark命令总结:yarn application -list : 列出所有正在执行的任务。spark-submit 提交任务任务。以及各参数的含义。spark-submit \–master yarn \–jars required_jars/spark-streaming-kafka-0-8-assembly_2.11-2.4.3.jar \–deploy-mode cluster \–num-executors 1 \–executor-memory 1G \–driver-m

枚举 画家问题_画笔样式枚举_aahhxx的博客-程序员信息网

问题描述:有一个正方形的墙,由N*N个正方形的砖组成,其中一些砖是白色的,另外一些砖是黄色的。Bob是个画家,想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i, j)个位置的砖时, 位置(i-1, j)、 (i+1, j)、 (i, j-1)、 (i, j+1)上的砖都会改变颜色。请你帮助Bob计算出最少需要涂画多少块砖,才能使所有砖的颜色都变成黄色。输入

matlab经纬度坐标与高斯坐标的转换(proj4)-5_matlab经纬度坐标转换_苏源流的博客-程序员信息网

北京54,西安80,wgs84坐标都是是大地坐标,也就是我们通常所说的经纬度坐标,但是它们基于的椭球体不同,我国当前的基本比例尺地形图都是基于北京54和西安80的,而GPS接受的定位数据是基于WGS84的。UTM投影坐标UTM是一种投影坐标,是将球面经纬度坐标经过投影算法转换成的平面坐标,即通常所说的XY坐标.WGS-84坐标系WGS-84坐标系(World Geodetic Sy...

百度翻译爬虫(案例练习:POST 请求)_进击的Spider的博客-程序员信息网

#!/usr/bin/env python# -*- coding:utf-8 -*-import urllib.requestimport urllib.parseimport jsonimport ssl# 通过抓包工具,获取接口post_url = 'https://fanyi.baidu.com/v2transapi'headers = { 'User-Age...

随便推点

《我是一只IT小小鸟》读书笔记(2)_dnn93917的博客-程序员信息网

本周阅读了《我是一只IT小小鸟》的第二部分,即居振梁的自述,这一部分与上一部分不同,我与这位前辈的共鸣不强,对其观点的反对之处却有一些。 先说我认同的观点吧。 首先,关于“课内”与“课外”,确实,现在的某些必修课程对于IT工程师或是科学家来说,可能一辈子都不会用到(比如原子物理),但是这些必修课程是计入个人成绩的,它们也许不会影响你的软工水平,但是会影响...

学习总结_daniel-hdy的博客-程序员信息网

最近在学习基于数据和概率模型的推理方法,包括蒙特卡洛采样、贝叶斯方法、狄利克雷过程等等,希望能够有时间总结一下,写成博客,目的有两个:一是希望自己能够把所学的内容总结一下,二是讲给别人听也能够让自己加深对所学的理解。内容会不定期更新。...

一次ORA-00600问题的排查和分析(下)_congbao6525的博客-程序员信息网

继续昨天对于 ORA-00600问题的排查和分析(上)http://blog.itpub.net/23718752/viewspace-1696076/我们发现了一大堆的ORA错误。我们首先排除了deadlock造成的o...

ftp不能登录报错_weixin_30736301的博客-程序员信息网

虚拟机装好RedHat后,准备使用filezilla连接,输入IP地址,root用户,密码,快速连接,报错:530 Permission denied。故障排除:1.首先检查系统是否开启了vsftp服务,如果没有开启,先开启该服务。2.查看配置vsftpd的配置,配置文件中限定了vsftpd用户连接控制配置。vsftpd.ftpusers:位于/etc/vsftpd目...

docker容器内部命令的一些日常使用(持续更新)_Michloas的博客-程序员信息网

1.mysql容器使用命令1.1使用命令行进入docker容器内部:sudo docker exec -it containerID /bin/bash 1.2使用mysql用户进行登录查看:mysql -uedc_mng -p根据提示输入密码即可进入,进入之后使用方式与非镜像方式一致2.容器中安装vim2.1 使用 apt-get install vim 命令进行安装操作现上图错误,需要先使用2...

网红题[‘1‘,‘2‘,‘3‘].map(parseInt)_KC-Yu的博客-程序员信息网

上周迅雷面试的时候,面试官小姐姐问到了一道这样的网红题,当时我对parseInt的第二个传参还不太清楚,所以也没法答上来,事后觉得这个考题挺有意思的,所以记录一下a = [‘1’,‘2’,‘3’].map(parseInt)console.log(a) // [1,NaN,NaN]map函数map的参数是一个函数,两个分别是当前元素值和当前index值。parseInt函数parseInt函数的用法及返回结果 parseInt("2");//2----------1 parseI

推荐文章

热门文章

相关标签