爬虫之Scrapy框架爬取彼岸壁纸案例分享

爬虫之Scrapy框架爬取彼岸壁纸案例分享

前段时间在网上看到有人爬取了彼岸壁纸的案例,由于爬取的图片较多,爬取速度感觉不快,所以就自己写了个Scrapy框架,个人觉得爬取速度快多了。
代码如下。


一、建立Scrapy项目

在终端输入以下代码建立scrapy框架

scrapy startproject bianwallpaper
cd wallpaper
scrapy genspider bian netbian.com

二、建立启动文件start

建立启动文件的目的是为了避免繁琐的终端输入命令,提高效率

from scrapy import cmdline

cmdline.execute(['scrapy', 'crawl', 'bian'])

三、 设置settings

在settings文件中进行相关设置,以便顺利的爬取网站和使用管道
1.设置LOG_LEVELl等级并关闭ROBOTSTEXT协议,注意:必须全部为大写

在这里插入图片描述
2. 设置headers
在这里插入图片描述
3. 打开管道pipelines
在这里插入图片描述

四、在spiders中建立爬取逻辑

import scrapy
import os


class BianSpider(scrapy.Spider):
    name = 'bian'
    allowed_domains = ['netbian.com']
    url = 'http://www.netbian.com/{}/index{}.htm'
    category = ['rili', 'dongman', 'fengjing', 'meinv', 'youxi', 'yingshi', 'dongtai', 'weimei', 'sheji', 'keai', 'qiche', 'huahui', 'dongwu', 'jieri', 'renwu', 'meishi', 'shuiguo', 'jianzhu', 'tiyu', 'junshi', 'feizhuliu', 'qita', 'wangzherongyao', 'huyan', 'lol']
    page_num = int(input('请输入要爬取的页码数(输入0表示爬取总页数):'))
    page_index0 = ''
    i = 0
    j = 1
    start_urls = [url.format(category[i], page_index0)]

    def parse(self, response):
        # 建立目标文件夹,用来保存图片
        dir_path = f'D:\\python-course\\practice2\\彼岸壁纸\\{self.category[self.i]}'
        if not os.path.exists(dir_path):
            os.mkdir(dir_path)

        # 获取每个分类的总页数
        if self.page_num == 0:
            total_pages = int(response.xpath('//div[@class="page"]/a/text()').extract()[-2])
            self.page_num = total_pages


        li_lst = response.xpath('//div[@class="list"]/ul/li')
        for li in li_lst:
            item = {}
            title = li.xpath('a/b/text()').extract_first()
            href = li.xpath('a/@href').get()
            if title:
                item['title'] = title  # 获取图片对应的标题
                item['href_url'] = response.urljoin(href)  # 获取下一级的url,以便爬取分辨率更高的壁纸
                item['save_dir'] = dir_path
                yield scrapy.Request(
                    url=item['href_url'],
                    callback=self.parse_href_url,
                    meta={'item': item}
                                     )

            # 过滤掉没用的图片网址
            else:
                continue
       

        # 判断是否爬取完某一分类所需的所有壁纸,爬取完后开始爬取下一分类的壁纸
        if self.j < self.page_num:
            self.j += 1
            self.page_index = self.page_index0
            self.page_index += '_' + str(self.j)
            next_url = f'http://www.netbian.com/{self.category[self.i]}/index{self.page_index}.htm'
            yield scrapy.Request(url=next_url)
            print('开始爬取下一页内容。。。')
        else:
            self.i += 1
            if self.i < len(self.category):
                self.j = 1
                new_url = self.url.format(self.category[self.i], self.page_index0)
                yield scrapy.Request(url=new_url)
                print(f'开始爬取{self.category[self.i]}的内容。。。')


    def parse_href_url(self, response):
        item = response.meta['item']
        item['img_src'] = response.xpath('//div[@class="pic"]/p/a/img/@src').get()  # 获取到所需的图片url
        yield item

五、 在管道pipelines中保存图片

import urllib.request

class BianwallpaperPipeline:
    count = 0
    def process_item(self, item, spider):
        print(item['img_src'])
        self.count += 1
        print(self.count)
        urllib.request.urlretrieve(item['img_src'], item['save_dir']+f'\\{item["title"]}{self.count}.png')  # 保存文件
        return item

结果展示

在这里插入图片描述

总结

scrapy爬取数据确实要比一般的方法快很多,尤其在爬取的内容非常多时。但是,个人觉得scrapy使用起来也是挺繁琐的,需要不停的切换文件来进行调试。总之,如果不是爬取的内容太多,我还是会选择用普通方法来爬取。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值