Scrapy框架介绍及基础示例

Scrapy框架介绍及基础示例


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

Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下:
在这里插入图片描述
组件:

	引擎(Scrapy)
		用来处理整个系统的数据流, 触发事务(框架核心) 		
	调度器(Scheduler)
		用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回.   
		 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 
		 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
	下载器(Downloader) 
		用于下载网页内容,并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的) 		
	爬虫(Spiders)
		爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。
		用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
	项目管道(Pipeline)
		负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、
		清除不需要的信息。当页面被爬虫解析后,
		将被发送到项目管道,并经过几个特定的次序处理数据。 		
	下载器中间件(Downloader Middlewares)
		位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
	爬虫中间件(Spider Middlewares)	
		介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
	调度中间件(Scheduler Middewares)
		介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

运行流程大概如下:

		引擎从调度器中取出一个链接(URL)用于接下来的抓取
		引擎把URL封装成一个请求(Request)传给下载器
		下载器把资源下载下来,并封装成应答包(Response)
		爬虫解析Response
		解析出实体(Item),则交给实体管道进行进一步的处理
		解析出的是链接(URL),则把URL交给调度器等待抓取

示例:
新建项目:

scrapy startproject xiaohua
cd xiaohua
scrapy genspider xiaohua xiaohuar.com

项目目录:
pro_name_dir/

 scrapy.cfg            # 部署配置文件
    	    pro_name/             # project's Python module, you'll import your code from here
    	        __init__.py
        	    items.py          # 设置数据存储模板,用于结构化数据,如:Django的Model
       	        middlewares.py    # 中间件文件
       	        pipelines.py      # 数据处理行为,如:一般结构化的数据持久化
       	        settings.py       # 项目配置文件
       	        spiders/          # 爬虫目录,如:创建文件,编写爬虫规则
    	            __init__.py
    	            xiaohua.py

items.py

import scrapy

class XiaohuaPicItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    addr = scrapy.Field()
    name = scrapy.Field()

setttings.py

ITEM_PIPELINES = {
   'xiaohua_pic.pipelines.XiaohuaPicPipeline': 100,
}

pipelins.py

import urllib
import os

class XiaohuaPicPipeline(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)
        # Python3.3之后urllib与urllib2合并,只能使用urllib.request/response代替urllib2
        res = urllib.request.urlopen(req)
        # 确保pic_dir目录真实存在
        file_name = os.path.join(r'E:\python_project_dir\xiaohua_pic\pic_dir', item['name'] + '.jpg')
        with open(file_name, 'wb') as fp:
            fp.write(res.read())

xiaohua.py

# -*- coding: utf-8 -*-
import scrapy
import os
from scrapy.http import Request
from xiaohua_pic.items import XiaohuaPicItem

class XiaohuaSpider(scrapy.Spider):
    name = 'xiaohua'
    allowed_domains = ['xiaohuar.com']
    start_urls = ['http://www.xiaohuar.com/hua/']

    url_set = set()
    def parse(self, response):
        # 获取所有图片的a标签
        if response.url.startswith("http://www.xiaohuar.com/list-"):
            allPics = response.xpath('//div[@class="img"]/a')
            for pic in allPics:
                # 分别处理每个图片,取出名称及地址
                item = XiaohuaPicItem()
                name = pic.xpath('./img/@alt').extract()[0] # 提取获取名称
                addr = pic.xpath('./img/@src').extract()[0] # 提取获取img的src
                addr = 'http://www.xiaohuar.com' + addr
                item['name'] = name
                item['addr'] = addr
                yield item # 返回爬到的信息
        # 获取所有链接地址
        urls = response.xpath("//a/@href").extract()
        for url in urls:
            # 筛选href为http://www.xiaohuar.com/list-的分页url,
            if url.startswith("http://www.xiaohuar.com/list-"):
                if url in XiaohuaSpider.url_set:
                    pass
                else:
                    XiaohuaSpider.url_set.add(url)
                    yield self.make_requests_from_url(url) # 回调parse,将新url传入
                    # 回调函数默认为parse,也可以通过from scrapy.http import Request来指定回调函数
                    # from scrapy.http import Request
                    # Request(url,callback=self.parse)
            else:
                pass

运行:
scrapy crawl xiaohua
或cd spider
scrapy runspider xiaohua.py

使用PythonScrapy框架可以非常方便地爬取豆瓣电影的数据。下面是一个简单示例: 首先,我们需要创建一个新的Scrapy项目。在命令行中执行以下命令: ``` scrapy startproject douban_movies ``` 接下来,进入项目目录: ``` cd douban_movies ``` 然后,我们可以创建一个名为`movies`的Spider来定义我们想要爬取的网页和处理数据的逻辑。在项目目录下执行以下命令: ``` scrapy genspider movies movie.douban.com ``` 这会在`spiders`目录下生成一个名为`movies.py`的文件。我们可以在这个文件中编写爬虫代码。 首先,我们需要定义要爬取的网址,在`start_urls`中添加豆瓣电影的首页地址: ```python start_urls = ['https://movie.douban.com/'] ``` 然后,我们需要定义如何解析网页和提取数据。我们可以使用XPath或CSS选择器来定位需要的数据。这里以使用XPath为例: ```python def parse(self, response): # 提取电影名字 movie_names = response.xpath('//div[@class="hd"]/a/span/text()').extract() for name in movie_names: print(name) # 提取评分 scores = response.xpath('//span[@class="rating_num"]/text()').extract() for score in scores: print(score) ``` 在上面的代码中,我们使用XPath选择器来提取电影的名字和评分,并打印出来。你可以根据需要修改这部分代码,比如将数据保存到数据库或文件中。 最后,在命令行中执行以下命令来运行爬虫: ``` scrapy crawl movies ``` 以上就是使用PythonScrapy框架爬取豆瓣电影的简单示例。你可以根据自己的需求进一步扩展和优化这个爬虫,比如添加翻页功能或处理更复杂的网页结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值