Scrapy爬取图片网站——最详细的入门爬虫教程,新手入门干货,不进来看一下?

开始前准备

这次爬虫使用scrapy,所以用到的工具必然是python3.7,scrapy,pycharm这些东西,
目标网站:http://pic.netbian.com 彼岸图网,个人非常喜欢的图片网站,完全公开免费,几乎没有防爬措施,对于爬虫新手来说是费非常好的练手网站,不过各位练手的时候注意限制爬虫速度,不要对人家造成太大的负载。

项目创建

在项目目录下创建爬虫项目,pycharm或者cmd输入创建命令

#标准的创建工程命令
scrapy startproject BiAnImgSpider

然后创建爬虫文件:

#netbian是创建爬虫的名字,pic.netbian.com是爬虫目标网站url
scrapy genspider netbian pic.netbian.com

再然后在项目目录下写个main.py 文件,用来模拟cmd命令测试和启动爬虫
main.py

from scrapy.cmdline import execute
import sys
import os

#这里就不细说了,反正命令行的命令都用这个叫execute的函数来执行就完事了,
#命令用列表存放
#每次运行这个文件就行了
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(["scrapy","crawl","netbian"])

再然后就是正式分析编写这个爬虫的时候了

分析

我的目标是爬取首页照片墙上展示的图片内容,包括下一页,下下页以及后续所有页的内容,在这里暂时不细分分类爬取。

我的思路是:根据首页的图片元素获取图片详情页的url > 进入详情页,然后获取详情页里大图的url > 然后根据大图的url交给scrapy下载保存

是不是很简单?

第一步:根据主站入口http://pic.netbian.com进入首页:
在这里插入图片描述
通过控制台定位到目标图片上,找到该图片的详情页的url:
在这里插入图片描述
图中a标签内的链接即是我们想要获取的url地址,当然这个要和网站url:http://pic.netbian.com拼接才能使用,即http://pic.netbian.com/tupian/25037.html是我们要的目标url,

下一步就是进入这个url,并获取该图片的大图url,方法也很简单,定位大图然后查看网页源码,就能看到大图的url了:

在这里插入图片描述
就这么简单粗暴的获取了最终想要的url,交给scrapy下载就好了,通过scrapy重复多次操作,这个爬取图片的功能就完成了。是不是爆炸简单??

开始写代码

打开spider文件,也就是我的netbian.py
引入这些要用到和可能会用到的模块,最好用到再引入,我这是完事后复制的所有用到的模块。

from urllib import parse
from scrapy.http import Request
from ..items import NetBianSpiderItem
import re
import scrapy
import time

parse函数

parse函数是spider运行时第一个运行的函数,在这里我想要他获取下一个分页的url,然后通过yield Request()中的meta传给下一个处理本页面内容的函数,再下一个函数处理完当前页面的所有图片url后,再次请求parse函数获取下一个页面的url。

可能写的有点绕

反正parse函数的功能就是发送一个页面的url给page_parse函数处理再page_parse函数处理完后再次请求parse函数,这时parse函数给他下一个页面的url处理,依次类推,知道这个网站被爬的干干净净

    def parse(self, response):
        '''
        返回分页url给下一个函数处理
        :param response:
        :return:
        '''
        #获取下一页的url
        next_page_url = response.xpath('//div[@class="page"]/a[contains(text(),"下一页")]/@href').extract()[0]
        next_url = parse.urljoin(self.start_urls[0],next_page_url)
        print(response.url)
        print(next_url)
        yield Request(response.url,
                      meta={'next_url':next_url},
                      callback=self.page_parse,
                      )

用response.xpath()获取‘下一页’按钮中的url,与起始url拼接获取下一页的网站url
至于xpath规则嘛,需要各位费点心去琢磨一下,对于爬虫来说xpath,css,re这些东西还是需要用点时间去学习一下的。

page_parse函数

程序到了page_parse函数
这个函数功能就是依次爬取在场所有图片的详情页url,组成列表,
然后通过for in迭代这个列表并拼接完整的图片详情页url
再然后发送这个url给下一个函数(img_url_parse)处理,

细节:
我们拼接url用到的就是urllib中的parse中的urljoin函数

from urllib import parse
parse.urljoin(self.start_urls[0],url)

很好用的函数

    def page_parse(self,response):
        '''
        根据当前分页,获取图片详情页的url
        :param response:
        :return:
        '''
        # 获取图片详情页的html元素信息列表
        img_list = response.xpath('//ul[@class="clearfix"]/li/a/@href').extract()
        next_url = response.meta['next_url']
        print('next_url:'+next_url)
        for url in img_list:
            img_html_url = parse.urljoin(self.start_urls[0],url)
            print(img_html_url)
            yield Request(img_html_url,callback=self.img_url_parse,dont_filter=True)

        yield Request(next_url,callback=self.parse,dont_filter=True)

在本页内容处理完后,for循环结束,那就得开始下一轮,所以继续请求parse函数,带上下一页的url,parse会给page_parse下一页的内容。

img_url_parse函数

这个函数主要就是进入图片详情页爬取大图url,逻辑很简单
这里要用到item,得先去items.py写好这个类,在实例化对象,将结果通过yield传给item就行了

    def img_url_parse(self,response):
        '''
        进入图片详情页,爬取大图url
        获取标题
        :param response:
        :return:
        '''
        # 实例化item对象
        item = NetBianSpiderItem()
        print('img_url_parse is running')
        img_big_url = response.xpath('//div[@class="photo-pic"]/a/img/@src').extract()[0]
        title = response.xpath('//div[@class="photo-pic"]/a/img/@alt').extract()[0].strip()
        title_list = title.split()
        #定义图片标题
        img_title = ''
        img_title = img_title.join(title_list) + '.jpg'
        #拼接img_url
        img_url = parse.urljoin(self.start_urls[0],img_big_url)
        item['img_url'] = [img_url]
        item['img_title'] = [img_title]
        item['img_html_url'] = [response.url]

        yield item

切记[item_url]这么些不是瞎写的,不转成列表小心报错,

items.py

讲道理item类的编写很简单,每个字段都用scrapy.Field()写就好了,比Django的model还简单

class NetBianSpiderItem(scrapy.Item):

    img_url = scrapy.Field()
    img_title = scrapy.Field()
    img_html_url = scrapy.Field()

item的强大建议自行百度:www.baidu.com

settings.py更改配置

第一步ROBOTSTXT_OBEY = False:
在这里插入图片描述
第二步加入imagePipline,并更改优先级。(数字越小优先级越大)
注意:这里切记要安装PIL,不然报错,赶紧去pip install pillow
在这里插入图片描述
图片设置
在这里插入图片描述
IMAGES_STORE = ‘img’ 设置的img是指图片保存路径,这时项目根目录下
IMAGES_URLS_FIELD = 'img_url’这句设置的是图片url的item字段名,这里是‘img_url’

适当限速:
在这里插入图片描述

到这里大概就结束了

到这里大概功能就完成了,main文件run起来图片就会自动下载,(没问题的话),这个项目比较简单,数据库都还没有用上,也没有分类爬取存储,这个项目非常适合爬虫入门新手来熟悉一下爬虫流程和scrapy框架,

感谢http://pic.netbian.com,良心网站

后续还会迭代更新各种功能,记得关注

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值