scrapy框架爬取图片的那些事

347次阅读
没有评论

🐸文章适合于所有的相关人士进行学习🐸
🐶各位看官看完了之后不要立刻转身呀🐶
🐼期待三连关注小小博主加收藏🐼
🐤小小博主回关快 会给你意想不到的惊喜呀🐤


文章目录

    • ☀️scrapy爬取照片分析
        • 🐱爬取照片展示
        • 🐱介绍异步保存MySQL数据
        • 🐱scrapy下载图片优势
        • 🐱scrapy下载图片思路
    • 🌸scrapy爬取照片实战部分
        • 🌻前期准备
        • 🌻rule规则
    • 🌴scrapy爬取照片实代码部分
        • 🌱settings部分
        • 🌱starts部分
        • 🌱items部分
        • 🌱zcool部分
        • 🌱pipelines部分(保存文件)

☀️scrapy爬取照片分析

🐱爬取照片展示

scrapy框架爬取图片的那些事
搞错了搞错了!怎么把我拍的搞上来了!
咱们要爬就爬好的,不好的咱还不爬呢!上菜
scrapy框架爬取图片的那些事
scrapy框架爬取图片的那些事

🐱介绍异步保存MySQL数据

1.使用twisted.enterprise.adbapi来创建连接池。
2.使用runInteraction来运行插入sql语句的函数。
3.在插入sql语句的函数中,第一个非self的参数就是cursor对象,使用这个对象执行sql语句。
scrapy框架爬取图片的那些事

🐱scrapy下载图片优势

  • Scrapy框架下载文件(包括图片)有自己的一套解决方案,比我们直接使用urlretrieve更加有优势。
  • 避免重新下载最近已经下载过的文件。
  • 可以方便的指定文件存储的路径。
  • 可以将下载的图片转换成通用的格式。比如png或jpg。
  • 可以方便的生成缩略图。
  • 可以方便的检测图片的宽和高,确保他们满足最小限制。
  • 异步下载,效率非常高。
  • 反正就是scrapy好,very good。

    🐱scrapy下载图片思路

  • 定义items,上面有两个字段,一个是image_urls,一个是images。其中image_urls是用来存储图片的链接,由开发者把数据爬取下来后添加的。再加上一个title。
  • 使用scrapy.pipelines.images.ImagesPipeline来作为数据保存的pipeline。
  • 在settings.py中设置IMAGES_SOTRE来定义图片下载的路径。
  • 如果想要有更复杂的图片保存的路径需求,可以重写ImagePipeline的file_path方法,这个方法用来返回每个图片的保存路径。
  • 🌸scrapy爬取照片实战部分

    🌻前期准备

    这里我们已经讲了很多遍了,第一机器人协议要进行改动,不改动的话大多部分网站都爬不了,最后还一脸懵逼,为什么呀?因为你蠢呀!第二要在settings中进行headers添加,当然了这一部分也是非常重要,反爬虫最基本基本的部分了。然后把管道打开,这里我们多介绍一点就是把

    DOWNLOAD_DELAY = 3

    打开,隔一段时间在进行下载防止下载太快,封掉ip。

    🌻rule规则

    这里我们要的地方大概就是两个部分,第一就是翻页的规则,第二就是我们详情页面的规则。
    当我们进行翻页的时候右键点击详情发现??啥也没发现,也没有跳转页面的网址啥的,这可怎么办呢?但是我们可以看到什么变化了呢?主网址变化了

    https://www.zcool.com.cn/discover?cate=0&page=1

    当我们翻页的时候我们发现page=1是进行变化的,所以哈,我们直接复制page=1,到源码中进行找,最后发现了规律。初始网页定义为上方然后rule就是下方这块。

    '.+page\d+'

    详情url就很正常了!

    '.+work/.+html'

    嗯,自己动手奥!!!去看看这个世界吧!
    scrapy框架爬取图片的那些事

    剩下本节的难点就是文件保存部分啦我们在代码中进行讲解。

    🌴scrapy爬取照片实代码部分

    🌱settings部分

    ROBOTSTXT_OBEY = False DOWNLOAD_DELAY = 3 DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36' } ITEM_PIPELINES = { 'imagedownload.pipelines.ImagedownloadPipeline': 300, #'scrapy.pipelines.images.ImagesPipeline': 1 } IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(__file__)),'images')#这里我们后面做出讲解

    🌱starts部分

    不多说

    from scrapy import cmdline cmdline.execute("scrapy crawl lyw_spider".split(" "))

    🌱items部分

    class ImagedownloadItem(scrapy.Item): image_urls=scrapy.Field() images=scrapy.Field() title=scrapy.Field()

    🌱zcool部分

    rule规则依旧是翻页需要跟进,详情页面不需要跟进但是需要回馈给parse_detail函数。

    from scrapy.spiders.crawl import CrawlSpider,Rule from scrapy.linkextractors import LinkExtractor from ..items import ImagedownloadItem

    class ZcoolSpider(CrawlSpider): name = 'zcool' allowed_domains = ['zcool.com.cn'] start_urls = ['https://www.zcool.com.cn/discover?cate=0&page=1'] rules = ( Rule(LinkExtractor(allow='.+page\d+'),follow=True), Rule(LinkExtractor(allow='.+work/.+html'),callback="parse_detail",follow=False) )

    def parse_detail(self, response): image_urls=response.xpath("//div[@class='photoInformationContent']//img/@src").getall()#这里一定要注意就是img一定要//,因为我们要取到所有的img title=response.xpath("//div[@class='contentTitle']/span/text()").get()#获取title item=ImagedownloadItem(title=title,image_urls=image_urls) yield item#返回给item

    🌱pipelines部分(保存文件)

    这里做一下记录,第一个库是进行传递。
    我们ctrl双击imagespipeline,就会发现file_path函数,这里主要就是保存图片到full函数当中,如果我们想要更复杂的保存方式,那么我们可以重新写这个file_path,而get_media_requests函数的作用是把item提取出来,就是我想要的title等信息,其中get函数发生在下载照片之前,file函数发生在下载之后。

    from scrapy.pipelines.images import ImagesPipeline from imagedownload import settings import os import re

    class ImagedownloadPipeline(ImagesPipeline): def get_media_requests(self, item, info): media_requests=super(ImagedownloadPipeline, self).get_media_requests(item,info)#将item值取出来 for media_request in media_requests: media_request.item=item return def file_path(self, request, response=None, info=None, *, item=None): origin_path=super(ImagedownloadPipeline, self).file_path(request,response,info)#原始存储照片的路径,images/full title=request.item['title']#找到item中的title title = re.sub(r'[\\/:\*\?"<>\|]', '', title)#如果title中有这种符号 使用‘’代替掉 save_path=os.path.join(settings.IMAGES_STORE,title)#进行了一次网址拼接 目前是images/title if not os.path.exists(save_path): os.mkdir(save_path)#如果image下不存在这种文件 则创建这样的文件 image_name=origin_path.replace("full/","") return os.path.join(save_path, image_name)

    这样我们就完成了对图片的下载过程。

    🐸文章适合于所有的相关人士进行学习🐸
    🐶各位看官看完了之后不要立刻转身呀🐶
    🐼期待三连关注小小博主加收藏🐼
    🐤小小博主回关快 会给你意想不到的惊喜呀🐤

    scrapy框架爬取图片的那些事

    神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

    相关文章:

    版权声明:Python教程2022-10-28发表,共计4192字。
    新手QQ群:570568346,欢迎进群讨论 Python51学习