首页 文章 精选 留言 我的

精选列表

搜索[快速],共10000篇文章
优秀的个人博客,低调大师

22、Python快速开发分布式搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别

转自: http://www.bdyss.cn http://www.swpan.cn 第一步。首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://github.com/muchrooms/zheye 注意:此程序依赖以下模块包 Keras==2.0.1 Pillow==3.4.2 jupyter==1.0.0 matplotlib==1.5.3 numpy==1.12.1 scikit-learn==0.18.1 tensorflow==1.0.1 h5py==2.6.0 numpy-1.13.1+mkl 我们用豆瓣园来加速安以上依赖装如: pipinstall-ihttps://pypi.douban.com/simpleh5py==2.6.0 如果是win系统,可能存在安装失败的可能,如果那个包安装失败,就到 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 找到win对应的版本下载到本地安装,如: pipinstallh5py-2.7.0-cp35-cp35m-win_amd64.whl 第二步,将者也的,验证码识别程序的zheye文件夹放到工程目录里 第三步,爬虫实现 start_requests()方法,起始url函数,会替换start_urls Request()方法,get方式请求网页 url=字符串类型url headers=字典类型浏览器代理 meta=字典类型的数据,会传递给回调函数 callback=回调函数名称 scrapy.FormRequest()post方式提交数据 url=字符串类型url headers=字典类型浏览器代理 meta=字典类型的数据,会传递给回调函数 callback=回调函数名称 formdata=字典类型,要提交的数据字段 response.headers.getlist('Set-Cookie')获取响应Cookiesresponse.request.headers.getlist('Cookie')获取请求Cookies #-*-coding:utf-8-*- importscrapy fromscrapy.httpimportRequest,FormRequest importre classPachSpider(scrapy.Spider):#定义爬虫类,必须继承scrapy.Spider name='pach'#设置爬虫名称 allowed_domains=['zhihu.com']#爬取域名 #start_urls=['']#爬取网址,只适于不需要登录的请求,因为没法设置cookie等信息 header={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64;rv:54.0)Gecko/20100101Firefox/54.0'}#设置浏览器用户代理 defstart_requests(self):#起始url函数,会替换start_urls """第一次请求一下登录页面,设置开启cookie使其得到cookie,设置回调函数""" return[Request( url='https://www.zhihu.com/#signin', headers=self.header, meta={'cookiejar':1},#开启Cookies记录,将Cookies传给回调函数 callback=self.parse )] defparse(self,response): #响应Cookies Cookie1=response.headers.getlist('Set-Cookie')#查看一下响应Cookie,也就是第一次访问注册页面时后台写入浏览器的Cookie print('后台首次写入的响应Cookies:',Cookie1) #获取xsrf密串 xsrf=response.xpath('//input[@name="_xsrf"]/@value').extract()[0] print('获取xsrf密串:'+xsrf) #获取验证码 importtime t=str(int(time.time()*1000)) captcha_url='https://www.zhihu.com/captcha.gif?r={0}&type=login&lang=cn'.format(t)#构造验证码请求地址 yieldRequest(url=captcha_url,#请求验证码图片 headers=self.header, meta={'cookiejar':response.meta['cookiejar'],'xsrf':xsrf},#将Cookies和xsrf密串传给回调函数 callback=self.post_tj ) defpost_tj(self,response): withopen('yzhm.jpg','wb')asf:#打开图片句柄 f.write(response.body)#将验证码图片写入本地 f.close()#关闭句柄 #---------------------------者也验证码识别----------------------- fromzheyeimportzheye#导入者也倒立文字验证码识别模块对象 z=zheye()#实例化对象 positions=z.Recognize('yzhm.jpg')#将验证码本地路径传入Recognize方法识别,返回倒立图片的坐标 #print(positions)#默认倒立文字的y坐标在前,x坐标在后 #知乎网要求的倒立文字坐标是x轴在前,y轴在后,所以我们需要定义一个列表来改变默认的,倒立文字坐标位置 pos_arr=[] iflen(positions)==2: ifpositions[0][1]>positions[1][1]:#判断列表里第一个元祖里的第二个元素如果大于,第二个元祖里的第二个元素 pos_arr.append([positions[1][1],positions[1][0]]) pos_arr.append([positions[0][1],positions[0][0]]) else: pos_arr.append([positions[0][1],positions[0][0]]) pos_arr.append([positions[1][1],positions[1][0]]) else: pos_arr.append([positions[0][1],positions[0][0]]) print('处理后的验证码坐标',pos_arr) #-------------者也验证码识别结束-------- iflen(pos_arr)==2: data={#设置用户登录信息,对应抓包得到字段 '_xsrf':response.meta['xsrf'], 'password':'279819', 'captcha':'{"img_size":[200,44],"input_points":[[%.2f,%f],[%.2f,%f]]}'%( pos_arr[0][0]/2,pos_arr[0][1]/2,pos_arr[1][0]/2,pos_arr[1][1]/2),#因为验证码识别默认是400X88的尺寸所以要除以2 'captcha_type':'cn', 'phone_num':'15284816568' } else: data={#设置用户登录信息,对应抓包得到字段 '_xsrf':response.meta['xsrf'], 'password':'279819', 'captcha':'{"img_size":[200,44],"input_points":[[%.2f,%f]]}'%( pos_arr[0][0]/2,pos_arr[0][1]/2), 'captcha_type':'cn', 'phone_num':'15284816568' } print('登录提交数据',data) print('登录中....!') """第二次用表单post请求,携带Cookie、浏览器代理、用户登录信息,进行登录给Cookie授权""" return[scrapy.FormRequest( url='https://www.zhihu.com/login/phone_num',#真实post地址 meta={'cookiejar':response.meta['cookiejar']},#接收第传过来的Cookies headers=self.header, formdata=data, callback=self.next )] defnext(self,response): #请求Cookie Cookie2=response.request.headers.getlist('Cookie') print('登录时携带请求的Cookies:',Cookie2) jieg=response.body.decode("utf-8")#登录后可以查看一下登录响应信息 print('登录响应结果:',jieg) print('正在请需要登录才可以访问的页面....!') """登录后请求需要登录才能查看的页面,如个人中心,携带授权后的Cookie请求""" yieldRequest( url='https://www.zhihu.com/people/lin-gui-xiu-41/activities', headers=self.header, meta={'cookiejar':True}, callback=self.next2 ) defnext2(self,response): #请求Cookie Cookie3=response.request.headers.getlist('Cookie') print('查看需要登录才可以访问的页面携带Cookies:',Cookie3) leir=response.xpath('/html/head/title/text()').extract()#得到个人中心页面 print('最终内容',leir) #print(response.body.decode("utf-8")) 【转载自:http://www.lqkweb.com】

优秀的个人博客,低调大师

速来围观老司机快速排错--解决论坛迁移到proxmox超融合私有云平台后后部分功能不能使用的问题

问题描述 考虑到在山东移动机房租赁的物理服务器的存在单点,并时不时出现故障,导致业务停止,因此决定从物理服务器把某个老牌论坛迁移到可用性极高的proxmox超融合私有云平台。昨天夜里,兄弟们忙乎了一整夜,很是辛苦(我在11点对那些坏掉的文件系统进行修复,用screen仍在那里,自己睡觉去了)。 上午睡了个懒觉,还没清醒过来,有电话、qq消息过来了,说论坛页面能打开,详情页也没问题,但不能签到、发帖、发附件等。 催得厉害,赶紧进行处理。 运行环境 主要包括负载均衡及超融合私有云proxmox。负载均衡负责用户转发,使用的是公网ip;超融合私有云proxmox使用的是四个节点的物理服务器,运行30几个虚拟机。 域名解析到负载均衡的vip,haproxy负责把请求转发到proxmox上的指定的虚拟机。由于论坛容量不是很大(400G左右),就直接把论坛程序、附件及数据库部署在同一个虚拟机上(其它的应用,程序与数据库是分离的)。 基本思路 超融合私有云平台proxmox上的其它虚拟机及应用都是正常状态,因此可以排除底层架构的问题。 另外两个大的排查点就是负载均衡及论坛虚拟机本身。其他兄弟怀疑是负载均衡配置的问题,还发来了相关操作信息。 我一直强调,一定要先从后端真实提供服务的系统进行排查,真实服务提供者有问题,排查负载均衡有什么用处呢? 问题定位 登录系统,查看论坛的配置,主要是nginx及php。论坛页面可以打开,可以初步断定php没什么问题。 接下来,打开nginx配置看看,主配置文件有如下几行包含项: includevhosts/default.conf; includevhosts/bbs.formyz.net.conf; includevhosts/file.formyz.net.conf; includevhosts/net.formyz.net.conf; include vhosts/default.conf;include vhosts/bbs.formyz.net.conf;include vhosts/file.formyz.net.conf;include vhosts/net.formyz.net.conf; 对nginx进行语法检查,未发现异常。老办法,查nginx错误日志,很快有如下发现: FastCGIsentinstderr:"Primaryscriptunknown"whilereadingresponseheaderfromupstream FastCGI sentinstderr:"Primary script unknown"whilereading response header from upstream 心中有底了,一定是哪个包含文件配置上有问题。分别对这三个配置文件进行备份,然后挨个打开,发先有两个配置文件里,嵌套了包含项如下: root/data/html/bbs.formyz.net; fastcgi_pass127.0.0.1:9000; fastcgi_indexindex.php; includefastcgi.conf; root /data/html/bbs.formyz.net; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; 而另外一个配置文件里,嵌套的项确是这样的: root/data/html/bbs.formyz.net; fastcgi_pass127.0.0.1:9000; fastcgi_indexindex.php; includefastcgi_params; root /data/html/bbs.formyz.net; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; 再比较文件fastcgi.conf与文件fastcgi_params,不同之处如下: Fastcgi.conf fastcgi_params fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; 把不一致的嵌套包含,都改成include fastcgi.conf,重启nginx。绑定服务器的主机名及ip到本地的hosts文件,浏览器访问论坛,测试签到、发帖等,一切恢复正常!

优秀的个人博客,低调大师

车联网上云最佳实践(一):车联网行业特性致使新的应用架构必须满足快速增长的用户量和爆发式的流量访问

前言:阿里云总监系列课重磅上线!聚焦人工智能、弹性计算、数据库等热门领域,首次集齐12位阿里云技术高管,耗时半年精心打磨,从理论到实践倾囊相授,从零开始绘制技术大牛成长路径,限时直播课程免费报名中!每个人都是未来的技术大牛! 正文: 最近两年车联网发展受到政府部门、科研院以及各大互联网巨头的广泛关注和积极推动。从应用来看,主要包括两种模式:一是前装模式(即车辆出厂前安装),是乘用车厂主导或者与有相关能力的公司合作,例如上汽和阿里巴巴的合作。另一种就是后装模式(通常是将车机设备安装在汽车的OBD接口上例如各类汽车盒子等等。原理是利用智能终端(即车机)采集汽车OBD接口CAN总线上的所有原始数据进行诊断,数据分析,记录行车信息,并将数据解析出其具体意义(汽车内部电控系统的各项传感器数值)后通过串口输出,供用户读取、解析、开发等使用。将读取

优秀的个人博客,低调大师

20、 Python快速开发分布式搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scr...

编写spiders爬虫文件循环抓取内容 Request()方法,将指定的url地址添加到下载器下载页面,两个必须参数, 参数: url='url' callback=页面处理函数 使用时需要yield Request() parse.urljoin()方法,是urllib库下的方法,是自动url拼接,如果第二个参数的url地址是相对路径会自动与第一个参数拼接 #-*-coding:utf-8-*- importscrapy fromscrapy.httpimportRequest#导入url返回给下载器的方法 fromurllibimportparse#导入urllib库里的parse模块 classPachSpider(scrapy.Spider): name='pach' allowed_domains=['blog.jobbole.com']#起始域名 start_urls=['http://blog.jobbole.com/all-posts/']#起始url defparse(self,response): """ 获取列表页的文章url地址,交给下载器 """ #获取当前页文章url lb_url=response.xpath('//a[@class="archive-title"]/@href').extract()#获取文章列表url foriinlb_url: #print(parse.urljoin(response.url,i))#urllib库里的parse模块的urljoin()方法,是自动url拼接,如果第二个参数的url地址是相对路径会自动与第一个参数拼接 yieldRequest(url=parse.urljoin(response.url,i),callback=self.parse_wzhang)#将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数 #获取下一页列表url,交给下载器,返回给parse函数循环 x_lb_url=response.xpath('//a[@class="nextpage-numbers"]/@href').extract()#获取下一页文章列表url ifx_lb_url: yieldRequest(url=parse.urljoin(response.url,x_lb_url[0]),callback=self.parse)#获取到下一页url返回给下载器,回调给parse函数循环进行 defparse_wzhang(self,response): title=response.xpath('//div[@class="entry-header"]/h1/text()').extract()#获取文章标题 print(title) Request()函数在返回url时,同时可以通过meta属性返回一个自定义字典给回调函数 #-*-coding:utf-8-*- importscrapy fromscrapy.httpimportRequest#导入url返回给下载器的方法 fromurllibimportparse#导入urllib库里的parse模块 fromadc.itemsimportAdcItem#导入items数据接收模块的接收类 classPachSpider(scrapy.Spider): name='pach' allowed_domains=['blog.jobbole.com']#起始域名 start_urls=['http://blog.jobbole.com/all-posts/']#起始url defparse(self,response): """ 获取列表页的文章url地址,交给下载器 """ #获取当前页文章url lb=response.css('div.post.floated-thumb')#获取文章列表区块,css选择器 #print(lb) foriinlb: lb_url=i.css('.archive-title::attr(href)').extract_first('')#获取区块里文章url #print(lb_url) lb_img=i.css('.post-thumbimg::attr(src)').extract_first('')#获取区块里文章缩略图 #print(lb_img) yieldRequest(url=parse.urljoin(response.url,lb_url),meta={'lb_img':parse.urljoin(response.url,lb_img)},callback=self.parse_wzhang)#将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数 #获取下一页列表url,交给下载器,返回给parse函数循环 x_lb_url=response.css('.next.page-numbers::attr(href)').extract_first('')#获取下一页文章列表url ifx_lb_url: yieldRequest(url=parse.urljoin(response.url,x_lb_url),callback=self.parse)#获取到下一页url返回给下载器,回调给parse函数循环进行 defparse_wzhang(self,response): title=response.css('.entry-headerh1::text').extract()#获取文章标题 #print(title) tp_img=response.meta.get('lb_img','')#接收meta传过来的值,用get获取防止出错 #print(tp_img) shjjsh=AdcItem()#实例化数据接收类 shjjsh['title']=title#将数据传输给items接收模块的指定类 shjjsh['img']=tp_img yieldshjjsh#将接收对象返回给pipelines.py处理模块 * Scrapy内置图片下载器使用 Scrapy给我们内置了一个图片下载器在crapy.pipelines.images.ImagesPipeline,专门用于将爬虫抓取到图片url后将图片下载到本地 第一步、爬虫抓取图片URL地址后,填充到items.py文件的容器函数 爬虫文件 #-*-coding:utf-8-*- importscrapy fromscrapy.httpimportRequest#导入url返回给下载器的方法 fromurllibimportparse#导入urllib库里的parse模块 fromadc.itemsimportAdcItem#导入items数据接收模块的接收类 classPachSpider(scrapy.Spider): name='pach' allowed_domains=['blog.jobbole.com']#起始域名 start_urls=['http://blog.jobbole.com/all-posts/']#起始url defparse(self,response): """ 获取列表页的文章url地址,交给下载器 """ #获取当前页文章url lb=response.css('div.post.floated-thumb')#获取文章列表区块,css选择器 #print(lb) foriinlb: lb_url=i.css('.archive-title::attr(href)').extract_first('')#获取区块里文章url #print(lb_url) lb_img=i.css('.post-thumbimg::attr(src)').extract_first('')#获取区块里文章缩略图 #print(lb_img) yieldRequest(url=parse.urljoin(response.url,lb_url),meta={'lb_img':parse.urljoin(response.url,lb_img)},callback=self.parse_wzhang)#将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数 #获取下一页列表url,交给下载器,返回给parse函数循环 x_lb_url=response.css('.next.page-numbers::attr(href)').extract_first('')#获取下一页文章列表url ifx_lb_url: yieldRequest(url=parse.urljoin(response.url,x_lb_url),callback=self.parse)#获取到下一页url返回给下载器,回调给parse函数循环进行 defparse_wzhang(self,response): title=response.css('.entry-headerh1::text').extract()#获取文章标题 #print(title) tp_img=response.meta.get('lb_img','')#接收meta传过来的值,用get获取防止出错 #print(tp_img) shjjsh=AdcItem()#实例化数据接收类 shjjsh['title']=title#将数据传输给items接收模块的指定类 shjjsh['img']=[tp_img] yieldshjjsh#将接收对象返回给pipelines.py处理模块 第二步、设置items.py文件的容器函数,接收爬虫获取到的数据填充 #-*-coding:utf-8-*- #Defineherethemodelsforyourscrapeditems # #Seedocumentationin: #http://doc.scrapy.org/en/latest/topics/items.html importscrapy #items.py,文件是专门用于,接收爬虫获取到的数据信息的,就相当于是容器文件 classAdcItem(scrapy.Item):#设置爬虫获取到的信息容器类 title=scrapy.Field()#接收爬虫获取到的title信息 img=scrapy.Field()#接收缩略图 img_tplj=scrapy.Field()#图片保存路径 第三步、在pipelines.py使用crapy内置的图片下载器 1、首先引入内置图片下载器 2、自定义一个图片下载内,继承crapy内置的ImagesPipeline图片下载器类 3、使用ImagesPipeline类里的item_completed()方法获取到图片下载后的保存路径 4、在settings.py设置文件里,注册自定义图片下载器类,和设置图片保存路径 #-*-coding:utf-8-*- #Defineyouritempipelineshere # #Don'tforgettoaddyourpipelinetotheITEM_PIPELINESsetting #See:http://doc.scrapy.org/en/latest/topics/item-pipeline.html fromscrapy.pipelines.imagesimportImagesPipeline#导入图片下载器模块 classAdcPipeline(object):#定义数据处理类,必须继承object defprocess_item(self,item,spider):#process_item(item)为数据处理函数,接收一个item,item里就是爬虫最后yielditem来的数据对象 print('文章标题是:'+item['title'][0]) print('文章缩略图url是:'+item['img'][0]) print('文章缩略图保存路径是:'+item['img_tplj'])#接收图片下载器填充的,图片下载后的路径 returnitem classimgPipeline(ImagesPipeline):#自定义一个图片下载内,继承crapy内置的ImagesPipeline图片下载器类 defitem_completed(self,results,item,info):#使用ImagesPipeline类里的item_completed()方法获取到图片下载后的保存路径 forok,valueinresults: img_lj=value['path']#接收图片保存路径 #print(ok) item['img_tplj']=img_lj#将图片保存路径填充到items.py里的字段里 returnitem#将item给items.py文件的容器函数 #注意:自定义图片下载器设置好后,需要在 在settings.py设置文件里,注册自定义图片下载器类,和设置图片保存路径 IMAGES_URLS_FIELD设置要下载图片的url地址,一般设置的items.py里接收的字段IMAGES_STORE设置图片保存路径 #Configureitempipelines #Seehttp://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html ITEM_PIPELINES={ 'adc.pipelines.AdcPipeline':300,#注册adc.pipelines.AdcPipeline类,后面一个数字参数表示执行等级, 'adc.pipelines.imgPipeline':1,#注册自定义图片下载器,数值越小,越优先执行 } IMAGES_URLS_FIELD='img'#设置要下载图片的url字段,就是图片在items.py里的字段里 lujin=os.path.abspath(os.path.dirname(__file__)) IMAGES_STORE=os.path.join(lujin,'img')#设置图片保存路径 【转载自:http://www.lqkweb.com】

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册