爬虫项目:scrapy爬取昵图网全站图片

一、创建项目、spider,item以及配置setting

创建项目:scrapy startproject nitu

创建爬虫:scrapy genspider -t basic nituwang nipic.com

写个item:

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

import scrapy
class NituItem(scrapy.Item):
    url = scrapy.Field()

配置setting(重要!):

1.首先打开User-Agent(反爬虫策略):

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'

2.ROBOTSTXT协议改为False(主要是为了顺利获取图片)

3.打开pipeline:

ITEM_PIPELINES = {
    'nitu.pipelines.NituPipeline': 300,
}

二、spider

(一)首先来分析昵图网中的各个分层链接


找到这三个模块的链接比较简单:


可以看出,只要找到a标签下的三个href链接就行了,抓到的内容附在主网页http://www.nipic.com后,例如http://www.nipic.com/media就可以进入这个模块的链接中,spider代码如下:

    #第一层链接
    def parse(self, response):
        Frist_url = response.xpath('//div[@class="newIndex-nav-condition fl"]/a/@href').extract()
        True_url = Frist_url[2:5]
        for i in range(len(True_url)):
            TrueTrue_url = "http://www.nipic.com/" + True_url[i]
            yield Request(url=TrueTrue_url,callback=self.next1)

(二)进入到第二层链接,如下图:


同理,从审查元素中抓取链接:


spider代码如下:

#第二层链接
    def next1(self,response):
        Second_url = response.xpath('//dd[@class="menu-item-list clearfix"]//a/@href').extract()

        for m in range(len(Second_url)):
            Second_true_url = "http://www.nipic.com/" + Second_url[m]
            yield Request(url=Second_true_url,meta={'key':Second_true_url},callback=self.next2)

(三)进入到第二层链接之后,就直接出现了多页存在图片了,思路越来越清晰:


看到这里,我们只需找到二层链接中的总页数,由此建立一个函数:

    def next2(self,response):
        #查找总页数
        page_num = response.xpath('//div[@class="common-page-box mt10 align-center"]/a/@href').extract()
        page_true_num = page_num[-1].split('=')[-1]
        for n in range(1,int(page_true_num)+1):
            page_url = str(response.meta['key']) + "?page=" + str(n)
            yield Request(url=page_url,callback=self.next3)

(四)接下来就是查找如何进入照片的第三层链接,以获取清晰大图:


二话不说,直接写xpath来拿链接:

#第三层链接
    def next3(self,response):
        img_url = response.xpath('//li[@class="works-box mb17 fl"]/div[@class="search-works-info"]/a/@href').extract()
        for k in range(len(img_url)):
            yield Request(url=img_url[k],callback=self.next4)

(五)最后一部,成败于此,进入到大图的链接:


拿下:

 #获取大图的链接
    def next4(self,response):
        img_big_url = response.xpath('//div[@class="show-img-section overflow-hidden align-center"]/img/@src').extract()[0]
        item = NituItem()
        item['url'] = img_big_url
        yield item

三、PIPELINE:

使用urllib.request中的urlretrieve来下载图片到本地当中

import urllib.request

class NituPipeline(object):
    def process_item(self, item, spider):
        filename = item["url"].split('/')[-1]
        file = "F:/python/python项目/nitu_img/" + filename
        urllib.request.urlretrieve(item["url"], filename=file)
        return item

四、运行爬虫

scrapy crawl nituwang --nolog

结果如下:


高清无码大图得到。完活

猜你喜欢

转载自blog.csdn.net/weixin_38654336/article/details/79616019