美文网首页爬虫系列
Python+Scrapy 爬虫之路 (一)

Python+Scrapy 爬虫之路 (一)

作者: Medivh_ | 来源:发表于2017-11-15 10:57 被阅读42次

远古的时候我们学会了使用urllib来抓取一些文章或者图片;后来到了古时候掌握了requests更方便的抓取想要的东西;现在我们来到的现代化的社会就有了重武器——Scrapy.
更多关注:http://www.mknight.cn

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

其最初是为了页面抓取(更确切来说,网络抓取)所设计的, 也可以应用在获取API所返回的数据(例如Amazon Associates Web Services) 或者通用的网络爬虫。

Scrapy,以前搜索python资料的时候总会无意中看到Scrapy+python的关键词。后来也知道这个是专业的爬虫工具。很多资料看起来很复杂,都无从下手。一次偶然的机会,是在闲的无聊了就学习了一下。特地将一些重要的知识点记录下来。

安装

pip install Scrapy

redhat/centos6.7 系统 安装scrapy时,提示缺少 twisted。然后用pip install twisted也提示找不到合适版本。

requirement Twisted>=13.1.0

解决方式:手动安装Twisted

wget https://twistedmatrix.com/Releases/Twisted/17.1/Twisted-17.1.0.tar.bz2
tar -jxvf Twisted-17.1.0.tar.bz2
cd Twisted-17.1.0
python setup.py install

初窥

创建项目

在学习django的时候我们都知道可以用命令来创建一个项目,Scrapy也一样

#scrapy startproject ProjectName

[medivh@medivh gitlab]$ scrapy startproject zoo
New Scrapy project 'zoo', using template directory '/usr/local/python3/lib/python3.5/site-packages/scrapy/templates/project', created in:
    /home/medivh/gitlab/zoo

You can start your first spider with:
    cd zoo
    scrapy genspider example example.com

目录结构:

.
├── scrapy.cfg
└── zoo
    ├── __init__.py
    ├── items.py
    ├── middlewares.py
    ├── pipelines.py
    ├── settings.py
    └── spiders
        ├── __init__.py
  • scrapy.cfg: 项目的配置文件
  • zoo/: 该项目的python模块。之后您将在此加入代码。
  • zoo/items.py: 项目中的item文件.
  • zoo/pipelines.py: 项目中的pipelines文件,持久化.
  • zoo/settings.py: 项目的设置文件.
  • zoo/spiders/: 放置spider代码的目录.

测试示例

新建爬虫文件

在spiders 新建文件 bee.py

import scrapy
class DmozSpider(scrapy.Spider):
    name = "mknight"
    allowed_domains = ["ziru.com"]
    start_urls = [
        "http://www.mknight.cn/",
    ]
    def parse(self, response):
        filename = 'mknight.html'
        with open(filename, 'wb') as f:
            f.write(response.body)

启动

# scrapy crawl appName; --nolog 不输出日志
 scrapy crawl mknight

运行后会在根目录下生成 'mknight.html' 文件。有点python或者其他开发常识都能简单看懂这段代码。定义起始url开始访问,然后打开该url并写入文件。

优化启动

项目根目录下新建start.py

from scrapy.cmdline import execute
#execute(['scrapy', 'crawl', 'bee']) #输出日志
#execute(['scrapy', 'crawl', 'bee','--nolog']) #不输出日志

这样运行该文件,根据情况启用的时候取消一个注释就可以了。

流程

流程图

Scrapy主要包括了以下组件:

引用一位大师的话:

  • Scrapy Engine: 这是引擎,负责Spiders、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等等!(像不像人的身体?)
  • Scheduler(调度器): 它负责接受引擎发送过来的requests请求,并按照一定的方式进行整理排列,入队、并等待Scrapy Engine(引擎)来请求时,交给引擎。
  • Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spiders来处理,
  • Spiders:它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
  • Item Pipeline:它负责处理Spiders中获取到的Item,并进行处理,比如去重,持久化存储(存数据库,写入文件,总之就是保存数据用的)
  • Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件
  • Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spiders中间‘通信‘的功能组件(比如进入Spiders的Responses;和从Spiders出去的Requests)

Scrapy运行流程大概如下:

程序运行的时候,
引擎:Hi!Spider, 你要处理哪一个网站?
Spiders:我要处理23wx.com
引擎:你把第一个需要的处理的URL给我吧。
Spiders:给你第一个URL是XXXXXXX.com
引擎:Hi!调度器,我这有request你帮我排序入队一下。
调度器:好的,正在处理你等一下。
引擎:Hi!调度器,把你处理好的request给我,
调度器:给你,这是我处理好的request
引擎:Hi!下载器,你按照下载中间件的设置帮我下载一下这个request
下载器:好的!给你,这是下载好的东西。(如果失败:不好意思,这个request下载失败,然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载。)
引擎:Hi!Spiders,这是下载好的东西,并且已经按照Spider中间件处理过了,你处理一下(注意!这儿responses默认是交给def parse这个函数处理的)
Spiders:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,这是我需要跟进的URL,将它的responses交给函数 def xxxx(self, responses)处理。还有这是我获取到的Item。
引擎:Hi !Item Pipeline 我这儿有个item你帮我处理一下!调度器!这是我需要的URL你帮我处理下。然后从第四步开始循环,直到获取到你需要的信息,

注意!只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy会重新下载。)

参考资料:
http://www.mknight.cn/
https://doc.scrapy.org/en/latest/
http://cuiqingcai.com/3472.html

相关文章

网友评论

    本文标题:Python+Scrapy 爬虫之路 (一)

    本文链接:https://www.haomeiwen.com/subject/ajlqvxtx.html