scrapy的安装与使用

一 scrapy 的安装
下载地址:http://blog.****.net/liuweiyuxiang/article/details/68929999

1.简单安装方法:
终端输入命令 pip install scrapy 下载scrapy

在安装过程中会出现错误,这时我们就要安装whl格式的包
首先下载scrapy的whl包

下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/

在网页中搜索scrapy找到

Scrapy‑1.3.3‑py2.py3‑none‑any.whl
2.安装whl格式包需要安装wheel库
pip install wheel 就可以安装了。
3.scrapy依赖twiste,同样使用whl格式的包进行安装

还是进入http://www.lfd.uci.edu/~gohlke/pythonlibs/,在网页中搜索twisted找到其对应的whl包并下载

Twisted‑17.1.0‑cp36‑cp36m‑win_amd64.whl
根据你的Python的版本选择合适的包,名称中间的cp36是python3.6的意思,amd64是python的位数
下载完成后使用cmd打开windows的命令行窗口,进入whl包所在的文件夹执行如下命令
在 命令行输入:pip install Twisted-17.1.0-cp36-cp36m-win_amd64.whl

Scrapy-1.3.3-py2.py3-none-any.whl包使用同样的方式安装,只是应该等到其所有依赖的包安装完成后才能进行安装,现在还不能安装

4、scrapy依赖lxml包,需要先安装lxml包,lxml包依赖libxml2,libxml2-devel,所以安装lxmllibxml2, libxml2-devel。幸运的是之前我之前已经安装过lxml

5、所有准备工作做完,中医可以安装scrapy包了,进入Scrapy-1.3.3-py2.py3-none-any.whl所在的目录
pip install Scrapy-1.3.3-py2.py3-none-any.whl
6.安装成功之后需要测试一下是否安装成功了。
命令行输入scrapy -h
scrapy的安装与使用
这就是安装成功了
二 scrapy的使用
1.新建项目 scrapy startproject
在爬去之前必须新建一个scrapy项目,进入自定义的项目目录中,运行以下列命令:

scrapy startproject xiaohua_Spider

xiaohua_Spider为新建的项目名,在根目录下打开文件,就会生成以下文件
scrapy的安装与使用
这个是爬取校花图片的一个项目
2.pycharm中打开文件,会自动生成一些脚本scrapy的安装与使用
在items中引入代码
scrapy的安装与使用
在spider下面新建一个xiaohua.py文件,会默认生成以下代码

import scrapy
	class XiaohuaSpider(scrapy.Spider):
    	name = 'xiaohua'
    	allowed_domains = ['xiaohuar.com']
    	start_urls = ['http://www.xiaohuar.com/hua']
   	def parse(self, response):
   		pass

2.下面就是要爬取校花图片了
在 setting中修改一些数据。
把 True 改为 False
scrapy的安装与使用
这里也需要修改scrapy的安装与使用
修改完后,在pipelines.py写入以下代码

import os
import requests

class XiaohuaSpiderPipeline(object):
    def process_item(self, item, spider):
        # 一个大型项目中可能会有多个spider和多个pipeline,判断一下确保item进入对应的pipeline中。
        if spider.name == 'xiaohua':
            print(item['folder_name'],item['img_name'],item['img_url'])
            # 创建文件夹
            base_dir = os.path.join(os.path.dirname(__file__) + 'IMG')  # 项目根目录 D://xiaohua.spider/IMG
            img_dir = os.path.join(base_dir,item['folder_name'])  # D://xiaohua.spider/IMG/xxx校花
            if not os.path.exists(img_dir):
                os.makedirs(img_dir)
            img_path = os.path.join(img_dir,item['img_name'])
        # TODO 先用同步请求方式。scrapy自带异步方式作为作业。
        #  请求和保存图片
        img_url = item['img_url']
        resp = requests.get(img_url)
        if resp.status_code == 200:
            img_bytes = resp.content
        else:
            print('{}下载失败'.format(img_url))

        # 保存图片
        with open(img_path, mode='wb') as f:
            f.write(img_bytes)
        print('{}保存成功'.format(img_path))


        return item

写代码的同时,需要登录http://www.xiaohuar.com/hua校花网 获取xpath 以及登录百度首页的’User-Agent’获取。
下面是xiaohua.py里的代码,xpath , 'User-Agent’ 添加到代码当中。

# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
from scrapy.http import Request
from xiaohua_spider.items import XiaohuaSpiderItem
class XiaohuaSpider(scrapy.Spider):
    name = 'xiaohua'
    allowed_domains = ['xiaohuar.com']
    start_urls = ['http://www.xiaohuar.com/hua']


    # 自定义头部 。可以在下面代码中载入设置或写在setting.py中

    custom_settings = {
        'DEFAULT_REQUEST_HEADERS':{
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language':'zh-CN,zh;q=0.9',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3608.4 Safari/537.36',
        }
    }
    # 存放待爬取的url,scrapy会自动去重和重试失败链接,我们只需要考虑住url集合中添加未爬取的url。
    url_set = set()

    def parse(self, response):
        """请求首页图集列表之后得到列表页,解析获得图集详情页的地址。"""
        # 首先重写parse,否则父类会报NOtImplement异常
        # response.xpath()。如果安装过lxml,scrapy默认用lxml.etree.etree.HTML(resp.content)
        a_list = Selector(response).xpath('//div[@class="img"]/a')
        for a in a_list:
            detail_url= a.xpath('.//@href').extract_first()
            if detail_url in self.url_set:
                # 已爬取过
                 pass
            else:
                # 添加到待爬取连接池
                self.url_set.add(detail_url)
                # 发现 画廊页url
                gallery_url =detail_url.replace('/p','/s')
                # yield相当于同步函数里的返回值,callback相当于方法嵌套调用,只不过这两个关键字表现异步处理过程,yield生成请求对象(还没有发送请求)到队列中,框架从队列中取一个请求对象去请求,得到响应后再交给回调函数处理。
                yield Request(url=gallery_url,callback=self.img_parse)




    def img_parse(self,response):
        """请求画廊页后的html结果,生成item"""
        src_list = Selector(response).xpath('//div[@class ="inner"]/a/img/@src').extract() # [http]
        folder_name = Selector(response).xpath('//h1/text()').extract_first()

        for src in src_list:
            print('图片资源',src)       # self.log('图片资源',scr)
            img_url = src       # 由于网站开发技术历史原因,有路由形式访问的 '/d/file/20180116/smalleef8a4887c7b40d646061a4211ccd7e81516071519.jpg'}  或
            # 也有 http:///d/file/20180116/small69df9717ed58b035281c92a1f608b58d1516071519.jpg?
            if img_url.startswith('https'):
                pass
            else:
                # 路由形式的,协议http,没有解析xiaohuar.com
                img_url = 'http://www.xiaohuar.com' + img_url

            img_name = src.split('/')[-1]
            # test

            # item = XiaohuaSpiderItem(folder_name=folder_name,img_name = img_name,img_url=img_url)

            item = XiaohuaSpiderItem()
            item['folder_name'] = folder_name
            item['img_name'] = img_name
            item['img_url'] = img_url
            yield item

这是爬取了一页的内容
另外还需在xiaohua_spider建一个main.py文件
在main.py写入代码 作为入口

# 程序入口
from scrapy import cmdline

cmdline.execute(['scrapy','crawl','xiaohua'])

这些完成之后 新建一个文件夹,来存储爬取的图片scrapy的安装与使用
运行main.py,就开始爬取图片了,

结束之后,打开存储图片的文件夹,就能看到图片了
scrapy的安装与使用