MongoDB的安装与配置
Win10下Mongodb4.0的安装与配置
不用scrapy时的数据抓取
-
Urllib或requests
-
封装http头部信息
-
多线程或协程
-
封装代理类
-
封装去重类
-
封装数据存储类
-
封装异常检测类
等等我们所需造的一些轮子,比较头疼。
Scrapy是什么?
Scrapy是一套基于Twisted的异步处理框架,是纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松实现一个爬虫了,用来抓取网页内容和各种图片。
(模块耦合度低,扩展性强)
-
引擎(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)创建一个爬虫项目
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')
|