本系列为自己学习爬虫的相关笔记,如有误,欢迎大家指正
Scrapy是什麽
Scrapy是一个为了爬取网站数据,提取数据而编写的应用框架。简单来说,它把爬虫的三步:获取网页,解析网页,存储数据都整合成了这个爬虫框架。
Scrapy架构
Scrapy主要的组件有Scrapy Engine(引擎), Scheduler(调度器),Downloader(下载器), Spider(爬虫器), Item Pipeline(管道)。还有两个中间件:Downloader Middlewares(下载器中间件)和SpiderMiddlewares(爬虫器中间件)。这些组件的功能分别是:
- 引擎:负责控制数据流在所有组件流动,并在相应动作时触发事件。可以理解为爬虫的大脑。
- 调度器:从引擎接受请求(request)并将它们加入爬虫队列。可以理解把等待爬取的网页排队的功能。
- 下载器:负责获取页面并提供给引擎。相当于之前学的“获取网页”功能。
- 爬虫器:负责解析网页(response),提取数据,或额外跟进一些URL。相当于之前学的“解析网页”功能。
- 管道:负责处理被爬虫器提取的数据(items),例如保存下来。相当于之前学的“存储数据”功能。
- 下载器中间件:引擎和下载器中间的一个部分,处理下载器传递给引擎的数据(response),一般不做处理。
- 爬虫器中间件:引擎和爬虫器中间的一个部分,处理爬虫器的输入(response)和输出(items, requests)。
Scrapy数据流(Data Flow)
(1)引擎:向爬虫器请求第一个要抓取的url。
(2)爬虫器:提供请求url给引擎。
(3)引擎:接收到网址,交给调度器排序入队。
(4)调度器:将它处理成请求(request)给引擎。
(5)引擎:接收到request,并通过下载器中间件给下载器下载。
(6)下载器:根据request下载页面,返回回应(response)给引擎。
(7)引擎:接收到response,并通过爬虫器中间件给爬虫器处理。
(8)爬虫器:处理response,提取博客标题数据,返回结果item给引擎,如果有跟进的请求request也会给引擎。
(9)引擎:接收到item,交给管道;新的request给调度器。
(10)管道:存储数据。
安装Scrapy
使用pip安装
pip install Scrapy
使用conda安装
conda install -c conda-forge scrapy
通过Scrapy抓取博客
创建一个Scrapy项目
scrapy startproject blogSpider
在爬取之前需要先定义目标字段。在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 BlogspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
date = scrapy.Field()
#content = scrapy.Field()
获取内容并保存
在项目目录下输入scrapy genspider csdn blog.csdn.net
此时会在blogSpider/spider创建一个csdn.py的文件,此处是定义了名称和爬取范围
# -*- coding: utf-8 -*-
import scrapy
class SantotangSpider(scrapy.Spider):
name = 'csdn'
allowed_domains = ['blog.csdn.net']
start_urls = ['https://blog.csdn.net/weixin_51656605/article/details/113567112']
def parse(self, response):
pass
如上是默认生成的内容,如果不用命令的话,手动创建文件和内容也是可以的。
- name:爬虫器唯一的名字,不同的爬虫器不能使用相同的名字。
- allow_domains=[]:是搜索的域名范围,规定爬虫只会爬取这个域名下的网页。
- start_urls:爬虫器在启动时会爬取的url列表。
- parse():爬虫器的一个方法,获取到爬虫的下载的response,之后解析网页。
补充完整解析:
# -*- coding: utf-8 -*-
import scrapy
class SantotangSpider(scrapy.Spider):
name = 'csdn'
allowed_domains = ['blog.csdn.net']
start_urls = ['https://blog.csdn.net/weixin_51656605/article/details/113567112']
def parse(self, response):
print(response.text)
with open('index.html','w',encoding='utf-8') as f:
f.write(response.text)
然后执行:
scrapy crawl csdn
重新编写,将数据存入文件中:
# -*- coding: utf-8 -*-
import scrapy
from bs4 import BeautifulSoup
from blogSpider.items import BlogspiderItem
class CsdnSpider(scrapy.Spider):
name = 'csdn'
allowed_domains = ['blog.csdn.net']
start_urls = ['https://blog.csdn.net/weixin_51656605/category_10700169.html']
def parse(self, response):
#print(response.text)
#with open('index.html','w',encoding='utf-8') as f:
#f.write(response.text)
soup = BeautifulSoup(respon