这几天为了做课程设计,想起之前学过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