之前一直用requests+BeautifulSoup进行爬虫,想要接触一下Scrapy。
配置环境
首先需要配置环境,按照Scrapy文档给出的需要安装python+lxml+OpenSSL然后才能安装Scrapy。所以按照步骤安装python3.7之后使用pip install
依次安装lxml、OpenSSL、Scrapy。
然后命令行进入存储代码的目录中,egH:\python\Scrapy
,执行scrapy startproject tutorial
。会包含一下文件
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
分别为
scrapy.cfg: 项目的配置文件
tutorial/: 该项目的python模块。之后您将在此加入代码。
tutorial/items.py: 项目中的item文件.
tutorial/pipelines.py: 项目中的pipelines文件.
tutorial/settings.py: 项目的设置文件.
tutorial/spiders/: 放置spider代码的目录.
定义Item
Item 是保存爬取到的数据的容器;其使用方法和python字典类似。在item.py
文件夹里面定义item
import scrapy
class DmozItem(scrapy.Item):#创建一个类,继承scrapy.item类,就是继承人家写好的容器
title = scrapy.Field()# 需要取哪些内容,就创建哪些容器
link = scrapy.Field()
desc = scrapy.Field()
注:容器不一定是一开始全部都定义好的,可以跟随项目的更新一点点向里面添加。
第一个爬虫
在spiders文件夹下创建一个dmoz_spider.py文件。
- name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
- start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
- parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。简单来说就是编写爬虫的主要部分。
import scrapy
class DmozSpider(scrapy.spiders.Spider):
name = "dmoz"# 爬虫的唯一标识,不能重复,启动爬虫的时候要用
allowed_domains = ["maoyan.com"]# 限定域名,只爬取该域名下的网页
start_urls = [
"https://maoyan.com/"# 开始爬取的链接
]
def parse(self, response):
filename = response.url.split("/")[-2] # 获取url,用”/”分段,获去倒数第二个字段
with open(filename, 'wb') as f:
f.write(response.body)
然后执行scrapy crawl dmoz
这个命令启动spider。把访问的得到的网页源码写入文件。
Scrapy为Spider的 start_urls 属性中的每个URL创建了 scrapy.Request 对象,并将 parse 方法作为回调函数(callback)赋值给了Request。
Request对象经过调度,执行生成 scrapy.http.Response 对象并送回给spider parse() 方法。
Scrapy框架的整体架构和组成
Spiders:爬虫,定义了爬取的逻辑和网页内容的解析规则,主要负责解析响应并生成结果和新的请求
Engine:引擎,处理整个系统的数据流处理,出发事物,框架的核心。
Scheduler:调度器,接受引擎发过来的请求,并将其加入队列中,在引擎再次请求时将请求提供给引擎
Downloader:下载器,下载网页内容,并将下载内容返回给spider
ItemPipeline:项目管道,负责处理spider从网页中抽取的数据,主要是负责清洗,验证和向数据库中存储数据
Downloader Middlewares:下载中间件,是处于Scrapy的Request和Requesponse之间的处理模块
Spider Middlewares:spider中间件,位于引擎和spider之间的框架,主要处理spider输入的响应和输出的结果及新的请求middlewares.py里实现。