KMP算法计算方式 前缀:a,ab,abc,abca,abcaa。后缀:b,ab,aab,caab,bcaab。前缀:a,ab,abc,abca。后缀:a,aa,caa,bcaa。next值 0 1 1 2 2 3 1 2。前缀:a,ab,abc。后缀:a,ca,bca。模式串 a b a a b c a c。j值: 1 2 3 4 5 6 7。next值 0 1 1 2 2 3 1 2。模式串:a b c a a b b。模式串 a b a a b c a c。
高级深入--day47 因为redis数据库不能存储复杂对象(key部分只能是字符串,value部分只能是字符串,字符串列表,字符串集合和hash),所以我们存啥都要先串行化成文本才行。这里使用的就是python的pickle模块,一个兼容py2和py3的串行化工具。这个serializer主要用于一会的scheduler存reuqest对象。这里实现了loads和dumps两个函数,其实就是实现了一个序列化器。
高级深入--day46 根据源代码来看,scrapy-redis使用了scrapy本身的一个fingerprint接request_fingerprint,这个接口很有趣,根据scrapy文档所说,他通过hash来判断两个url是否相同(相同的url会生成相同的hash结果),但是当两个url的地址相同,get型参数相同但是顺序不同时,也会生成相同的hash结果(这个真的比较神奇。而分布式跑的话,就需要各个主机上的scheduler都连接同一个数据库的同一个request池来判断这次的请求是否是重复的了。
高级深入--day45 scrapy-redis工程的主体还是是redis和scrapy两个库,工程本身实现的东西不是很多,这个工程就像胶水一样,把这两个插件粘结了起来。scrapy-redis的官方文档写的比较简洁,没有提及其运行原理,所以如果想全面的理解分布式爬虫的运行原理,还是得看scrapy-redis的源代码才行。负责根据setting中配置实例化redis连接。被dupefilter和scheduler调用,总之涉及到redis存取的都要使用到这个模块。
高级深入--day44 ,但是Scrapy多个spider不能共享待爬取队列Scrapy queue, 即Scrapy本身不支持爬虫分布式,scrapy-redis 的解决是把这个Scrapy queue换成redis数据库(也是指redis队列),从同一个redis-server存放要爬取的request,便能让多个spider去同一个数据库里读取。Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件(仅有组件)。
高级深入--day43 在“代理”后面的输入框选择“手动”,在“代理服务器主机名”后面的输入框输入电脑的ip地址,在“代理服务器端口”后面的输入框输入8888,然后点击“保存”按钮。打开Android设备的“设置”->“WLAN”,找到你要连接的网络,在上面长按,然后选择“修改网络”,弹出网络设置对话框,然后勾选“显示高级选项”。启动Android设备中的浏览器,访问网页即可在Fiddler中可以看到完成的请求和响应数据。里设置允许连接远程计算机,确认后重新启动Fiddler。代理地址(电脑IP):192.168.xx.xxx。
高级深入--day42 首先发送登录页面的get请求,获取到页面里的登录必须的参数(比如说zhihu登陆界面的 _xsrf)只要是需要提供post数据的,就可以用这种方法。如果实在没办法了,可以用这种方法模拟登录,虽然麻烦一点,但是成功率100%然后和账户密码一起post到服务器,登录成功。
高级深入--day36 Scrapy设置(settings)提供了定制Scrapy组件的方法。可以控制包括核心(core),插件(extension),pipeline及spider组件。该字典默认为空,值(value)任意,不过值(value)习惯设置在0-1000范围内,值越小优先级越高。Item Processor(即 Item Pipeline) 同时处理(每个response的)item的最大值。可选的级别有: CRITICAL、 ERROR、WARNING、INFO、DEBUG。下载器超时时间(单位: 秒)。
高级深入--day35 如果其返回 None ,Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该request被执行(其response被下载)。如果其返回一个 Response (可以与传入的response相同,也可以是全新的对象), 该response会被在链中的其他中间件的 process_response() 方法处理。如果其返回一个 Request 对象,则中间件链停止, 返回的request会被重新调度下载。
高级深入--day34 使用Scrapy抓取网页时,如果想要预填充或重写像用户名、用户密码这些表单字段, 可以使用 FormRequest.from_response() 方法实现。通常网站通过 实现对某些表单字段(如数据或是登录界面中的认证令牌等)的预填充。如果希望程序执行一开始就发送POST请求,可以重写Spider类的。使用FormRequest.from_response()方法。方法,并且不再调用start_urls里的url。方法发送POST请求。
高级深入--day33 它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。在rules中包含一个或多个Rule对象,每个Rule对爬取网站的动作定义了某种特定操作,比如提取当前相应内容里的特定链接,是否对提取的链接跟进爬取,对提交的请求设置回调函数等。:指定该spider中哪个的函数将会被调用,从link_extractor中获取到链接列表时将会调用该函数。
高级深入--day32 Item传给Item pipline持久化 , 而Requests交由Scrapy下载,并由指定的回调函数处理(默认parse()),一直进行循环,直到处理完所有的数据为止。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。该对象包含了spider用于爬取(默认实现是使用 start_urls 的url)的第一个Request。当请求url返回网页没有指定回调函数时,默认的Request对象回调函数。包含了spider允许爬取的域名(domain)的列表,可选。
高级深入--day31 分配给每个类的整型值,确定了他们运行的顺序,item按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内(0-1000随意设置,数值越低,组件的优先级越高)以下pipeline将所有(从所有'spider'中)爬取到的item,存储到一个独立地items.json 文件,每行包含一个序列化为'JSON'格式的'item'。当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。