推广 热搜:   公司  企业  中国  快速    行业  上海  设备  未来 

python的scrapy框架----->可以使我们更加强大,为打破写许多代码而生

   日期:2025-01-03     移动:http://fabua.ksxb.net/mobile/quote/5535.html

python的scrapy框架----->可以使我们更加强大,为打破写许多代码而生

含义:

 运行流程: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
返回Response对象:scrapy会继续调⽤其他中间件的process_response⽅
# - return a Request object
返回Request对象:停⽌中间器调⽤,将其放置到调度器待调度下载
# - or raise IgnoreRequest
抛出IgnoreRequest异常:Request.errback会被调⽤来处理函数,如果没
有处理,它将会被忽略且不会写进⽇志。

有些小可爱就会想,那我可不可以自己创建一个中间件用于添加请求头:(要在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)

2 找接⼝发送post请求存储cookie(发送账号和密码)
下面我用

来做个案例

第一种方法之手动登录获取之请求页面

爬虫文件代码实例一(在爬虫文件添加cookie);

 
 

 爬虫文件代码实例二(在下载中间件文件添加cookie);

 

 爬虫文件代码实例三(在下载中间件文件添加cookie);

 
 

代码1:

 

除了这些还可以通过下载中间件返回respose对象来

 

以上就是这些内容了.

本文地址:http://fabua.ksxb.net/quote/5535.html    海之东岸资讯 http://fabua.ksxb.net/ , 查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


相关最新动态
推荐最新动态
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  粤ICP备2023022329号