首页 文章 精选 留言 我的

精选列表

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

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】

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

Python数据可视化库seaborn ------ 绘制直方图概率密度曲线;绘制多条曲线;设置主题风格;小提琴图;箱线图;绘制seaborn多个子图;调色板;

绘制数据的直方图及其概率密度曲线 这里可以使用 seaborn.displot() 来绘制,如果指定kde参数为False,就不会画概率密度曲线 1 import pandas as pd 2 import seaborn as sns 3 import matplotlib.pyplot as plt 4 5 titanic = pd.read_csv('seaborn_test\\train.csv') 6 cols = ['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked'] 7 titanic = titanic[cols].dropna() 8 9 sns.distplot(titanic['Age']) 10 plt.show() 运行结果: 下面展示没有概率密度曲线的直方图和用gamma拟合的概率密度曲线: 1 x = np.random.normal(size=100) 2 sns.distplot(x, kde=False) # kde 核密度估计 3 plt.show() 4 from scipy import stats, integrate 5 x = np.random.gamma(6, size=200) 6 sns.distplot(x, kde=False, fit=stats.gamma) 7 plt.show() 运行结果: 在一个画布上绘制多条曲线 1 def sinplot(flip=1): 2 x = np.linspace(0, 14, 100) 3 for i in range(1, 7): 4 plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip) 5 6 7 sinplot() 8 plt.show() 运行结果: 我们可以恢复seaborn默认的画布 1 sns.set() # 恢复默认的格式 2 sinplot() 3 plt.show() 运行结果: 设置主题风格 这里有五种常用风格:darkgrid、whitegrid、dark、white、ticks 1 sns.set_style("whitegrid") 2 data = np.random.normal(size=(20, 6)) + np.arange(6) / 2 3 sns.boxplot(data=data) 4 plt.show() 5 6 sns.set_style("dark") 7 sinplot() 8 plt.show() 9 10 sns.set_style("white") 11 sinplot() 12 plt.show() 13 14 sns.set_style("ticks") 15 sinplot() 16 plt.show() 17 18 sinplot() 19 sns.despine() 20 plt.show() 绘制小提琴图 这种图表结合了箱形图和密度图的特征,主要用来显示数据的分布形状。中间的黑色粗条表示四分位数范围, 从其延伸的幼细黑线代表 95% 置信区间,而白点则为中位数。 1 data = np.random.normal(size=(20, 6)) + np.arange(6) / 2 2 # 小提琴图 3 sns.violinplot(data) 4 # offset=10 表示与轴线之间的距离;trim=True控制纵坐标方向的轴线 5 sns.despine(offset=10, trim=True) # 轴线的距离 6 plt.show() 7 sns.violinplot(data) 8 sns.despine(offset=5, trim=False) # 轴线的距离 9 plt.show() 运行结果: 绘制箱线图 1 sns.set_style("whitegrid") 2 sns.boxplot(data=data, palette="deep") 3 sns.despine(left=True) 4 plt.show() 5 6 sns.set_style("whitegrid") 7 sns.boxplot(data=data) 8 sns.despine(left=True) 9 plt.show() 两张图很明显是图的颜色不一样,其实参数palette="deep" 是表示调用 “deep” 的调色板。 设置seaborn子图 1 def sinplot(flip=1): 2 x = np.linspace(0, 14, 100) 3 for i in range(1, 7): 4 plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip) 5 6 7 with sns.axes_style("darkgrid"): 8 plt.subplot(211) 9 sinplot() 10 plt.subplot(212) 11 sinplot(-1) 12 plt.show() 运行结果: 如果我们想绘制2X2的一个多个子图画布,我们可以使用 plt.subplot(2,2,i) 来指定。 1 sns.axes_style("darkgrid") 2 plt.subplot(221) 3 sinplot(1) 4 5 sns.axes_style("dark") 6 plt.subplot(222) 7 sinplot() 8 9 sns.axes_style("ticks") 10 plt.subplot(223) 11 sinplot(-1) 12 13 plt.subplot(224) 14 sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5}) 15 sinplot() 16 plt.show() 运行结果: set_context(context=None, font_scale=1, rc=None) 参数说明:context 有paper, notebook, talk, poster 这四个 预先设置的模板,font_scale为浮动参数,rc为参数映射字典,如:rc={"lines.linewidth": 2}。下面的案例将展示四种context 的效果。 1 plt.subplot(221) 2 sns.set_context("paper", font_scale=1.5) 3 sinplot(1) 4 5 6 plt.subplot(222) 7 sns.set_context("notebook", rc={"lines.linewidth": .5}) 8 sinplot() 9 10 11 plt.subplot(223) 12 sns.set_context("talk", font_scale=1.5, rc={"lines.linewidth": 2.}) 13 sinplot(-1) 14 15 plt.subplot(224) 16 sns.set_context("poster", font_scale=1.5, rc={"lines.linewidth": 2.5}) 17 sinplot() 18 plt.show() 运行结果: 右图为除context其他参数一样的效果。context参数指定了风格,坐标轴对比明显。 调色板 颜色很重要 color_palette()能传入任何Matplotlib所支持的颜色;color_palette()不写参数则默认颜色 set_palette()设置所有图的颜色 分类色板 获取当前使用的默认色板: 1 current_palette = sns.color_palette() 2 # 获取当前调色板 3 sns.palplot(current_palette) 4 plt.show() 运行结果: 圆形画板 当你有10个以上的分类要区分时,最简单的方法就是在一个圆形的颜色空间中画出均匀间隔的颜色(这样的色调会 保持亮度和饱和度不变)。这是大多数的人当他们需要使用比当前默认颜色循环中设置的颜色更多时的默认方案。 最常用的方法是使用hls的颜色空间,这是RGB值的一个简单转换。 1 sns.palplot(sns.color_palette("hls", 12)) 2 plt.show() 运行结果: 下面用箱线图展示效果: 1 data = np.random.normal(size=(20, 12)) + np.arange(12) / 2 2 sns.boxplot(data=data, palette=sns.color_palette("hls", 12)) 3 plt.show() 运行结果: hls_palette() 函数用下面的参数控制颜色的亮度和饱和 l - 亮度 lightness s - 饱和 saturation 1 sns.palplot(sns.color_palette("hls", 12)) 2 plt.show() 3 sns.palplot(sns.hls_palette(12, l=.7, s=.9)) 4 plt.show() 使用xkcd颜色来命名颜色 xkcd包含了一套众包努力的针对随机RGB色的命名。产生了954个可以随时通过xdcd_rgb字典中调用 的命名颜色。 1 plt.plot([0, 1], [0, 1], sns.xkcd_rgb["pale red"], lw=3) # https://xkcd.com/color/rgb/ 2 plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3) 3 plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3) 4 plt.plot([0, 1], [0, 4], sns.xkcd_rgb["olive"], lw=5) 5 plt.show() 运行结果: 生成一个自定义调色板 1 colors = ["windows blue", "amber", "greyish", "faded green", "dusty purple"] 2 sns.palplot(sns.xkcd_palette(colors)) 3 plt.show() 运行结果: 连续色板 色彩随数据变换,比如数据越来越重要则颜色越来越深 Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r,Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr,PuOr_r, PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r, RdYlBu, RdYlBu_r,RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral, Spectral_r, Vega10, Vega10_r,Vega20, Vega20_r, Vega20b, Vega20b_r, Vega20c, Vega20c_r, Wistia, Wistia_r,YlGn, YlGnBu, YlGnBu_r, YlGn_r,YlOrBr, YlOrBr_r, YlOrRd, YlOrRd_r, afmhot, afmhot_r, autumn, autumn_r,binary, binary_r, bone, bone_r, brg, brg_r,bwr, bwr_r, cool, cool_r, coolwarm,coolwarm_r,copper, copper_r,cubehelix, cubehelix_r, flag, flag_r, gist_earth,gist_earth_r, gist_gray, gist_gray_r, gist_heat, gist_heat_r,gist_ncar, gist_ncar_r, gist_rainbow, gist_rainbow_r,gist_stern, gist_stern_r, gist_yarg, gist_yarg_r, gnuplot,gnuplot2, gnuplot2_r, gnuplot_r, gray, gray_r, hot, hot_r,hsv, hsv_r, icefire, icefire_r, inferno, inferno_r, jet,jet_r, magma, magma_r, mako, mako_r, nipy_spectral, nipy_spectral_r,ocean, ocean_r, pink, pink_r, plasma,plasma_r, prism, prism_r, rainbow, rainbow_r, rocket, rocket_r, seismic, seismic_r,spectral, spectral_r, spring,spring_r, summer, summer_r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c,tab20c_r, terrain,terrain_r, viridis, viridis_r, vlag, vlag_r, winter, winter_r 测试面板: 1 sns.palplot(sns.color_palette("Blues")) 2 sns.palplot(sns.color_palette("Accent")) 3 plt.show() 注意:如果想要翻转渐变,可以在面板名称中添加一个_r后缀 cubehelix_palette()调色板 色调线性变换 1 sns.palplot(sns.color_palette("cubehelix", 8)) 2 sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75)) 3 plt.show() light_palette() 和dark_palette()调用定制连续调色板 1 sns.palplot(sns.light_palette("green")) 2 sns.palplot(sns.light_palette("navy", reverse=True)) 3 sns.palplot(sns.light_palette((210, 90, 60), input="husl")) 4 plt.show() 运行结果:

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

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应用均可从中受益。

Sublime Text

Sublime Text

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

用户登录
用户注册