MongoDB的安装与配置

Win10下Mongodb4.0的安装与配置

不用scrapy时的数据抓取

  1. Urllib或requests

  2. 封装http头部信息

  3. 多线程或协程

  4. 封装代理类

  5. 封装去重类

  6. 封装数据存储类

  7. 封装异常检测类

    等等我们所需造的一些轮子,比较头疼。

Scrapy是什么?

Scrapy是一套基于Twisted的异步处理框架,是纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松实现一个爬虫了,用来抓取网页内容和各种图片。

(模块耦合度低,扩展性强)

scrapy

  • 引擎(Scrapy Engine) 用来处理整个系统的数据流, 触发事务(框架核心)

    相当于交通站。

  • 调度器(Scheduler) 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

  • 下载器(Downloader) 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)

  • 爬虫(Spiders) 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面

  • 项目管道(Pipeline) 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

    封装去重类,存储类的地方,获取从spider里面获取的数据并处理,进行存储等。

  • 下载器中间件(Downloader Middlewares) 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。

  • 爬虫中间件(Spider Middlewares) 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。

  • 调度中间件(Scheduler Middewares) 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

​ 数据流处理流程:

​ spider会有一个入口URL,入口URL传递给引擎,调度器会把URL入队列,处理好requests请求返回给引擎。然后把requests请求交由下载器,下载器把页面下载好。如果没有下载好,会把requests请求交还给引擎,再进入调度器排队调度。如果说下载好了,会把response交给Spiders,spiders会进行数据解析和抽取,然后一部分数据抛向管道,进行数据存储;另一部分是requests请求会交给引擎,进入调度器入队。再从排队信息进入引擎,如此循环往复,直到页面爬取完成。

Scrapy项目实战

抓取豆瓣电影top250的数据,并将数据保存为csv,json和存储到mongo的数据库中。

目标站点:https://movie.douban.com/top250

一个scrapy项目抓取应该分为4步走:

  1. 新建项目
  2. 明确目标
  3. 制作爬虫
  4. 存储内容

1)创建一个爬虫项目

scrapy startproject douban

项目的创建目录如下:

scrapy.cfg 项目配置文件

/douban

items.py 定义items数据结构的地方

settings.py 项目的设置文件(比如设置user_agent,robots协议,并发量,下载延迟,是否cookie等等)

执行scrapy genspider douban_spider movie.douban.com命令会在,

/spiders下生成两个文件,_init_.py和douban_spider.py

_init_.py

douban_spider.py 写爬虫的抽取解析逻辑等等

2)明确目标

分析网站特征,以及要抓取的数据。

在items.py中;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import scrapy

class DoubanItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    
    # 序号
    serial_number = scrapy.Field()
    # 电影的名称
    movie_name = scrapy.Field()
    # 电影的介绍
    introduce = scrapy.Field()
    # 电影的星级
    star = scrapy.Field()
    # 电影的评论数
    evaluate = scrapy.Field()
    # 电影的描述
    describe = scrapy.Field()
    
    

3)制作爬虫

进行爬虫的spider的编写

douban_spider.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# -*- coding:utf-8 -*-
import scrapy
from douban.items import DoubanItem

class DoubanSpiderSpider(scrapy.Spider):
    name = 'douban_spider'  # 爬虫名(不能和项目名重复)
    allowed_domains = ['movie.douban.com']  # 允许抓取域名
    start_urls = ['http://movie.douban.com/top250']  # 入口url,扔到调度器里面去

    # 默认的解析方法
    def parse(self, response):
        # 循环电影的条目
        movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
        for i_item in movie_list:
            # print(i_item)
            douban_item = DoubanItem()

            # 写详细的xpath,进行数据的解析
            douban_item['serial_number'] = i_item.xpath(".//div[@class='item']//em//text()").extract_first()
            douban_item['movie_name'] = i_item.xpath(".//div[@class='info']/div[@class='hd']/a/span[1]/text()").extract_first()
            content = i_item.xpath(".//div[@class='info']/div[@class='bd']/p[1]/text()").extract()

            # 多行数据的处理
            for i_content in content:
                content_s = "".join(i_content.split())
                douban_item['introduce'] = content_s

            douban_item['star'] = i_item.xpath(".//span[@class='rating_num']/text()").extract_first()
            douban_item['evaluate'] = i_item.xpath(".//div[@class='star']//span[4]/text()").extract_first()
            douban_item['describe'] = i_item.xpath(".//p[@class='quote']/span/text()").extract_first()

            yield douban_item  #把数据yield到管道里面去

        # 解析下一页规则,取得是后页的xpath
        next_link = response.xpath("//span[@class='next']/link/@href").extract()
        if next_link:
            next_link = next_link[0]
            yield scrapy.Request("https://movie.douban.com/top250"+next_link,callback=self.parse)

启动scrapy爬虫

scrapy crawl douban_spider

安装sqlite3,加入sqlite3,重新编译安装python3

在pycharm里面做一个启动程序:在main.py

1
2
from scrapy import cmdline
cmdline.execute('scrapy crawl douban_spider')