码迷,mamicode.com
首页 > 其他好文 > 详细

爬虫之Scrapy框架

时间:2019-01-14 20:23:02      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:异步   div   可迭代对象   line   parse   install   配置   str   特定   

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。
其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

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

技术分享图片

 

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的安装:

  Linux系统:

pip install scrapy

  Windows系统:

      a. pip3 install wheel

      b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

      c. 进入下载目录,执行 pip3 install Twisted?17.1.0?cp35?cp35m?win_amd64.whl

      d. pip3 install pywin32

      e. pip3 install scrapy

Scrapy基本使用

1.基本命令

# 创建项目
scrapy startproject corn
# 进入项目
cd corn
# 创建爬虫程序
scrapy genspider 应用名称 爬取网页的起始url (例如:scrapy genspider corn www.xxx.com)
# 运行爬虫
scrapy crawl 爬虫名称(corn) --nolog

2.项目结构

技术分享图片

3.编写代码

# -*- coding: utf-8 -*-
import scrapy


class XiaohuarSpider(scrapy.Spider):
    name = xiaohuar #爬虫程序名
    # 允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
    allowed_domains = [www.xxx.com]
    # 起始爬取的url
    start_urls = [http://www.xiaohuar.com/]

    # 访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll

    def parse(self, response):
        print(response.text) #获取字符串类型的响应内容
        print(response.body)#获取字节类型的相应内容

4.修改配置(setting.py)

修改内容及其结果如下:
19行:USER_AGENT = Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 #伪装请求载体身份

22行:ROBOTSTXT_OBEY = False  #可以忽略或者不遵守robots协议

5.执行爬虫程序

scrapy crawl xiaohuar(爬虫程序名字)

技术分享图片

执行程序后就拿到了整个页面的数据

小试牛刀:

将糗事百科首页中段子的内容和标题进行爬取

# -*- coding: utf-8 -*-
import scrapy

class QiubaiSpider(scrapy.Spider):
    name = qiubai
    allowed_domains = [https://www.qiushibaike.com/]
    start_urls = [https://www.qiushibaike.com/]

    def parse(self, response):
        #xpath为response中的方法,可以将xpath表达式直接作用于该函数中
        odiv = response.xpath(//div[@id="content-left"]/div)
        content_list = [] #用于存储解析到的数据
        for div in odiv:
            #xpath函数返回的为列表,列表中存放的数据为Selector类型的数据。我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。
            author = div.xpath(.//div[@class="author clearfix"]/a/h2/text())[0].extract()
            content=div.xpath(.//div[@class="content"]/span/text())[0].extract()

            #将解析到的内容封装到字典中
            dic={
                作者:author,
                内容:content
            }
            #将数据存储到content_list这个列表中
            content_list.append(dic)

        return content_list

执行程序:

    scrapy crawl 爬虫名称 :该种执行形式会显示执行的日志信息
    scrapy crawl 爬虫名称 --nolog:该种执行形式不会显示执行的日志信息

 

爬虫之Scrapy框架

标签:异步   div   可迭代对象   line   parse   install   配置   str   特定   

原文地址:https://www.cnblogs.com/zycorn/p/10268498.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!