Scrapy次章-啥也不干就是爬图

wylc123 1年前 ⋅ 4699 阅读

学爬虫,不爬点图,学他有啥用呀!开搂!
大家都在爬,校花网,咱也拿来练练手。

一、安装Scrapy运行环境

    1、安装wheel
        pip install wheel
    2、安装lxml
        https://pypi.python.org/pypi/lxml/4.1.0
    3、安装pyopenssl
        https://pypi.python.org/pypi/pyOpenSSL/17.5.0
    4、安装Twisted
        https://www.lfd.uci.edu/~gohlke/pythonlibs/
    5、安装pywin32
        https://sourceforge.net/projects/pywin32/files/
    6、安装scrapy
        pip install scrapy

注:windows平台需要依赖pywin32,请根据自己系统32/64位选择下载安装,https://sourceforge.net/projects/pywin32/

二、创建工程

2.1、创建工程

在控制台模式下进入你要建立工程的文件夹执行如下命令创建工程:

scrapy startproject pic

这里的pic是工程名,框架会自动在当前目录下创建一个同名的文件夹,工程文件就在里边。

2.2、创建爬虫程序
cd movie
scrapy genspider xh www.xiaohuar.com
2.3、自动创建目录及文件

2.4、文件说明:
  • scrapy.cfg  项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
  • spiders: 爬虫目录,如:创建文件,编写爬虫规则,之后您将在此加入代码。
  • xh.py  自动创建的爬虫文件
  • items.py    设置数据存储模板,用于结构化数据,如:Django的Model
  • middlewares.py: 是和Scrapy的请求/响应处理相关联的框架。
  • pipelines    用来对items里面提取的数据做进一步处理,如保存等。
  • settings.py 配置文件,如:递归的层数、并发数,延迟下载等

注意:一般创建爬虫文件时,以网站域名命名

三、分析要爬的网页

爬取思路:从页面设计来看,采用分页,图片流的方式展示校花图片,每张图片的dom结构是一样的,分页按钮自带页面链接,这样我们就可以一页一页来采集图片,并去重保存当前页面的分页链接,然后遍历保存下的页面,从而获取所有页面上的图片。

四、开始编写程序

推荐使用PyCharm编辑器编写调试,使用方便。直接打开生成的工程目录就可以了。

4.1 设置数据存储模板

items.py

import scrapy


class PicItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()
    addr = scrapy.Field()
    pass

注:name: 图片名称

addr: 图片访问地址

4.2 编写爬虫
# -*- coding: utf-8 -*-
import scrapy
import os
from scrapy.http import Request

# 导入item中结构化数据模板
from pic.items import PicItem


class XhSpider(scrapy.Spider):
    # 爬虫名称,唯一
    name = "xh"
    # 允许访问的域
    allowed_domains = ["www.xiaohuar.com"]
    # 初始URL
    start_urls = ['http://www.xiaohuar.com/daxue/']
    # 设置一个空集合
    url_set = set()

    def parse(self, response):
        # 如果图片地址以http://www.xiaohuar.com/daxue/index_或http://www.xiaohuar.com/daxue/开头,我才在上面去图片信息。
        if response.url.startswith("http://www.xiaohuar.com/daxue/index_") or response.url == 'http://www.xiaohuar.com/daxue/':
            allPics = response.xpath('//div[@class="card diy-box shadow mb-5"]/a')
            for pic in allPics:
                # 分别处理每个图片,取出名称及地址
                item = PicItem()
                name = pic.xpath('./img/@alt').extract()[0]
                addr = pic.xpath('./img/@src').extract()[0]
                item['name'] = name
                item['addr'] = addr
                print(name + '######' + addr)
                # 返回爬取到的信息
                yield item
        # 获取所有的地址链接(因为图片页地址是有规律的以/daxue/index_开头,下一页会多一页下一页的地址)
        urls = response.xpath("//a/@href").extract()
        for url in urls:
            # 如果地址以/daxue/index_开头且不在集合中,则获取其信息
            if url.startswith("/daxue/index_"):
                url = 'http://www.xiaohuar.com' + url
                if url in XhSpider.url_set:
                    pass
                else:
                    XhSpider.url_set.add(url)
                    # 回调函数默认为parse,也可以通过from scrapy.http import Request来指定回调函数
                    # from scrapy.http import Request
                    # Request(url,callback=self.parse)
                    yield self.make_requests_from_url(url)
            else:
                pass

 

4.3 设置配置文件

settings.py增加如下内容

# 设置处理返回数据的类及执行优先级
ITEM_PIPELINES = {
   'pic.pipelines.PicPipeline': 100,
}
4.4 编写数据处理脚本

pipelines.py

import urllib.request
import os

class PicPipeline(object):
    def process_item(self, item, spider):
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'}
        req = urllib.request.Request(url=item['addr'], headers=headers)
        res = urllib.request.urlopen(req)
        filePath = r'D:\my\down_pic';
        if not os.path.exists(filePath):
            os.makedirs(filePath)
        file_name = os.path.join(filePath, item['name'] + '.jpg')
        with open(file_name, 'wb') as fp:
            fp.write(res.read())

将每一页的图片都存储到D:\my\down_pic文件夹下

五、 执行爬虫

cd pic
scrapy crawl xh --nolog

或者直接在PyCharm里执行:

添加启动文件start.py在根目录下:

#coding=utf-8
#!文件类型: python
#!创建时间: 2018/12/4 16:42
#!作者: SongBin
#!文件名称: start.py
from scrapy import cmdline

cmdline.execute("scrapy crawl xh".split())

将其设置为启动文件就可以了

六、 结果

相关推荐

不要着急,慢慢更新

scrapy爬虫启示录-小伙子老夫看你血气方刚这本《爬虫秘录》就传给你了

Scrapy初章-Scrapy理论简介

Scrapy次章-啥也不干就是爬图

Scrapy第三章-图片存库Mysql

Scrapy第四章-设置代理IP偷偷爬图

Scrapy第五章-多线程加速爬图

Scrapy终章-1024福利

Scrapy最最最终章-搂一把sakimichan

更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: