襄阳市住房和城乡建设厅网站上视频网站系统开发

web/2025/9/26 16:13:54/文章来源:
襄阳市住房和城乡建设厅网站上,视频网站系统开发,创新型的顺的网站制作,做微网站 主机 域名0 持久化(pipelines.py)使用步骤 1 爬虫中间件和下载中间件 1.1 爬虫中间件(一般不用) 1.2 下载中间件#xff08;代理#xff0c;加请求头#xff0c;加cookie#xff09; 1.2.1 加请求头(加到请求对象中) 1.2.2 加cookie 1.2.3 加代理 2 scrapy集成selenium 3 源码去重…0 持久化(pipelines.py)使用步骤 1 爬虫中间件和下载中间件 1.1 爬虫中间件(一般不用) 1.2 下载中间件代理加请求头加cookie 1.2.1 加请求头(加到请求对象中) 1.2.2 加cookie 1.2.3 加代理 2 scrapy集成selenium 3 源码去重规则布隆过滤器 3.1 布隆过滤器 4 分布式爬虫 持久化(pipelines.py)使用步骤 # 1 scrapy 框架安装创建项目创建爬虫运行爬虫 # 2 scrapy架构 # 3 解析数据1 response对象有css方法和xpath方法-css中写css选择器 response.css()-xpath中写xpath选择 response.xpath()2 重点1-xpath取文本内容.//a[contains(class,link-title)]/text()-xpath取属性.//a[contains(class,link-title)]/href-css取文本a.link-title::text-css取属性img.image-scale::attr(src)3 重点2.extract_first() 取一个.extract() 取所有 # 4 继续爬取- 下一页的地址Request(urlnext, callbackself.parse)- 详情地址Request(urlurl, callbackself.detail_parser)-额外去写detail_parser内的解析# 5 数据传递-解析中有数据---》下个解析中还能拿到Request(urlurl, callbackself.detail_parser,meta{item:item})----》给了Response对象的meta属性# 6 配置文件-基础配置-高级配置--》提高爬虫效率# 7 持久化---》把数据保存到磁盘上文件mysql-管道-使用步骤-1 写个类items.py里面写字段class CnblogItem(scrapy.Item):name scrapy.Field()author scrapy.Field()url scrapy.Field()img scrapy.Field()desc_content scrapy.Field()# 文本详情text scrapy.Field()-2 配置文件配置管道配置多个存在多个位置ITEM_PIPELINES {scrapy_demo.pipelines.CnblogPipeline: 300,scrapy_demo.pipelines.CnblogMysqlPipeline: 200,}-3 爬虫解析中yield item-3 pipelines.py中写类open_spiderclose_spiderprocess_item1 爬虫中间件和下载中间件 1.1 爬虫中间件(一般不用) # 第一步写个爬虫中间件类class ScrapyDemoSpiderMiddleware:classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s cls()crawler.signals.connect(s.spider_opened, signalsignals.spider_opened)return s# 走架构图第1步会触发这里def process_spider_input(self, response, spider):# Called for each response that goes through the spider# middleware and into the spider.# Should return None or raise an exception.return None# 架构图第1,7步走这里def process_spider_output(self, response, result, spider):# Called with the results returned from the Spider, after# it has processed the response.# Must return an iterable of Request, or item objects.for i in result:yield idef process_spider_exception(self, response, exception, spider):# Called when a spider or process_spider_input() method# (from other spider middleware) raises an exception.# Should return either None or an iterable of Request or item objects.pass# 架构图第一步def process_start_requests(self, start_requests, spider):# Called with the start requests of the spider, and works# similarly to the process_spider_output() method, except# that it doesn’t have a response associated.# Must return only requests (not items).for r in start_requests:yield rdef spider_opened(self, spider):spider.logger.info(Spider opened: %s % spider.name)# 2 配置文件配置SPIDER_MIDDLEWARES {scrapy_demo.middlewares.ScrapyDemoSpiderMiddleware: 543, }1.2 下载中间件代理加请求头加cookie class ScrapyDemoDownloaderMiddleware:classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s cls()crawler.signals.connect(s.spider_opened, signalsignals.spider_opened)return sdef process_request(self, request, spider):# - return None: 继续执行当次请求继续走下一个中间件---》如果中间件没了---》执行下载# - return Response 直接把Response返回给引擎引擎交给爬虫去解析# - return Request 把request返回给引擎引擎给调度器等待下一次被爬取# - 直接抛异常 触发process_exception执行return Nonedef process_response(self, request, response, spider):# Must either;# - return Response正常爬取完---》给引擎---》引擎给爬虫去解析# - return Request 爬取失败--》给引擎--》引擎给调度器--》等待下次爬取# - 抛异常 走到process_exceptionreturn responsedef process_exception(self, request, exception, spider):# Called when a download handler or a process_request()# (from other downloader middleware) raises an exception.# Must either:# - return None: continue processing this exception# - return a Response object: stops process_exception() chain# - return a Request object: stops process_exception() chainpassdef spider_opened(self, spider):spider.logger.info(Spider opened: %s % spider.name)1.2.1 加请求头(加到请求对象中) # faker 模块 随机生成假数据 # pip install fake_useragent随机生成请求头### 加referer加token 加 user-agent def process_request(self, request, spider):#### 加请求头print(request.headers)request.headers[referer] http://www.lagou.comrequest.headers[token] asdfasdf.asdfads.asfdasfd# user-agent---写死了---》想随机请求头from fake_useragent import UserAgentua UserAgent()request.headers[User-Agent] str(ua.random)print(request.headers)return None 1.2.2 加cookie def process_request(self, request, spider):print(request.cookies)request.cookies[name]lqzreturn None1.2.3 加代理 # 在下载中间件的def process_request(self, request, spider):写代码# 第一步-在下载中间件写process_request方法def get_proxy(self):import requestsres requests.get(http://127.0.0.1:5010/get/).json()if res.get(https):return https:// res.get(proxy)else:return http:// res.get(proxy)def process_request(self, request, spider):#request.meta[proxy] self.get_proxy()request.meta[proxy] http://192.168.11.11:8888return None# 第二步代理可能不能用会触发process_exception在里面写def process_exception(self, request, exception, spider):print(-----,request.url) # 这个地址没有爬return request2 scrapy集成selenium # 使用scrapy默认下载器---》类似于requests模块发送请求不能执行js有的页面拿回来数据不完整# 想在scrapy中集成selenium获取数据更完整获取完后自己组装成 Response对象就会进爬虫解析现在解析的是使用selenium拿回来的页面数据更完整 # 集成selenium 因为有的页面是执行完js后才渲染完必须使用selenium去爬取数据才完整# 保证整个爬虫中只有一个浏览器器 # 只要爬取 下一页这种地址使用selenium爬取详情继续使用原来的# 第一步在爬虫类中写 from selenium import webdriver class CnblogsSpider(scrapy.Spider):bro webdriver.Chrome() # 使用无头bro.implicitly_wait(10)def close(spider, reason):spider.bro.close() #浏览器关掉# 第二步在中间件中def process_request(self, request, spider):# 爬取下一页这种地址---》用selenium但是文章详情就用原来的if sitehome/p in request.url:spider.bro.get(request.url)from scrapy.http.response.html import HtmlResponseresponse HtmlResponse(urlrequest.url, bodybytes(spider.bro.page_source, encodingutf-8))return responseelse:return None3 源码去重规则布隆过滤器 # 如果爬取过的地址就不会再爬了,scrapy 自带去重# 调度器可以去重研究一下如何去重的---》使用了集合# 要爬取的Request对象在进入到scheduler调度器排队之前先执行enqueue_request它如果return False这个Request就丢弃掉不爬了----》如何判断这个Request要不要丢弃掉执行了self.df.request_seen(request)它来决定的-----》RFPDupeFilter类中的方法----》request_seen---》会返回True或False----》如果这个request在集合中说明爬过了就return True如果不在集合中就加入到集合中然后返回False# 调度器源码 from scrapy.core.scheduler import Scheduler# 这个方法如果return True表示这个request要爬取如果return False表示这个网址就不爬了(已经爬过了)def enqueue_request(self, request: Request) - bool:# request当次要爬取的地址对象if self.df.request_seen(request):# 有的请情况在爬虫中解析出来的网址不想爬了就就可以指定# yield Request(urlurl, callbackself.detail_parse, meta{item: item},dont_filterTrue)# 如果符合这个条件表示这个网址已经爬过了 return Falsereturn True# self.df 去重类 是去重类的对象 RFPDupeFilter--》配置文件配置的-在配置文件中如果配置了DUPEFILTER_CLASS scrapy.dupefilters.RFPDupeFilter表示使用它作为去重类按照它的规则做去重-RFPDupeFilter的request_seendef request_seen(self, request: Request) - bool:# request_fingerprint 生成指纹fp self.request_fingerprint(request) #request当次要爬取的地址对象#判断 fp 在不在集合中如果在return Trueif fp in self.fingerprints:return True#如果不在加入到集合return Falseself.fingerprints.add(fp)return False# 传进来是个request对象生成的是指纹-爬取的网址https://www.cnblogs.com/teach/p/17238610.html?namelqzage19-和 https://www.cnblogs.com/teach/p/17238610.html?age19namelqz-它俩是一样的返回的数据都是一样的就应该是一条url就只会爬取一次-所以 request_fingerprint 就是来把它们做成一样的(核心原理是把查询条件排序再拼接到后面)-生成指纹指纹是什么 生成的指纹放到集合中去重-www.cnblogs.com?namelqzage19-www.cnblogs.com?age19namelqz-上面的两种地址生成的指纹是一样的# 测试指纹from scrapy.utils.request import RequestFingerprinterfrom scrapy import Requestfingerprinter RequestFingerprinter()request1 Request(urlhttp://www.cnblogs.com?namelqzage20)request2 Request(urlhttp://www.cnblogs.com?age20namelqz)res1 fingerprinter.fingerprint(request1).hex()res2 fingerprinter.fingerprint(request2).hex()print(res1)print(res2)# 集合去重集合中放 # a一个bytes # 假设爬了1亿条url放在内存中占空间非常大 a6af0a0ffa18a9b2432550e1914361b6bffcff1a a6af0a0ffa18a9b2432550e191361b6bffc34f1a# 想一种方式极小内存实现去重---》布隆过滤器 https://zhuanlan.zhihu.com/p/946683613.1 布隆过滤器 # 极小内存实现去重 # 应用场景爬虫去重避免缓存穿透垃圾邮件过滤# bloomfilter是一个通过多哈希函数映射到一张表的数据结构能够快速的判断一个元素在一个集合内是否存在具有很好的空间和时间效率。典型例子爬虫url去重#布隆案例# from pybloom_live import ScalableBloomFilter # bloom ScalableBloomFilter(initial_capacity100, error_rate0.001, modeScalableBloomFilter.LARGE_SET_GROWTH) # url www.cnblogs.com # url2 www.liuqingzheng.top # bloom.add(url) # print(url in bloom) # print(url2 in bloom)from pybloom_live import BloomFilter bf BloomFilter(capacity1000) urlwww.baidu.com bf.add(url) print(url in bf) print(www.liuqingzheng.top in bf)from scrapy.dupefilters import BaseDupeFilter from scrapy.utils.request import RequestFingerprinter from pybloom_live import ScalableBloomFilterclass MyPDupeFilter(BaseDupeFilter):fingerprints ScalableBloomFilter(initial_capacity100, error_rate0.001,modeScalableBloomFilter.LARGE_SET_GROWTH)fingerprinter RequestFingerprinter()def request_seen(self, request):print(zoule)fp self.request_fingerprint(request)if fp in self.fingerprints:return Trueself.fingerprints.add(fp)return Falsedef request_fingerprint(self, request) - str:return self.fingerprinter.fingerprint(request).hex()4 分布式爬虫 # 原来scrapy的Scheduler维护的是本机的任务队列待爬取的地址本机的去重队列放在集合中---》在本机内存中 # 如果把scrapy项目部署到多台机器上多台机器爬取的内容是重复的# 所以实现分布式爬取的关键就是找一台专门的主机上运行一个共享的队列比如Redis 然后重写Scrapy的Scheduler让新的Scheduler到共享队列存取Request并且去除重复的Request请求所以总结下来实现分布式的关键就是三点#1、多台机器共享队列#2、重写Scheduler让其无论是去重还是任务都去访问共享队列#3、为Scheduler定制去重规则利用redis的集合类型# scrapy-redis实现分布式爬虫-公共的去重-公共的待爬取地址队列# 使用步骤0 下载pip2 install scrapy-redis1 把之前爬虫类继承class CnblogsSpider(RedisSpider):2 去掉起始爬取的地址加入一个类属性redis_key myspider:start_urls # redis列表的key后期我们需要手动插入起始地址3 配置文件中配置DUPEFILTER_CLASS scrapy_redis.dupefilter.RFPDupeFilter # scrapy redis去重类使用redis的集合去重# 不使用原生的调度器了使用scrapy_redis提供的调度器它就是使用了redis的列表SCHEDULER scrapy_redis.scheduler.SchedulerREDIS_HOST localhost # 主机名REDIS_PORT 6379 # 端口ITEM_PIPELINES {# mysfirstscrapy.pipelines.MyCnblogsPipeline: 300,mysfirstscrapy.pipelines.MyCnblogsMySqlPipeline: 301,scrapy_redis.pipelines.RedisPipeline: 400,}4 再不同多台机器上运行scrapy的爬虫就实现了分布式爬虫5 写入到redis的列表中起始爬取的地址列表key:myspider:start_urlsrpush myspider:start_urls https://www.cnblogs.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个网站需要多少网页ps怎么做网站导航

在 element plus 表格中,您可以使用 summary-method 属性来指定一个函数,计算表格中列的合计或平均值等。该函数应该返回一个对象,其中包含每个列的合计值。例如,如果您的表格数据是这样的: [{ name: John, age: 20, …

小学生做电子小报的网站做外贸推广自己网站

Day35 贪心算法 part04 860.柠檬水找零 pass 406.根据身高重建队列 pass

东营企业网站制作网贷代理推广

1、USB驱动程序存在于不同的内核子系统(块设备、网络设备、字符设备等等)和USB主控制器之中。 2、USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口,而不必考虑系统当前存在的各种不同类型的USB硬件控制器。 2.1 USB里的设备模型 Linux里一个很重要的概念是设备…

福州企业高端网站建设制作哪家好怎样建立一个公司网站

目录 开始示例el挂载点data数据对象 vue基本标签v-textv-htmlv-on计数器示例实现v-showv-ifv-bind图片切换示例v-forv-on补充v-model axios网络请求axios基本使用vue中使用axios 开始示例 1.首先在html页面中引入vue的生产环境&#xff0c;在body标签中粘上下面代码 <scrip…

制作网站首先要知道什么软件开发项目管理书籍

云服务器通过实现云端数据分发和内容传输优化来提高性能、可靠性和效率。这通常涉及以下几个方面的技术和方法&#xff1a; 1. CDN(内容分发网络) 内容分发网络(CDN)是一种分布式网络架构&#xff0c;用于将内容(如网页、图像、视频等)分发到全球各地的用户。CDN通过在全球各地…

怎么样签约设计网站建设一个网站项目预算

图书管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本图书管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处…

网站建设需要考啥证wordpress 防sql注入

再小的努力&#xff0c;乘以365都很明显。文章目录 操作系统操作系统的概念设计操作系统的目的 管理 ps:如何理解管理如何进行管理 操作系统管理软硬件资源小总结系统调用和库函数的概念小总结 操作系统 在讲述进程的时候我们先讲述一下操作系统&#xff08;os&#xff09;,因…

建立网站线上营销上海企业所得税怎么征收

前言&#xff1a; 记录一下sql学习&#xff0c;仅供参考基本都对了&#xff0c;不排除有些我做的太快做错了。里面sql不存在任何sql优化操作&#xff0c;只以完成最后输出结果为目的&#xff0c;包含我做题过程和思路最后一行才是结果。 1.过程: 1.1.插入数据 /* SQLyog Ul…

江门网站优化公司郑州网站建设修改

2019独角兽企业重金招聘Python工程师标准>>> <?phpfunction hello {echo hello world;} 转载于:https://my.oschina.net/guanyue/blog/52043

成都网站优化多少钱微信公众平台怎么做微网站吗

读何为技术人的核心竞争力后的笔记和感想。前一部分是从这篇文章中摘出来的&#xff0c;后一部分是自己的一些感想。 文章内容摘要技术人分类把命运寄托在事业上的人技术只是作为其中的手段&#xff0c;他们有能力通过技术实现自己的想法和事业。事业并不是指的创业做老板&…

旅游类网站模板免费下载系统安装wordpress

摘 要 即时通讯&#xff08;Instant Messaging&#xff09;是目前Internet上最为流行的通讯方式&#xff0c;而各种各样的即时通讯软件也层出不穷&#xff1b;服务提供商也提供了越来越丰富的通讯服务功能。随着互联网的发展&#xff0c;即时通讯的运用将日益广泛&#xff0c…

网站建设最简单的教程免费手机网站建站系统

先打个广告&#xff0c;我们的第三场零代码实践的直播在本周五&#xff08; 11 月 5 日 &#xff09;晚8点准时开始&#xff0c;扫描下面二维码&#xff0c;直接预约直播&#xff0c;到时间微信会自动提醒。随着企业数字化转型的进程加快&#xff0c;零代码平台的的应用越来越广…

如何申请网站空间和域名友情链接源码

内部回报率IRR这个概念&#xff0c;艾米姐在很多地方都讲到了。可以这么说&#xff0c;任何的理财产品&#xff0c;都可以用这个概念来测算一下收益到底如何。听起来IRR确实很强大啊。那它到底是个什么东东呢&#xff1f;今天就来说一说。一、什么是内部收益率IRR&#xff1f;这…

服务器租用网站模板河南第二建设集团网站视频

1.键盘录入一个字符串&#xff0c;求该字符串中每一个字符出现的次数。 要求&#xff1a;按照字母顺序打印 如: 录入的字符串为"apple"&#xff0c;打印 a(1) e(1) l(1) p(2) public class Demo4 {public static void main(String[] args) {//键盘录入Scanner sc n…

wordpress网站模板怎么用wordpress win2008

哈喽大家好&#xff0c;我是咕噜美乐蒂&#xff0c;很高兴又见面啦&#xff01; 幻兽帕鲁&#xff08;Monster Hunter: World&#xff09;是一款热门的多人在线游戏&#xff0c;玩家可以在服务器上与其他玩家一起探险、狩猎怪物。为了保持游戏的平衡性和提供更好的游戏体验&am…

中国建设银行网站会员注册上海集团网站建设

介绍 在开发基于 MyBatis 的应用时&#xff0c;缓存是提升性能的关键因素之一。MyBatis 提供了一级缓存和二级缓存&#xff0c;合理使用它们可以显著减少数据库的访问次数&#xff0c;提高系统的响应速度和吞吐量。本文将深入探讨 MyBatis 一级缓存和二级缓存的工作原理、使用…

php个人网站源码带音乐深圳厂房设计

首先明确应用架构的定义&#xff0c;从百度百科上即可了解到何为应用架构&#xff1a; 应用架构&#xff08;Application Architecture&#xff09;是描述了IT系统功能和技术实现的内容。应用架构分为以下两个不同的层次&#xff1a; 企业级的应用架构&#xff1a;企业层面的应…

网站可以制作ios怎么做微信里的网页网站链接

前言&#xff1a; 在Python中&#xff0c;property 是一种内置的装饰器&#xff0c;它可以将类的方法转换为属性&#xff0c;让你在不改变类接口的情况下添加额外的逻辑&#xff0c;如输入值的验证、取值的计算等。property 可以作为一种方式让你的类接口保持清晰且易于使用。…

芜湖网站备案咨询电话网站首页幻灯片不显示

docker集群Docker非常适合在单个节点上运行隔离的容器。 但是&#xff0c;大多数软件系统都在多个节点上运行&#xff0c;因此&#xff0c;除了Docker之外&#xff0c;我们还需要某种方法来指定哪些容器应在哪些节点上运行。 我要解决的特定问题如下&#xff1a;我有两个Scala…