properties 拓展培训公司 Markdown laravel sed sass lua gulp Zeptojs vue使用教程 后台界面模板 nginx教程视频 electron安装 rxjava线程切换 websocket库 python开发安卓应用 matlab图像滤波 mysql配置远程连接 python实例 python安装mysql python中len函数 python中文 python函数参数 python的编译器 java链接mysql数据库 java的random java格式化字符串 java语言是什么 java连接mysql的jar包 java字符串相等 linux系统命令大全 linuxshell编程 js上传图片 ps插入表格 刷机工具下载 ezcad2 idea重命名快捷键 虚拟打印机安装 js日期格式化 python电子书
当前位置: 首页 > 学习教程  > 编程语言

scrapy爬取图片链接并保存到Mysql

2020/10/8 20:14:44 文章标签:

目录 背景 思路分析 代码展示 item文件 spider文件 pipelines文件 settings文件 总结 背景 这个国庆没有出去溜达,办完事后就在家一直待着,然后在B站看了一些scrapy爬虫的视频,本人也试着用scrapy爬了一些网站,在这里和大…

目录

背景

思路分析

代码展示

item文件

spider文件

 pipelines文件

settings文件 

 总结


背景

这个国庆没有出去溜达,办完事后就在家一直待着,然后在B站看了一些scrapy爬虫的视频,本人也试着用scrapy爬了一些网站,在这里和大家分享一下我的爬取方法和代码,有什么不对的地方,还请多多指教。 本文章仅为学习、交流,不得用于其他违法或商业用途。

思路分析

本次爬取的网站是尤果网,如图所示,该网页有9组主图组成,每组主图包括标题名称、姓名、照片风格和图片上传日期和下一页分页,点击分页可进行页面切换。我们这次要爬取的也是这些内容,然后再把主图的图片下载到本地。

接下来就是如何获取到这些信息,首先进入浏览器的开发者模式,然后鼠标点击并选择开发者模式左上角的箭头。然后将鼠标移至任意一个主图中,发现这些信息都在div标签下面,那接下来要做的就是获取这个网页信息,网页信息获取完成后再获取下一页的信息,大致流程如下图所示。

 

代码展示

item文件

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

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class YouguowangItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()      #标题名称
    date = scrapy.Field() #上传日期
    name = scrapy.Field() #模特名字
    style = scrapy.Field() #风格
    url = scrapy.Field()  #链接地址

    #pass

spider文件

该部分是用来进行网页信息获取和翻页

# -*- coding: utf-8 -*-
import scrapy
from youguowang.items import YouguowangItem

class YouguoSpider(scrapy.Spider):
    name = 'youguo'
    allowed_domains = ['www.ugirl.com']
    start_urls = ['https://www.ugirl.com/meinvtupian/']

    def parse(self, response):

       div_list = response.xpath('//div[@id="gallery-box"]/div')

       for div in div_list:
           item = YouguowangItem()
           item['url'] = div.xpath('./img/@src').extract_first()
           item['title'] = div.xpath('./aside/h3/text()').extract_first()
           item['name'] = div.xpath('./aside/p/text()').extract_first()
           item['style'] = div.xpath('./aside/p[2]/span/text()').extract_first()
           if item['style'] is not None:
               item['style'] = item['style'].strip()
           item['date'] = div.xpath('./aside/p[3]/text()').extract_first()
           #yield item
           #print('item-url',item['url'])
           yield  item


        #获取翻页信息
       for i in range(2,12):
            #print('当前地址是',i)
            next_url = 'https://www.ugirl.com/meinvtupian/p-{}.html'.format(i)
            print('next_url',next_url)
            yield scrapy.Request(
                next_url,
                callback=self.parse,
                meta={'item':item}

            )

 pipelines文件

用来下载图片和保存数据,这里使用Mysql进行数据保存,需要提前建立数据库和表信息。

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

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
from scrapy.pipelines.images import ImagesPipeline
import scrapy
from scrapy.exceptions import DropItem

import pymysql

#保存图片,可用
class YouguowangPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        print('item-url是',item['url'])
        #for image_url in item['url']:
            #print("图片连接:", image_url)
            #yield scrapy.Request(image_url)
        yield scrapy.Request(item['url'])

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        return item

#保存到数据库
class YouguowangPipelineB(object):
    def __init__(self):
        self.db = None
        self.cursor = None

    def process_item(self, item, spider):
        # 数据库的名字和密码自己知道!!!youguowang是数据库的名字
        self.db = pymysql.connect(host='localhost', user='root', passwd='sl-1006', db='youguowang')
        self.cursor = self.db.cursor()
        # 由于可能报错所以在这重复拿了一下item中的数据,存在了data的字典中
        data = {
            "title": item['title'],
            "url": item['url'],
            "date": item['date'],
            "name": item['name'],
            "style": item['style']

        }
        # 注意:MySQL数据库命令语句
        insert_sql = "INSERT INTO bole (title, url, date, name,style) VALUES (%s,%s,%s,%s,%s)"
        try:
            self.cursor.execute(insert_sql, (
            data['title'], data['url'], data['date'], data['name'], data['style']))
            self.db.commit()
            print('成功了')
        except Exception as e:
            print('问题数据跳过!.......', e)
            self.db.rollback()
        self.cursor.close()
        self.db.close()
        #return item

settings文件 

进行文件配置,设置请求头和开启下载通道。

BOT_NAME = 'youguowang'

SPIDER_MODULES = ['youguowang.spiders']
NEWSPIDER_MODULE = 'youguowang.spiders'
LOG_LEVEL = "WARNING"

ROBOTSTXT_OBEY = True


ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 1,
    'scrapy.pipelines.files.FilesPipeline': 2,
}

# 图片过滤器,最小高度和宽度,低于此尺寸不下载
IMAGES_MIN_HEIGHT = 110
IMAGES_MIN_WIDTH = 110

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/58.0.3029.110 Safari/537.36",
}

IMAGES_STORE = 'D:\\ImageSpider'
ITEM_PIPELINES = {
   'youguowang.pipelines.YouguowangPipeline': 300,
#     'youguowang.pipelines.YouguowangPipelineQ': 500,
   'youguowang.pipelines.YouguowangPipelineB':301
}

运行结果:

终端窗口显示

Mysql数据

 图片下载:

 总结

scrapy是一个十分强大的爬虫框架,刚刚接触时对不同的文件及用途都不是很熟悉,但随着慢慢深入了解会发现scrapy真的很好用,就仿佛又开启了一个新世界的大门,再送给大家一句我最近领会的一句话“你知道的越多,知道的就越少”。


本文链接: http://www.dtmao.cc/news_show_250236.shtml

附件下载

上一篇:JavaScript时间线

下一篇:吸烟者问题

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?