Scrapy爬虫框架学习

scrapy 简述

scrapy是一个爬虫框架,其原理图如下(绿色箭头是数据流向):
这是一张原理图
简单分析一下这张图:
1.Spiders是爬虫文件,有两个作用,一是把要爬取的网址的Requests发给引擎,引擎再发给调度器。二是处理下载器发送回来的Response。解析Response,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器).
2.Scrapy Engine是爬虫引擎,负责Spider、ItemPipeline、Downloader、Scheduler中间的数据传递。
3.Scheduler是爬虫调度器,因为我们不会只爬取一个网页,调度器的作用就是把我们要爬去的所有网页的Requests排好队,一个一个的爬,所以调度器其实就是一个队列。
4.Downloader是下载器,负责处理引擎发送的所有Requests请求,并将Requests获取到的Responses交还给引擎,再由引擎交给Spiders来处理。
5.Item Pipeline是管道文件,其实这个对新手非常不友好,根据图片,我们可能会觉得Item Pipeline是一个文件,但是在真正的scrapy项目中,管道文件是两个文件,一个叫items.py,个人理解这个文件就是写出自己想获得哪些item(数据),即项目的目标文件。而另一个文件pipeline.py就是处理item.py中item,即过滤,储存item.py中的item。
6.Spider Middlewares是爬虫中间件,你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件。
7.Downloader是下载中间件,你可以当作是一个可以自定义扩展下载功能的组件。下载中间件的作用一般来说就是实现随机请求头和ip代理池。

scrapy流程

简单说一下scrapy的一般流程:爬虫文件Spiders把网页的Requests发送给引擎,引擎把接收到的Requests交给调度器排队,调度器把排好队的Requests交给引擎,引擎再把Requests交给下载器,下载器返回每个Request对应的Response给引擎,引擎拿到Responses并把它交给爬虫文件Spiders经行解析,然后分情况,第一,没有需要跟进的URL,直接将Spiders解析的结果交给引擎,引擎再交给Item pipiline进行处理。第二种情况,就是要跟进URL,那么就会把Spiders解析的结果和跟进的URL的Requests交给引擎。引擎把解析的结果交给Item pipiline进行处理,把Requests交给调度器,然后就和上面一摸一样了,直到所有的Requests都处理完,爬虫结束。
是不是感觉引擎就像是一个工具人。。。

scrapy安装(仅Windows)

一般来说就直接在cmd中用 pip install scrapy就行了,如果报错的话,就试试下载pypiwin32,lxml这两个库

快速开始

制作scrapy爬虫需要4步:
1.新建项目
2.创建爬虫文件
3.制作爬虫
4.存储内容

创建项目

先创建一个文件夹,最好创建在自己的pycharm中,就不用再添加python解释器了。然后右键,点击CmdHere。如果你没有这个选项,请先看这个大神的博客:
如何在电脑中添加CmdHere
然后注意,每次自己的电脑更新后就要重复一次上面的博客中的操作。
完事之后输入命令,
命令为

scrapy startproject douban250

douban_top250是项目名,根据自己的爬虫项目取名字

创建爬虫文件

创建完项目后,输入命令进入项目

cd douban250

之后创建爬虫文件

scrapy genspider douban_spider  "movie.douban.com"

first_spider是爬虫文件名, "movie.douban.com"是我们爬取的豆瓣top250的域名。

制作爬虫

首先,明确我们要爬去的数据,然后用pychram打开我们的爬虫项目,打开item.py这个文件,把自己想要获取的数据写上去

movie_name = scrapy.Field()
movie_director_actors = scrapy.Field()
movie_time_country = scrapy.Field()
movie_grade = scrapy.Field()
comment_number = scrapy.Field()
movie_introduce = scrapy.Field()

然后我们的先分析一下我们要爬取得网站,然后才知道该怎么获取我们需要的数据。
网址:https://movie.douban.com/top250
再编辑爬虫文件之前,先打开setting.py这个文件,把22行的ROBOTSTXT_OBEY = True
改成,表示不遵守robot协议。

ROBOTSTXT_OBEY = False

再把42行到45行的请求头信息的注释给取消掉,并增加自己浏览器的user-agent

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
}

之后打开spiders目录下的爬虫文件,即first_spider.py文件。把start_urls,改成第一个网页的网址。

start_urls = ['https://movie.douban.com/top250?start=0&filter=']

在parse函数中编写具体的爬取代码。当我们把要获取到的数据解析出来后,再按照item.py的要求整合,并返回给引擎

from douban_top250.items import Douban_top250Item
item = Douban_top250Item(movie_name=movie_name,
                                    movie_director_actors=movie_director_actors,
                                    movie_time_country=movie_time_country,
                                    movie_grade=movie_grade,
                                    comment_number=comment_number,
                                    movie_introduce=movie_introduce)
 yield item

但是这样的话我们就只能够爬取一个网址,回忆一下,我们平时想看下一页内容是怎么做到的。没错,就是点击下一页,我们我们可以找到下一页的网址,这样就能够把所有网页爬取到。

next_url = response.xpath('//div[@class="paginator"]/span[@class="next"]/a/@href').get()
        if not next_url:
            return
        else:
            next_url = "https://movie.douban.com/top250" + next_url
            yield scrapy.Request(next_url, callback=self.parse)

存储内容

我们想把最后的数据存储成表格的形式。

    def __init__(self):
        self.fp = open("douban.csv", "wb")
        self.exporter = CsvItemExporter(self.fp, fields_to_export=['movie_name',
                                                                   'movie_director_actors',
                                                                   'movie_time_country',
                                                                   'movie_grade',
                                                                   'comment_number',
                                                                   ])

结束之后打开setting.py文件,取消掉68行到70行的注释,这样才能使用pipeline.py文件。

怎么运行爬虫?

有两种方法运行这个爬虫:
1.用cmd,进入这个爬虫项目中,然后输入命令

scrapy crawl douban_spider

2.新建一个爬虫文件,名字随意,写入代码

from scrapy import cmdline
cmdline.execute("scrapy crawl douban_spider".split())    

然后运行你新建的这个文件就行了。

结果展示

在这里插入图片描述

这个爬虫的所有参考代码我放在我的github上面
https://github.com/yangxulin/douban250

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值