这次我们利用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.cfg :项目的配置文件
imageNet :项目的Python模块,将会从这里引用代码
items.py :项目的目标文件
pipelines.py :项目的管道文件
settings.py :项目的设置文件
spiders/:存储爬虫代码目录
代码写好,程序开始运行...
引擎
:Hi!Spider
, 你要处理哪一个网站?
Spider
:老大要我处理xxxx.com。
引擎
:你把第一个需要处理的URL给我吧。
Spider
:给你,第一个URL是xxxxxxx.com。
引擎
:调度器
,我这有request请求你帮我排序入队一下。
调度器
:好的,正在处理你等一下。
引擎
:调度器
,把你处理好的request请求给我。
调度器
:给你,这是我处理好的request
引擎
:下载器,你按照老大的下载中间件
的设置帮我下载一下这个request请求
下载器
:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎
告诉调度器
,这个request下载失败了,你记录一下,我们待会儿再下载)
引擎
:Spider
,这是下载好的东西,并且已经按照老大的下载中间件
处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()
这个函数处理的)
Spider
:(处理完毕数据之后对于需要跟进的URL),Hi!引擎
,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。
引擎
:管道
我这儿有个item你帮我处理一下!调度器
!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。
管道:调度器
:好的,现在就做!
我们在书写代码的时候,可能会根据个人的书写喜好原因等等,顺序会不太一样,本人的编写代码顺序如下:
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的知识的。