python老男孩scrapy视频刷课记录

mac2024-10-07  60

python全栈3 day96 02 抽屉示例:初识Scrapy并获取新闻标题:主要讲了scrapy的生成框架结构scrapy startproject day96、生成爬虫模板(cd scrapy;scrapy genspider example)、单页parse的xpath语法(//全局变量下的子孙,.//当前子孙变量,)。

python全栈3 day96 03 抽屉示例:递归获取所有页码:分为两部分,第一部分讲了自己进行通过对url进行md5编码,缩短url长度到固定长度,链接去重,第二部分主要讲yield用于迭代以及depth_limit参数控制迭代深度。

python全栈3 day96 04 抽屉示例:基于pipeline实现标题和URL持久化。同样分为了两部分,定义了格式化的Item类。pipeline注意要注册,不同的pipelines要根据spider.name进行判断是否进行处理。

python全栈3 day97 01 Scrapy上节回顾。注意spider定义好域名限制allowed_domain = ["baidu.com"],递归时候会先判断域名。同时还要注意start_requests可以重写覆盖等。注意response.meta中也可以有depth,是爬虫中保存变量很重要的东西。

python全栈3 day97 02 去除重复URL。第一部分讲了select相关的内容,同时注意//a/[@id]代表有id的a,//a/@id代表取a下面的id,还有a[contains(@href,"www.baidu.com")]一些条件判断。

第二部分讲了链接去重RFPDupeFilter,其中着重讲了cls的使用。from_settings是classmethod实例化时使用obj = ClassA.from_settings()进行实例化,返回结果为cls()与staticmethod不同,staticmethod不带cls参数。去重是借用文件request.seen进行去重的,扩展可以使用redis,缓存等。

python全栈3 day97 03 pipeline补充。open_spider打开io链接、close_spider关闭io链接以及from_crawler创建对象并引入配置文件,__init__进行数据的初始化。最后一个pipeline注意raise DropItem()

python全栈3 day97 04 自动登录抽屉并点赞。主要讲了在Scrapy中使用Post方式进行登录点赞的操作。这里的自动登录抽屉网中没有显示验证码等。登录时候用的是yield Request(method="Post")的post方法账户密码放入了post请求体,同时点赞的功能也是post做的。

python全栈3 day97 05 scrapy框架扩展。这节课的信息量很大,包括了scrapy的Extension扩展、hook(钩子)的概念、以及进一步的信号量signal的注册问题。

Extensions Extensions在爬虫启动时候进行了初始化操作。通过与signals进行注册,实现了hook。Signals。signals与twisted的deffer搭配使用,因此经常会在源码core的engine.py中见到这些信号量,包括spider_open,request_reached_downloader等。这几个信号量同时也可以在Extension里使用,和deffer同理。都是hook方法,将自定义的方法或deffer传到爬虫中。

python全栈3 day97 06 配置文件。

讲了以下几个参数:

USE_AGENT请求头,BOT_NAME爬虫名称。AUTOTHROTTLE。自动限制DEPTH_PRIORTY。深度搜索还是广度优先搜索。COOKIES_ENABLE。请求返回时候是否带着cookie。CONCURRENT_REQUEST PER_DOMAIN PER_IP对应目标网站的域名或者ip的并发数。TALENTCONSOLE_ENABLE。这个很有特色,可以在爬虫运行时候,在同一个机器上面运行运行命令:talent 127.0.0.1 6359然后输入命令监控爬虫的state状态。

python全栈3 day98 01 Scrapy配置之自动限速以及缓存

继续了上节课的配置,讲了自动限速部分的源码。重要。在throttle.py中进行定义。缓存。默认没开启,为了更快,在“更近”的地方拿到数据。一般就是指直接放在内存中或文件lru中,因为数据库操作就是IO操作,需要时间。HTTPCATHE_ENABLE/POLICE策略/DIR目录/STAGE,为了再次运行爬虫时候,不链接网络,从本地缓存中取出。如果设置缓存,可以使用RFC2616策略缓存而不是DUMMY策略。

python全栈3 day98 02 Scrapy之默认代理以及扩展代理

主要就是讲了原生代理很难用,建议自定制,同时注意如果代理有密码的情况加header参数 proxy-authority :  basic base64(name passwd)

python全栈3 day98 03 Scrapy之自定义Https证书

一般不常用

python全栈3 day98 04 Scrapy配置之下载中间件

今天看了下进度,感觉有一点点慢,在离职前能把scrapy的视频看完,最深的目标是把scrapy的core里面twisted相关搞清楚,然后同步的早上要开始做leetcode了,下午可以用来学习,网上开发项目作总结,这个顺序应该比较容易接受,因为同一个形式基本上搞三个小时就比较累了。一定记住从现在开始每天都要写博客,坚持每天写代码,就像2011年开始那样每天都在坚持健身中度过,新的十年,从2020年开始,写程序就是我的健身,要用于去尝试,去做记录,去积累,同时不忘记健身,不给自己太大压力,稳定住双向情感障碍,即可。就这样!今天还算可以,先睡觉了。

python全栈3 day98 04 Scrapy配置之下载中间件

注意一下middleware中的两个函数process_request与process_response。

process_request返回None继续执行,返回Request重新调度,返回Response则到process_response中执行,raise IgnoreRequest可以挂起新的异常。执行两个函数的时候,按照12344321的顺序执行。process_exception处理过程中异常情况。

python全栈3 day98 05 Scrapy配置之爬虫中间件

四个函数process_start_requests,process_spider_input,processor_spider_output.processor_spider_exception在爬虫中间件中执行。同时注意这些中间件都是在scrapy.core.spidermw.SpiderMiddlewareManager和scrapy.core.downloader.middleware.DownMiddlewareManager中_add_middleware根据has_attr属性进行加载。

python全栈3 day98 06 Scrapy配置之自定义scrapy命令

主要讲的是CrawlerProcessor和CrawlerRunner等类加载爬虫,然后运行爬虫。

python全栈3 day98 07 Scrapy源码流程简述

这部分主要从命令行开始讲起,从CrawlerProcess和它的父类CrawlerRunner开始讲,一直引申到twisted的deffer来实现异步的网页下载。我按照视频写了一边twisted异步下载3个链接的test.py感觉就是借助twisted让回调代码写的好看一些,主要是用defer.DeferredList来加载任务,reactor来启动run和终止stop。

另外清楚了爬虫几个隐藏的重要类,按照父类往下:

 

cmdline.execute()。严格来说第一层不是一个类,而是一个方法。我们运行爬虫时候在操作系统中敲scrapy,从这里开始比如scrapy crawl spidername,那么就会进入execute()方法,这个方法会有一个变量cmds,来判断咱们敲的子命令是什么是runspider还是crawl,得到cmd变量也就是初始化了下面3的具体命令(这里就是crawl.Command而不是runspider.Command),就在这里初始化了CrawlerProcess到变量cmd.crawler_process。ScrapyCommand。成员函数主要是各种命令号的方法。最重要的成员变量:crawler_process爬虫进程变量。可以说这个变量如同一个进程,爬虫、引擎是跑在里面的。各个命令中的Command类。继承ScrapyCommand,其中run方法是最标准的爬虫启动方法,在1中通过cmd调用了这里的run()。在run()里面,crawler_process调用了两个方法crawler_process.crawl(spname,**opts.spargs),和crawler_process.start()。start方法很简单,里面就是一个twisted的reactor.run(),也就是激活。那么重点就是crawl方法了,这里会把蜘蛛、引擎开启,然后开始跑。Spider类。看到这里我们就有些眼熟了,这不就是我们平时写自定义爬虫集成的父类嘛。不过出现在这一层还是有一些唐突,那么我们在3中说crawler_process.crawl(spname,**opts.spargs)里面参数spname就是这个我们写的爬虫,不过具体的加载爬虫过程我们暂且不表,先继续往下说Crawler。大家这里一定要注意,Spider和Crawler是两个完全不同的概念,虽然我们平时说爬虫爬虫,但是在scrapy里面,Crawler应该形象的理解为一个“活生生的虫子”,有引擎支持它运行,而Spider应该只理解成为一个“抓取路径”,它最多算一个“蜘蛛壳子”,比Crawler要“小的多”。因为Crawler类里面会激活引擎类、和Spider"蜘蛛壳子"类,以及加载各种中间件和pipeline。因此这里要作区分,我们的这篇博文主要分析的也是Crawler类的总体行为。Crawler类。进入到crawler_process.crawl(spname,**opts.spargs),这里我们传入的是一个Spider类,在这里会创建一个crawler实例,然后在self._crawl中运行crawler.crawl,在这里我们终于见到了@defer.inlineCallbacks注解,终于与twisted有点关系了,在这里有两个方法_create_spider,_create_engine分别创建了“Spider”爬虫类和"Engine"引擎类然后引擎开始启动爬虫,调度爬虫的start_requests方法。ExecutionEngine类。这个类基本上就是twisted用到的地方了。从5中的“开始启动爬虫”也就是open_spider方法,再往下不断将爬虫链接发到各个组件之间,基本上数据在各个组件中相互交互用到的就是twisted了。
最新回复(0)