scrapy(一)环境的安装,框架的基本介绍,运行流程和小案例

85 阅读2分钟

我正在参加「掘金·启航计划」

一、安装环境

scrapy 安装

1.安装Twisted www.lfd.uci.edu/~gohlke/pyt…

Twisted‑18.9.0‑cp36‑cp36m‑win32.whl cp36 是python版本win32是python的位数

2.命令安装

pip install Twisted‑18.9.0‑cp36‑cp36m‑win32.whl

3.pip install scrapy

pip list 查看已经安装的第三方库

二、基本介绍

之前学习的请求库:urllib urllib3 requeste 解析库:re lxml Bs4(BeautifulSoup4),scripy是纯python开发的一个高效结构化的网页抓取框架

三、命令

1.全局命令

scrapy startproject 创建项目

2.项目命令

scrapy genspider [options] <name> <domain>创建爬虫文件
    
scrapy genspider baidu_spider baidu.com
    
scrapy crawl 运行爬虫
    
scrapy list 查看当前项目可运行的爬虫

四、注意事项

此框架默认遵守robots协议,可以在settings中修改ROBOTSTXT_OBEY为false

五、运行流程

scrapy 运行流程,engine(引擎) spider(爬虫文件) engine(引擎) scheduler(调度器) downloader(下载器) engine(引擎) spider(爬虫文件) tiem(管道)

六、实际案例

第一步 创建项目 scrapy startproject TanzhouSpider

第二步 创建spider文件 scrapy genspider tz_spider shiguangkey.com

第三步 编写items文件,知道自己需要抓取的数据

第四步 解析数据,提取Request或者items

第五步 保存数据

用的到基础知识点:yield 生成器,回调函数,isinstance 判断实例类型,zip 方法两个列表,返回一个大的列表,元素是一一对应的元组

spider文件中的内容:

    # -*- coding: utf-8 -*-
import scrapy
from ..items import MyspiderItem
class TzSpiderSpider(scrapy.Spider):
    name = 'tz_spider'
    # allowed_domains = ['shiguangkey.com']
    start_urls = ['http://ke.qq.com/course/list?mt=100{}'.format(i) for i in range(1,7)]
 
    def parse(self, response):
        # 解析数据
        # print(response.url+'========')
        titles = response.xpath('//h4[@class="item-tt"]/a/text()')
        # print('title',title)#匹配出来的是对象
        titles = titles.extract()
        # print(title)#匹配出来的是列表
        school_names = response.xpath('//span[@class="item-source"]/a/text()')
        # print('school_name',school_name)
        school_names = school_names.extract()
        items = MyspiderItem()
        for title, school_name in zip(titles, school_names):
            items['title'] = title
            items['school_name'] = school_name
            yield items
            #返回item对象
 
        # 跟进链接  翻页
        next_url = response.xpath('//a[@class="page-next-btn icon-font i-v-right"]/@href').extract()
        print(next_url)
        if next_url:
           yield scrapy.Request(url=next_url[0],callback=self.parse)
        #数据写入在pipelines.py中

如上代码,我们是发起请求,然后使用xpath来定位数据,最后保存到items,我们也可以使用yield来分页爬取数据。

items.py中的内容:

    # -*- coding: utf-8 -*-
import scrapy
 
 
class MyspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # pass
    title = scrapy.Field()
    school_name = scrapy.Field()

如上代码,我们爬取的数据,保存items时,需要在这个文件中定义字段,才可以保存数据。

pipelines.py中的内容:

    # -*- coding: utf-8 -*-
 
import json
class MyspiderPipeline(object):
    def process_item(self, item, spider):
        '''
        这个方法是必须实现的
        :param item:
        :param spider:
        :return:
        '''
        with open('item.json','a+',encoding='utf-8') as f:
            # f.write(json.dumps(item)+'\n')#老写发
            f.write(str(item)+'\n')#新写法
        return item
    #激活才可以写入到文件,激活在settings中的67行

如上代码,我们爬取的数据保存到items中,我们保存到文件中,当然,后续我们可以让其保存到数据库等一些地方。