Scrapy框架学习(四)爬取360摄影美图

我们要爬取的网站为http://image.so.com/z?ch=photography,打开开发者工具,页面往下拉,观察到出现了如图所示Ajax请求,

其中list就是图片的详细信息,接着观察到每个Ajax请求的sn值会递增30,当sn为30时,返回前30张图片,当sn为60时,返回第31到60张图片,所以我们每次抓取时需要改变sn的值。接下来实现这个项目。

首先新建一个项目:scrapy startproject images360

新建一个Spider:scrapy genspider images images.so.com

在settings.py中定义爬取的最大量:MAX_PAGE=10

定义一个Item以接收Spider返回的Item:

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

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

import scrapy

class ImageItem(scrapy.Item):
    collection = table = ‘images‘
    id = scrapy.Field()
    url = scrapy.Field()
    title = scrapy.Field()
    thumb = scrapy.Field()

修改images.py:

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Spider,Request
from urllib.parse import urlencode
import json
from images360.items import ImageItem

class ImagesSpider(scrapy.Spider):
    name = ‘images‘
    allowed_domains = [‘images.so.com‘]
    start_urls = [‘http://images.so.com/‘]

    def start_requests(self):
        data = {‘ch‘:‘photography‘,‘listtype‘:‘new‘}
        base_url = ‘https://image.so.com/zj?‘
        for page in range(1,self.settings.get(‘MAX_PAGE‘)+1):
            data[‘sn‘] = page * 30
            params = urlencode(data)
            url = base_url + params
            yield Request(url,self.parse)

    def parse(self, response):
        result = json.loads(response.text)
        for image in result.get(‘list‘):
            item = ImageItem()
            item[‘id‘] = image.get(‘imageid‘)
            item[‘url‘] = image.get(‘qhimg_url‘)
            item[‘title‘] = image.get(‘group_title‘)
            item[‘thumb‘] = image.get(‘qhimg_thumb_url‘)
            yield item

利用urlencode()方法将data转化为URL的get参数,每次爬取30张图片直到爬取完成。

修改settings.py中ROBOTSTXT_OBEY变量为False,这个变量代表是否遵守网站的爬取规则,若不修改则无法爬取。

接下来我们要把爬取到的数据存入数据库,新建数据库以及表的操作在此不再赘述。创建好数据库及表后,我们需实现一个Item Pipeline以实现存入数据库的操作:

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

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

from scrapy import Request
from scrapy.exceptions import DropItem
import pymysql

class MysqlPipeline():
    def __init__(self,host,database,user,password,port):
        self.host = host
        self.database = database
        self.user = user
        self.password = password
        self.port = port

    @classmethod
    def from_crawler(cls,crawler):
        return cls(
            host=crawler.settings.get(‘MYSQL_HOST‘),
            database=crawler.settings.get(‘MYSQL_DATABASE‘),
            user=crawler.settings.get(‘MYSQL_USER‘),
            password=crawler.settings.get(‘MYSQL_PASSWORD‘),
            port=crawler.settings.get(‘MYSQL_PORT‘),
            )

    def open_spider(self,spider):
        self.db = pymysql.connect(self.host,self.user,self.password,
            self.database,charset=‘utf8‘,port=self.port)
        self.cursor = self.db.cursor()

    def close_spider(self,spider):
        self.db.close()

    def process_item(self,item,spider):
        data = dict(item)
        keys = ‘, ‘.join(data.keys())
        values = ‘, ‘.join([‘%s‘] * len(data))
        sql = ‘insert into %s (%s) value (%s)‘ %(item.table,keys,values)
        self.cursor.execute(sql,tuple(data.values()))
        self.db.commit()
        return item

这里需要在settings.py中添加几个关于MySQL配置的变量,如下所示:

MYSQL_HOST = ‘localhost‘
MYSQL_DATABASE = ‘images360‘
MYSQL_PORT = 3306
MYSQL_USER = ‘root‘
MYSQL_PASSWORD = ‘123456‘

scrapy提供了专门处理下载的Pipeline。首先定义存储文件的路径,在settings.py中添加:IMAGES_STORE = ‘./images‘

定义ImagePipeline:

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

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

from scrapy import Request
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
import pymysql

class ImagePipeline(ImagesPipeline):
    def file_path(self,request,response=None,info=None):
        url = request.url
        file_name = url.split(‘/‘)[-1]
        return file_name

    def item_completed(self,results,item,info):
        image_paths = [x[‘path‘] for ok,x in results if ok]
        if not image_paths:
            raise DropItem(‘Image Downloaded Failed‘)
        return item

    def get_media_requests(self,item,info):
        yield Request(item[‘url‘])

class MysqlPipeline():
    def __init__(self,host,database,user,password,port):
        self.host = host
        self.database = database
        self.user = user
        self.password = password
        self.port = port

    @classmethod
    def from_crawler(cls,crawler):
        return cls(
            host=crawler.settings.get(‘MYSQL_HOST‘),
            database=crawler.settings.get(‘MYSQL_DATABASE‘),
            user=crawler.settings.get(‘MYSQL_USER‘),
            password=crawler.settings.get(‘MYSQL_PASSWORD‘),
            port=crawler.settings.get(‘MYSQL_PORT‘),
            )

    def open_spider(self,spider):
        self.db = pymysql.connect(self.host,self.user,self.password,
            self.database,charset=‘utf8‘,port=self.port)
        self.cursor = self.db.cursor()

    def close_spider(self,spider):
        self.db.close()

    def process_item(self,item,spider):
        data = dict(item)
        keys = ‘, ‘.join(data.keys())
        values = ‘, ‘.join([‘%s‘] * len(data))
        sql = ‘insert into %s (%s) value (%s)‘ %(item.table,keys,values)
        self.cursor.execute(sql,tuple(data.values()))
        self.db.commit()
        return item

get_media_requests()方法取出Item对象的URL字段,生成Request对象发送给Scheduler,等待执行下载。

file_path()方法返回图片保存的文件名。

item_complete()方法当图片下载成功时返回Item说明下载成功,否则抛出DropItem异常,忽略这张图片。

最后需在settings.py文件中设置ITEM_PIPELINES以启动item管道:

ITEM_PIPELINES = {
    ‘images360.pipelines.ImagePipeline‘: 300,
    ‘images360.pipelines.MysqlPipeline‘: 301
}

大功告成,现在可以进行爬取了~输入scrapy crawl images即可完成爬取。

原文地址:https://www.cnblogs.com/wdl1078390625/p/9971838.html

时间: 2024-11-08 03:17:04

Scrapy框架学习(四)爬取360摄影美图的相关文章

爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器, 分布式爬虫, java等语言概念补充, bilibili爬视频参考

1 全站爬取cnblogs # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com 示例: # cnblogs_crawl/cnblogs_crawl/spiders/cnblogs.py import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scrapy.http import Request class

Scrapy框架——使用CrawlSpider爬取数据

引言 本篇介绍Crawlspider,相比于Spider,Crawlspider更适用于批量爬取网页 Crawlspider Crawlspider适用于对网站爬取批量网页,相对比Spider类,CrawSpider主要使用规则(rules)来提取链接,通过定义一组规则为跟踪链接提供了遍历的机制. Crawlspider 的强大体现在自动爬取页面所有符合规则的链接并深入下去! 全站数据爬取 编码流程 新建一个工程 cd 工程 创建爬虫文件: scrapy genspider -t crawl s

scrapy爬虫框架(四)-爬取多个网页

scrapy爬虫框架(四) 爬取多个网页 思路:通过判断句子控网站中,下一页是否还有a标签来获取网址,拼接后继续爬取,最终写入json文件中. juziSpider.py # -*- coding: utf-8 -*- import scrapy from juzi.items import JuziItem class JuzispiderSpider(scrapy.Spider): name = 'juziSpider' allowed_domains = ['www.juzikong.co

windows下scrapy框架学习笔记—'scrapy' 不是内部或外部命令

最近几天在深入的学习scrapy框架,但是装完各种需要的基础包之后却发现scrapy命令在别的路径下都用不了,我一开始是把python安装在F:\Python路径下的,安装了scrapy后它默认都会安装在这个路径下,scrapy在路径F:\Python\Scripts路径下,我的scrapy命令只能在此路径下用,因此创建什么工程也都只能在此文件下. 想了一下它的工作原理:它在F:\Python\Scripts路径下,就会在Scripts文件下存在一个scrapy批处理文件,那么在DOS下想要命令

Python3网络爬虫(十):这个帅哥、肌肉男横行的世界(爬取帅哥图)

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Python3网络爬虫(十):这个帅哥.肌肉男横行的世界(爬取帅哥图) - Jack-Cui - 博客频道 - CSDN.NET Jack-Cui 努力-是为了将运气成分降到最低 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯

Scrapy实战篇(六)之爬取360图片数据和图片

本篇文章我们以360图片为例,介绍scrapy框架的使用以及图片数据的下载. 目标网站:http://images.so.com/z?ch=photography 思路:分析目标网站为ajax加载方式,通过构造目标url从而请求数据,将图片数据存储在本地,将图片的属性存储在mongodb中. 1.首先定义我们需要抓取的字段 class ImageItem(scrapy.Item): # define the fields for your item here like: # name = scr

Scrapy框架学习第二天

编写scrapy爬虫的具体流程最初:分析网站页面需要爬取的结构第一步:创建scrapy项目:scrapy startproject +文件名第二步:打开项目第三步:编写items.py第四步:创建爬虫文件(基础爬虫文件创建指令:scrapy genspider + 爬虫名 +"网站名")第五步:编写文件第六步:编写管道文件(piplines.py)第七步:修改setting.py文件(设置爬虫文件必须的功能) 小知识点:linux中 tree是树形结构显示文件结构

scrapy初探之实现爬取小说

一.前言 上文说明了scrapy框架的基础知识,本篇实现了爬取第九中文网的免费小说. 二.scrapy实例创建 1.创建项目 C:\Users\LENOVO\PycharmProjects\fullstack\book9>scrapy startproject book9 2.定义要爬取的字段(item.py) import scrapy class Book9Item(scrapy.Item): # define the fields for your item here like: # na

python学习之——爬取网页信息

爬取网页信息 说明:正则表达式有待学习,之后完善此功能 #encoding=utf-8 import urllib import re import os #获取网络数据到指定文件 def getHtml(url,fname): #fname = 'C:\\Users\cuiliting\\Desktop\\weather_forecast.txt' data =[] page = urllib.urlopen(url) html = page.read() data.append(html)