python scrapy的一点杂谈

这几天为了做课程设计,想起之前学过python,所以想起要去做个爬虫,于是用上了scrapy框架,当然在这期间也了解了一下requests,但是还是没有scrapy方便,毕竟它没有处理cookie的机制,需要自己去手动处理,比较麻烦,下面我来先稍微讲讲自己对scrapy运行原理的理解:

如图我们可以看到这是scrapy的大致结构,scrapy的运行流程:

1.scrapy engine打开一个domain,并根据domain找到对应的处理这个domain的spider(spider中间件重要作用是为request请求头中加入refer,根据对应的response的url)

2.spider处理这个url并返回request,scrapy engine将request放到调度器

3.engine向调度器请求下一个url

4.调度器将这个request传到下载中间键(处理cookies,认证,user-agent),然后下载器会去下载这个request的内容,并将对应的response返回到Spider

5.Spider再根据response产生出item或者request,并将它传到itempipeline或者调度器中

6.从2步开始重复直到没有request


在这里加入一个插曲,Spider中间件会对Spider发出的request进行检查,只有满足allow_domain才会被允许发出,这里还有我自己的一个疑惑:scrapy中有一个linkExtractor,我的理解是当它会对response的url进行解析,如果符合,则会送去回调方法,但是这样的话就有一个疑惑,当你用Request方法创建一个request,同样可以设置一个callback,那么此时这个response究竟是被送去哪一个callback去处理呢?还是都被处理呢?(都的话感觉不太合适吧?还是有优先级?)


scrapy最重要的一点就是它能自动处理cookie,但是我们可以从官方文档看到一个比较奇怪的地方,

for i, url in enumerate(urls):
    yield scrapy.Request("http://www.example.com", meta={'cookiejar': i},
        callback=self.parse_page)

我在这里的理解是当我们单个spider中每次只有一个request时候,因为默认是使用一个cookiejar来处理,所以我们在发出request的时候,不需要手动使用meta来给它布置cookiejar,但是当单个spider多个request的时候,因为返回的每个response要求下一个request带的cookie都不同,所以每一次都要手动给每个request添加cookiejar来记录


这里顺便说下,我们使用爬虫模拟浏览器去访问,其实主要是带有cookie和请求头中的refer和user-agent信息,由于scrapy帮我们处理好了这些,所以使我们能够更专注于业务逻辑,这是非常有趣的,以后有空一定要取看看源码


再浅谈下session和cookie的区别

session和cookie都是一种保持http连接的方式,session是将信息存储在服务器端,cookie是保存在客户端

在不禁用cookie的情况下,当客户端第一次发送请求到服务器端的时候,服务器端会产生一个session_id,然后将它设置在响应报文的setcookie选项中,当客户端收到之后,知道下一次发送请求报文要加上这个cookie,当下一次发送的时候,服务器会根据这个session_id找到对应的session(由tomcat自行处理),如果禁用了cookie,那么一般则会采取放在url后面或者使用input hidden的形式传入session_id


客户端每次发送cookie的时候,都会在本地搜索有效范围大于这次请求资源的cookie,然后加在request中的cookie里面,发送出去,这里必须注意的是response其实是没有cookie这个选项的,所以我们看响应报文头也是没有cookie选项的,它只有一个setcookie选项告诉下一次发送的请求应该有什么样的cookie而已


愿各位能有所收获,顺便求大神解救下我的疑惑~

最后附上我的github里面用scrapy新建的小项目 https://github.com/yue060904/Spider

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值