含义:
运行流程:1.scrapy框架拿到start_urls构造了一个request请求
2.request请求发送给scrapy引擎,中途路过爬虫中间件,引擎再发送request给调度器(一个队列存储request请求)
3.调度器再把requst请求发送给引擎
4.引擎再把requst请求发送给下载器,中途经过下载中间件
5.下载器然后访问互联网然后返回response响应
6.下载器把得到的response发送给引擎,中途经过下载中间件
7.引擎发送resonse给爬虫,中途路过爬虫中间件
8.爬虫通过response获取数据,(可以获取url,....)如果还想再发请求,就再构造一个request请求进行发送给引擎并再循环一次,如果不发请求,就把数据发送给引擎,中途路过爬虫中间件
9.引擎把数据再发送给管道
10.管道进行保存
我们先来通过cmd页板来创建项目吧
c:/d:/e: --->切换网盘
cd 文件名称 ----->切换进文件
scrapy startproject 项目名称 -------->创建项目
scrapy genspider 爬虫文件名称 域名 ------->创建爬虫文件
scrapy crawl 爬虫文件名称 ------------>运行爬虫文件
我们还可以创建start.py文件运行爬虫文件(要创建在项目下的第一层)
文件的创建位置:
代码运行爬虫文件:
导入from scrapy import cmdline
cmdline.execute([ 'scrapy',' crawl',' 爬虫文件名称' ]) :运行爬虫文件
下面我来分析一下里面的文件
可以看出scrapy框架给出了一些类属性,这些类属性的值可以更改,但是def parse()是不能随意更改名字和传参的
找到这个并打开,把注释去掉,数值越小越先执行,如果不打开就无法传数据到pipelines.py文件里的
MyScrapyPipeline类中的process_item()中的item参数
下面我来演示,
当我们点击第一个网址是会跳转到下面去
是因为爬虫文件遵守了一个规则,解决方法如下:在settings.py文件找到如下的代码:
把True改为False,然后运行
可以看出减少了一个错误
但还是有错误,下面我们来解决一下:
解决403的方法有添加UA(header请求头)
如图找到这里:
把My_scrapy (+http://www.yourdomain.com)这个更改为一个请求头:
可以正常访问了
但有些小可爱觉得这样太麻烦了,如果是更换header请求头很频繁就很不好用,对于这个问题,我们可以想想,如果在发送请求的过程就加个请求头是不是就不用这么麻烦了,那怎么加呢,
小可爱们可以想想,中间件这个是不是可以利用一下:
那我们就要找到中间件了,中间件在scrapy项目是一个middlewares.py文件
当我们打开这个文件是会看见:
主要是这个文件把爬虫中间件和下载中间件都写在middlewares.py文件
MyScrapyDownloaderMiddleware 这个是下载中间件
MyScrapySpiderMiddleware 这个是爬虫中间件
所以下面我来讲解 MyScrapyDownloaderMiddleware
主要的还是这两个比较常用,下面我们先来process_crawler
代码截图:
当我们打印的时候会发现,怎么没有打印,为什么会这样? 原因是我们的中间件还未打开,下面我们举要找到settings,py文件,并将其注释去掉
代码截图:
一运行成功了:
那我们再来试试process_response
代码截图:
结果:
可能一些小可爱又想到了一些情况,可不可以创建一个请求和响应的呢
下面我们来试试
代码截图:
结果:
细心的小可爱会发现和自己的预想不对,
下面我截取下载中间件来:
这个就是问题所在
下面我来解释一下下面的:
# - return None: continue processing this request
当return None时就会传递下去,比如duoban的process_request() 返回return None就会运行下载中间件的process_request()
# - or return a Request object
当return (一个Request对象)时不会传递下去,比如duoban的process_request() 返回return (一个Request对象)就不会运行下载中间件的process_request()而是返回到引擎,引擎返回给调度器(原路返回)
# - or return a Response object
当return (一个Responset对象)时不会传递下去,比如duoban的process_request() 返回return (一个Response对象)就不会运行下载中间件的process_request()而是返回到引擎,引擎返回给爬虫文件(跨级)
# - or raise IgnoreRequest: process_exception() methods of
如果这个⽅法抛出异常,则会调⽤process_exception⽅法
# installed downloader middleware will be called
# - return a Response object
# - return a Request object
返回Request对象:停⽌中间器调⽤,将其放置到调度器待调度下载;
# - or raise IgnoreRequest
有些小可爱就会想,那我可不可以自己创建一个中间件用于添加请求头:(要在middlewares.py文件)
是可以运行的
process_item(self, item, spider)
item:接收爬虫文件返回过来的数据,如字典
下面我们来爬取一下豆瓣吧
练习爬取豆瓣电影的图片
爬虫文件.py:
pipelines.py文件:
settings.py文件:
这个可以只输出自己想输出的内容
_____________________________________
以上这些都有打开
记住如果爬虫文件里发送请求失败后就无法回调pipelines.py文件里的函数
有些小可爱觉得有没有可以暂停和恢复爬虫的方法?有的话那是啥
下面我来讲讲
scrapy crawl 爬虫文件名字 -s JOBDIR=文件路径(随便定义)
Ctrl+c暂停爬虫
当小可爱想再次恢复时会发现不能运行下载了,
原因是啥呢,因为我们写的方法和框架给的不一样,
scrapy.Request如下:
dont_filte(不过滤吗?)r是一个过滤,为False则过滤(相同的url只访问一次),为True则不过滤
小可爱就会觉得那为啥parse()能发送,结果如下:
结果就很明了了,如果要想不过滤,就得更改
如果你想过滤重写方法:
有两种方法:
● 1 直接携带cookies请求⻚⾯(半自动,用selenium获取或者自己手动获取cookie)
来做个案例
第一种方法之手动登录获取之请求页面
爬虫文件代码实例一(在爬虫文件添加cookie);
爬虫文件代码实例二(在下载中间件文件添加cookie);
爬虫文件代码实例三(在下载中间件文件添加cookie);
代码1:
除了这些还可以通过下载中间件返回respose对象来
以上就是这些内容了.