使用Scrapy,帮你快速抓取网页数据(代码可下载)!

    Scrapy 是一套基于基于Twisted的异步处理框架,纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网站数据、提取结构性数据以及各种图片,非常方便。Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。尽管Scrapy原本是设计用来屏幕抓取(更精确的说,是网络抓取),但它也可以用来访问API来提取数据。

如何安装?

打开网站:

https://www.lfd.uci.edu/~gohlke/pythonlibs/

在这个python第三方库里下载三个包:分别是lxml,twisted,scrapy。

我下载的是:

lxml-4.3.2-cp37-cp37m-win_amd64.whlScrapy-1.6.0-py2.py3-none-any.whlTwisted-18.9.0-cp37-cp37m-win_amd64.whl

cd 到放这三个包的文件夹下,依次pip3 install 上述三个.whl文件。

例如:

pip3 install lxml-4.3.2-cp37-cp37m-win_amd64.whlpip3 install Twisted-18.9.0-cp37-cp37m-win_amd64.whlpip3 install Scrapy-1.6.0-py2.py3-none-any.whl

全部安装完后,直接在命令行输入scrapy,看是否出现以下提示,如果出现则说明安装成功。​​​​​​​

Scrapy 1.6.0 - no active project
Usage:  scrapy  [options] [args]
Available commands:  bench         Run quick benchmark test  fetch         Fetch a URL using the Scrapy downloader  genspider     Generate new spider using pre-defined templates  runspider     Run a self-contained spider (without creating a project)  settings      Get settings values  shell         Interactive scraping console  startproject  Create new project  version       Print Scrapy version  view          Open URL in browser, as seen by Scrapy
  [ more ]      More commands available when run from project directory
Use "scrapy  -h" to see more info about a command

如果没有成功,在下面网址上下载相应的win插件。

https://sourceforge.net/projects/pywin32/files/pywin32/Build 221/

架构和流程

Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下

使用Scrapy,帮你快速抓取网页数据(代码可下载)!_第1张图片

Scrapy主要包括了以下组件:

  • 引擎(Scrapy)

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

  • 调度器(Scheduler)

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

  • 下载器(Downloader)

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

  • 爬虫(Spiders)

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

  • 项目管道(Pipeline)

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

  • 下载器中间件(Downloader Middlewares)

    位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。

  • 爬虫中间件(Spider Middlewares)

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

  • 调度中间件(Scheduler Middewares)

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

 

Scrapy运行流程大概如下:

  1. 引擎从调度器中取出一个链接(URL)用于接下来的抓取

  2. 引擎把URL封装成一个请求(Request)传给下载器

  3. 下载器把资源下载下来,并封装成应答包(Response)

  4. 爬虫解析Response

  5. 解析出实体(Item),则交给实体管道进行进一步的处理

  6. 解析出的是链接(URL),则把URL交给调度器等待抓取

 

如何开始?

制作 Scrapy 爬虫一共需要四步:

  1. 新建项目:新建一个新的爬虫项目

  2. 明确目标(编写items.py):明确你想要抓取的目标

  3. 制作爬虫(spiders/xxspider.py):制作爬虫开始爬取网页

  4. 存储内容(pipelines.py):设计管道存储爬取内容

 

豆瓣读书频道书籍信息爬取

使用Scrapy,帮你快速抓取网页数据(代码可下载)!_第2张图片

创建工程

scrapy startproject pic

创建爬虫程序​​​​​​​

cd picscrapy genspider book douban.com

自动创建目录及文件

使用Scrapy,帮你快速抓取网页数据(代码可下载)!_第3张图片

 

文件说明:

  • scrapy.cfg  项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)

  • items.py    设置数据存储模板,用于结构化数据,如:Django的Model

  • pipelines    数据处理行为,如:一般结构化的数据持久化

  • settings.py 配置文件,如:递归的层数、并发数,延迟下载等

  • spiders      爬虫目录,如:创建文件,编写爬虫规则

注意:一般创建爬虫文件时,以网站域名命名

 

设置数据存储模板

items.py

​​​​​​​

import scrapyclass PicItem(scrapy.Item):    addr = scrapy.Field()    name = scrapy.Field()

编写爬虫

book.py

# -*- coding: utf-8 -*-import scrapyimport os# 导入item中结构化数据模板from pic.items import PicItem
class XhSpider(scrapy.Spider):    # 爬虫名称,唯一    name = "book"    # 允许访问的域    allowed_domains = ["douban.com"]    # 初始URL    start_urls = ['https://book.douban.com/']
    def parse(self, response):        # 获取所有图片的a标签        allPics = response.xpath('//div[@class="cover"]/a')        for pic in allPics:            # 分别处理每个图片,取出名称及地址            item = PicItem()            name = pic.xpath('./img/@alt').extract()[0]            addr = pic.xpath('./img/@src').extract()[0]            item['name'] = name            item['addr'] = addr            # 返回爬取到的数据            yield item

设置配置文件

settings.py增加如下内容

​​​​​​​

ITEM_PIPELINES = {'pic.pipelines.PicPipeline':100}USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'

编写数据处理脚本

pipelines.py

​​​​​​​

import urllib.requestimport os
class PicPipeline(object):    def process_item(self, item, spider):        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'}        req = urllib.request.Request(url=item['addr'],headers=headers)        res = urllib.request.urlopen(req)        file_name = os.path.join(r'down_pic',item['name']+'.jpg')        with open(file_name,'wb') as fp:            fp.write(res.read())

 

执行爬虫

scrapy crawl book --nolog

 

执行结果

使用Scrapy,帮你快速抓取网页数据(代码可下载)!_第4张图片

(关注公众号 ,回复:0703,可获取源码!)


往期回顾

  • JupyterLab最全详解,如果你还在使用Notebook,那你就out了!

  • Pandas教程:初学者入门必备,很全面,很详解!

  • 在windows上安装Pandas的两种简单方法(pip&anaconda)

  • 史上最全的Python基础语法知识清单

  • Docker新手入门,最全详解看这里!

  • 2020年使用最多的大数据分析工具

 

 

你可能感兴趣的:(笔记)