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

时间: 2024-10-11 11:07:37

python scrapy的一点杂谈的相关文章

Python Scrapy 自动爬虫注意细节

一.首次爬取模拟浏览器 在爬虫文件中,添加start_request函数.如: def start_requests(self): ua = {"User-Agent": 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2050.400 QQBrowser/9.5.10169.400'} yie

Python.Scrapy.14-scrapy-source-code-analysis-part-4

Scrapy 源代码分析系列-4 scrapy.commands 子包 子包scrapy.commands定义了在命令scrapy中使用的子命令(subcommand): bench, check, crawl, deploy, edit, fetch, genspider, list, parse, runspider, settings, shell, startproject, version, view. 所有的子命令模块都定义了一个继承自 类ScrapyCommand的子类Comman

python Scrapy安装

python Scrapy安装和介绍 Windows7下安装1.执行easy_install Scrapy Centos6.5下安装 1.库文件安装yum install libxslt-devel libxml2-devel 2.将系统自带python2.6的easy_install备份,使用python2.7.10升级后的easy_install mv /usr/bin/easy_install /usr/bin/easy_install_2.6 ln -s /usr/local/pytho

python scrapy cannot import name xmlrpc_client的解决方案,解决办法

安装scrapy的时候遇到如下错误的解决办法: "python scrapy cannot import name xmlrpc_client" 先执行 sudo pip uninstall six 再执行 sudo easy_install six 验证是否解决: scrapy

Python.Scrapy.11-scrapy-source-code-analysis-part-1

Scrapy 源代码分析系列-1 spider, spidermanager, crawler, cmdline, command 分析的源代码版本是0.24.6, url: https://github.com/DiamondStudio/scrapy/blob/0.24.6 如github 中Scrapy 源码树所示,包含的子包有: commands, contracts, contrib, contrib_exp, core, http, selector, settings, templ

Python scrapy 实现网页爬虫

Python scrapy 安装和网页爬虫功能实现 现在组内有个工作就是维护恶意URL库,然后这个维护工作,主要是通过从几个会发布恶意URL地址的网站获取恶意网址,每次都得花费半天,很乏味的事情.所以就想到能否用个爬虫搞定. 这两天研究了下python scrapy,发现利用scrapy的确很容易实现网址爬取功能. 一.scrapy安装 简单的说明一下scrapy的安装过程 window安装 先安装python,要提醒一下是环境变量的配置,只有环境变量配置对了,才能在命令行执行窗口找到pytho

天气提醒邮件服务器(python + scrapy + yagmail)

天气提醒邮件服务器(python + scrapy + yagmail) 项目地址: https://gitee.com/jerry323/weatherReporter 前段时间因为xxx上班有时候忘记带伞,就写了这个通过发送邮件提醒天气的东西.其实目前还是有点小问题,暂时也还没花精力来维护(够用就行).项目不涉及到数据库的东西,就是简单的爬虫+邮件服务器,代码拙劣. 下面讲讲大概的想法吧. 在阿里云租了一台服务器不知道该怎么使用比较好,便慢慢产生了做一个天气提醒服务的想法.本来希望使用短信提

关于Python学习的一点说明

关于Python学习的一点说明 我是用什么地方的资料来学习python的呢? 答案当然是鼎鼎大名的GitHub了. 5万多星推荐,100天让你从入门到精通,你值得拥有,点我进入查看 原文地址:https://www.cnblogs.com/alking1001/p/11437876.html

Python Scrapy爬虫(上)

Python Scrapy爬虫 预备知识: 1.Scrapy框架:是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架. 2.Scrapy去重原理:Scrapy本身自带有一个中间件.scrapy源码中可以找到一个dupefilters.py去重器,需要将dont_filter设置为False开启去重,默认是True,没有开启去重. 3.指纹去重:对于每一个URL的请求,调度器都会根据请求得相关信息加密得到一个指纹信息,并且将该URL的指纹信息和set()集合中的指纹信息进行