第一章 Scrapy框架

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下:

img

实例 :爬取163新闻

1 、创建scrapy项目

在项目文件目录下输入:

scrapy startproject news_163 # 项目名称自己设置 

2、创建爬虫程序

cd news_163
# 创建包含名字,网站
scrapy genspider news_spider https://news.163.com/ 

3、scrapy项目文件说明

  • scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的 配置信息。(真正爬虫相关的配置信息在settings.py文件中)
  • items.py 设置数据存储模板,用于结构化数据,如:Django的Model
  • pipelines 数据处理行为,如:一般结构化的数据持久化
  • settings.py 配置文件,如:递归的层数、并发数,延迟下载等
  • spiders 爬虫目录,如:创建文件,编写爬虫规则
  • middleware 中间件文件

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

4、设置数据存储模板

items.py

# -*- 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 News163Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    time = scrapy.Field()
    author =scrapy.Field()

5、编写爬虫

spider.py

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from ..items import News163Item

class NewsSpiderSpider(CrawlSpider):
    name = 'news_spider'
    # allowed_domains = ['dddd']
    start_urls = ['https://news.163.com/']

    rules = (
        Rule(LinkExtractor(allow=r'.*news\.163\.com/19/0118/.*\d\.html'), callback='parse_item', follow=True),
        Rule(LinkExtractor(allow=r'.*\.163\.com/19/0118/.*\d\.html'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        items = News163Item()
        title = response.xpath('//h1/text()').extract()[0]
        time = response.xpath('//div[@class="post_time_source"]/text()').re(r'.*?(20.*\d)')[0]
        author = response.xpath('//a[@id="ne_article_source"]/text()').extract()[0]
        if title:
            items['title'] = title
        if time:
            items['time'] = time
        if author:
            items['author'] = author
        return items

6、设置配置文件

settings.py修改

ROBOTSTXT_OBEY = True # robot协议

7、编写数据处理脚本

pipelines.py

# -*- 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
class News163Pipeline(object):
    def open_spider(self, spider):
        print('开始程序=======================')
        self.file = open("spider.json", "w")
        self.n = 0

    def process_item(self, item, spider):
        self.file.write(str(self.n + 1) + ' : ' + str(item) + '\n')
        self.n += 1
        return item

    def close_spider(self, spider):
        self.file.close()
        print('结束程序========================')
        print(self.n)

8、执行爬虫

方法一:命令执行

# 进入项目目录
scrapy crawl news_spider

方法二

# 进入项目目录
touch main.py # 创建一个py文件
vim main.py # 进入文件
# 运行该文件即可启动爬虫
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'news_spider'])
posted @ 2019-04-22 11:14  人生不易丶岁月静好  阅读(139)  评论(0编辑  收藏  举报