Scrapy爬取图片

1,173 阅读3分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

Scrapy描述🎨

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。

Scrapy框架主要由五大组件组成,分别是调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)、Scrapy引擎(Scrapy Engine)。 Scheduler接收url并发起请求,Downloader将内容下载下来,通过引擎和中间件处理掉无用的数据再发送到Spider, 我们根据自己的需要提取数据,请求成功就将数据保存到items里面存入Pipeline, 如果失败就会重新发送url到Scheduler

创建Scrapy项目💤

首先下载安装scrapy:pip install Scrapy

创建scrapy项目: scrapy startproject movieScrapy, 我的项目名是movieScrapy; 在spiders下创建爬虫文件: scrapy genspider spiderData 你要访问的网页域名 1.png 这是创建好的目录结构的样子 image.png

items.py 相当于一个封装类,用来封装要传到管道的数据;middlewares.py是中间件,一般不需要进行编写;pipelines.py用来处理数据, settings.py是配置文件

首先我们改一下settings配置文件

ROBOTSTXT_OBEY = False 默认是True,我们改成False,因为如果遵守robots协议,我们会很多东西都拿不到; CONCURRENT_REQUESTS = 32 最大并发请求,默认16,并不是越大越好; DOWNLOAD_DELAY = 2 下载延迟,可以避免访问次数过快ip被封; COOKIES_ENABLED = True 默认携带上一次访问的cookie; DEFAULT_REQUEST_HEADERS = {} 请求头,里面可以写User-Agent、Cookie、Referer; ITEM_PIPELINES 项目管道,300为优先级,越低越爬取的优先度越高

爬取图片❤

今天的任务是爬取图片,冲冲冲!!!

items.py

在items.py里面定义我们需要的字段,方便管道传输

import scrapy
class MoviescrapyItem(scrapy.Item):
    # 图片名称
    name = scrapy.Field()
    # 图片地址
    url = scrapy.Field()

爬虫文件.py

爬虫文件目录下的完整代码, 详细url地址我就用xxx代替了

class SpiderdataSpider(scrapy.Spider):
    name = 'spiderData'
    allowed_domains = ['x.com']
    start_urls = ['https://x.com/x/x/']

    def parse(self, response):
        articles = response.xpath("//div[@class='galleryWrapper']/section/section/section/section/article")
        for article in articles:
            url = article.xpath("./section/section/a/@href").extract()[0]
            yield scrapy.Request(url, callback=self.MainUrl)

    def MainUrl(self, response):
        data = response.text
        name = response.xpath("//div[@class='image_name']/text()").extract()[0]
        url = response.xpath("//section[@class='image-card']/section/figure/div[@class='unzoomed']/img/@src").extract()[0]
        url = "https:" + url
        item = MoviescrapyItem()
        item['name'] = name
        item['url'] = url
        yield item

name = 'spiderData' 启动文件,就是通过这个name scrapy crawl spiderDataallowed_domains = ['x.com'] 不是这个域名下的链接会自动过滤,name和allowed_domains都是创建文件时自动生成的; parse函数里面的response已经自动下载好了数据资源,可以通过response.text进行查看,通过xpath可以去获取目录下所需要的数据,其中extract()[0]可以提取文字

yield scrapy.Request(url, callback=self.MainUrl) 我们在循环里不断提取图片详细页的链接,并通过 yield 来发起请求,并且还将函数 MainUrl 作为回调函数来从响应中提取所需的数据。 yield在每次循环中都会返回数据

item = MoviescrapyItem()将获取到的数据实例化通过yield传到管道

pipelines.py

import urllib.request

class MoviescrapyPipeline:
    def __init__(self):
        pass

    def process_item(self, item, spider):
        name = item['name']
        urllib.request.urlretrieve(item['url'], "./Loadimg/" + name + '.jpg')
        return item

    def close_spider(self, spider):
        pass

__init__ 函数是最开始执行的,我们可以用来准备存储文件的打开及一些设置,像csv process_item 就是处理数据的,我们保存图片就是在这里,item也就是我们之前通过yield传递过来的值 close_spider 我们可以用来关闭csv文件这样

QQ图片20211104192718.png

这样图片就获得了🎈🎈🎈