(建议大家多看看官网教程:教程地址)
我们使用dmoz.org这个网站来作为小抓抓一展身手的对象。
首先先要回答一个问题。
问:把网站装进爬虫里,总共分几步?
答案很简单,四步:
新建项目 (Project):新建一个新的爬虫项目
明确目标(Items):明确你想要抓取的目标
制作爬虫(Spider):制作爬虫开始爬取网页
存储内容(Pipeline):设计管道存储爬取内容
好的,基本流程既然确定了,那接下来就一步一步的完成就可以了。
1.新建项目(Project)
在空目录下按住Shift键右击,选择“在此处打开命令窗口”,输入一下命令:
scrapy startproject tutorial
其中,tutorial为项目名称。
可以看到将会创建一个tutorial文件夹,目录结构如下:
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
下面来简单介绍一下各个文件的作用:
scrapy.cfg :项目的配置文件
tutorial/ :项目的Python模块,将会从这里引用代码
tutorial/items.py :项目的items文件
tutorial/pipelines.py :项目的pipelines文件
tutorial/settings.py :项目的设置文件
tutorial/spiders/ :存储爬虫的目录
2.明确目标(Item)
在Scrap y中,items是用来加载抓取内容的容器,有点像Python中的Dic,也就是字典,但是提供了一些额外的保护减少错误。
一般来说,item可以用scrapy.item.Item 类来创建,并且用scrapy.item.Field 对象来定义属性 (可以理解成类似于ORM的映射关系)。
接下来,我们开始来构建item模型(model)。
首先,我们想要的内容有:
名称(name)
链接(url)
描述(description)
修改tutorial目录下的items.py文件,在原本的class后面添加我们自己的class。
因为要抓dmoz.org网站的内容,所以我们可以将其命名为DmozItem:
from scrapy.item import Item, Field
class TutorialItem(Item):
pass
class DmozItem(Item):
title = Field()
link = Field()
desc = Field()
刚开始看起来可能会 有些看不懂,但是定义这些item能让你用其他组件的时候知道你的 items到底是什么。
可以把Item简单的理解成封装好的类对象。
3.制作爬虫(Spider)
制作爬虫,总体分两步:先爬再取。
也就是说,首先你要获取整个网页的所有内容,然后再取出其中对你有用的部分。
3.1爬
Spider是用户自己编写的类,用来从一个域(或域组)中抓取信息。
他们定义了用于下载的URL列表、跟踪链接的方案、解析网页内容的方式,以此来提取items。
要建立一个Spider,你必须用scrapy.spider.BaseSpider创建一个子类,并确定三个强制的属性:
name:爬虫的识别名称,必须是唯一的,在不同的爬虫中你必须定义不同的名字。
start_urls:爬取的URL列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
parse():解析的方法,调用的时候传入从每一个URL传回的Response对象作为唯一参数,负责解析并匹配抓取的数据(解析为item),跟踪更多的URL。
这里可以参考宽度爬虫教程中提及的思想来帮助理解,教程传送:[Java] 知乎下巴第5集:使用HttpClient工具包和宽度爬虫。
也就是把Url存储下来并依此为起点逐步扩散开去,抓取所有符合条件的网页Url存储起来继续爬取。
下面我们来写第一只爬虫,命名为dmoz_spider.py,保存在tutorial\spiders目录下。
dmoz_spider.py 代码如下:
from scrapy.spider import Spider
class DmozSpider(Spider):
name = "dmoz"
allowed_domains = ["dmoz.org" ]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/" ,
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse( self , response):
filename = response.url.split("/" )[- 2 ]
open(filename, 'wb' ).write(response.body)
allow_domains是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页。
从parse函数可以看出,将链接的最后两个地址取出作为文件名进行存储。
然后运行一下看看,在tutorial目录下按住shift右击,在此处打开命令窗口,输入:
运行结果如图:
报错了:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal not in range(128)
运行第一个Scrapy项目就报错,真是命运多舛。
应该是出了编码问题,谷歌了一下找到了解决方案:
在python的Lib\site-packages文件夹下新建一个sitecustomize.py:
import sys
sys.setdefaultencoding('gb2312' )
再次运行,OK,问题解决了,看一下结果:
最后一句INFO: Closing spider (finished)表明爬虫已经成功运行并且自行关闭了。
包含 [dmoz]的行 ,那对应着我们的爬虫运行的结果。
可以看到start_urls中定义的每个URL都有日志行。
还记得我们的start_urls吗?
http://www.dmoz.org/Computers/Programming/Languages/Python/Books http://www.dmoz.org/Computers/Programming/Languages/Python/Resources
因为这些URL是起始页面,所以他们没有引用(referrers),所以在它们的每行末尾你会看到 (referer: )。
在parse 方法的作用下,两个文件被创建:分别是 Books 和 Resources,这两个文件中有URL的页面内容。
那么在刚刚的电闪雷鸣之中到底发生了什么呢?
首先,Scrapy为爬虫的 start_urls属性中的每个URL创建了一个 scrapy.http.Request 对象 ,并将爬虫的parse 方法指定为回调函数。
然后,这些 Request被调度并执行,之后通过parse()方法返回scrapy.http.Response对象,并反馈给爬虫。
3.2取
爬取整个网页完毕,接下来的就是的取过程了。
光存储一整个网页还是不够用的。
在基础的爬虫里,这一步可以用正则表达式来抓。
在Scrapy里,使用一种叫做 XPath selectors的机制,它基于 XPath表达式。
如果你想了解更多selectors和其他机制你可以查阅资料:点我点我
这是一些XPath表达式的例子和他们的含义
/html/head/title: 选择HTML文档元素下面的 标签。
/html/head/title/text(): 选择前面提到的 元素下面的文本内容
//td: 选择所有 元素
//div[@class="mine"]: 选择所有包含 class="mine" 属性的div 标签元素
以上只是几个使用XPath的简单例子,但是实际上XPath非常强大。
可以参照W3C教程:点我点我。
为了方便使用XPaths,Scrapy提供XPathSelector 类,有两种可以选择,HtmlXPathSelector(HTML数据解析)和XmlXPathSelector(XML数据解析)。
必须通过一个 Response 对象对他们进行实例化操作。
你会发现Selector对象展示了文档的节点结构。因此,第一个实例化的selector必与根节点或者是整个目录有关 。
在Scrapy里面,Selectors 有四种基础的方法 (点击查看API文档):
xpath() :返回一系列的selectors,每一个select表示一个xpath参数表达式选择的节点
css() :返回一系列的selectors,每一个select表示一个css参数表达式选择的节点
extract() :返回一个unicode字符串,为选中的数据
re() :返回一串一个unicode字符串,为使用正则表达式抓取出来的内容
3.3xpath实验
下面我们在Shell里面尝试一下Selector的用法。
实验的网址:http://www.dmoz.org/Computers/Programming/Languages/Python/Books/
熟悉完了实验的小白鼠,接下来就是用Shell爬取网页了。
进入到项目的顶层目录,也就是第一层tutorial文件夹下,在cmd中输入:
scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/
回车后可以看到如下的内容:
在Shell载入后,你将获得response回应,存储在本地变量 response中。
所以如果你输入response.body,你将会看到response的body部分,也就是抓取到的页面内容:
或者输入response.headers 来查看它的 header部分:
现在就像是一大堆沙子握在手里,里面藏着我们想要的金子,所以下一步,就是用筛子摇两下,把杂质出去,选出关键的内容。
selector就是这样一个筛子。
在旧的版本中,Shell实例化两种selectors,一个是解析HTML的 hxs 变量,一个是解析XML 的 xxs 变量。
而现在的Shell为我们准备好的selector对象,sel,可以根据返回的数据类型自动选择最佳的解析方案(XML or HTML)。
然后我们来捣弄一下!~
要彻底搞清楚这个问题,首先先要知道,抓到的页面到底是个什么样子。
比如,我们要抓取网页的标题,也就是这个标签:
可以输入:
结果就是:
这样就能把这个标签取出来了,用extract()和text()还可以进一步做处理。
备注:简单的罗列一下有用的xpath路径表达式:
表达式
描述
nodename
选取此节点的所有子节点。
/
从根节点选取。
//
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.
选取当前节点。
..
选取当前节点的父节点。
@
选取属性。
全部的实验结果如下,In[i]表示第i次实验的输入,Out[i]表示第i次结果的输出(建议大家参照:W3C教程):
In [ 1 ]: sel.xpath( '//title' )
Out[1 ]: ['//title' data=u 'Open Directory - Computers: Progr' >]
In [2 ]: sel.xpath( '//title' ).extract()
Out[2 ]: [u 'Open Directory - Computers: Programming: Languages: Python: Books ' ]
In [3 ]: sel.xpath( '//title/text()' )
Out[3 ]: ['//title/text()' data=u 'Open Directory - Computers: Programming:' >]
In [4 ]: sel.xpath( '//title/text()' ).extract()
Out[4 ]: [u 'Open Directory - Computers: Programming: Languages: Python: Books' ]
In [5 ]: sel.xpath( '//title/text()' ).re( '(\w+):' )
Out[5 ]: [u 'Computers' , u 'Programming' , u 'Languages' , u 'Python' ]
当然title这个标签对我们来说没有太多的价值,下面我们就来真正抓取一些有意义的东西。
使用火狐的审查元素我们可以清楚地看到,我们需要的东西如下:
我们可以用如下代码来抓取这个标签:
从标签中,可以这样获取网站的描述:
sel.xpath( '//ul/li/text()' ).extract()
可以这样获取网站的标题:
sel.xpath( '//ul/li/a/text()' ).extract()
可以这样获取网站的超链接:
sel.xpath( '//ul/li/a/@href' ).extract()
当然,前面的这些例子是直接获取属性的方法。
我们注意到xpath返回了一个对象列表,
那么我们也可以直接调用这个列表中对象的属性挖掘更深的节点
(参考:Nesting selectors andWorking with relative XPaths in the Selectors ):
sites = sel . xpath ( '//ul/li' )
for site in sites :
title = site . xpath ( 'a/text()' ) . extract ()
link = site . xpath ( 'a/@href' ) . extract ()
desc = site . xpath ( 'text()' ) . extract ()
print title , link , desc
3.4xpath实战
我们用shell做了这么久的实战,最后我们可以把前面学习到的内容应用到dmoz_spider这个爬虫中。
在原爬虫的parse函数中做如下修改:
from scrapy.spider import Spider
from scrapy.selector import Selector
class DmozSpider(Spider):
name = "dmoz"
allowed_domains = ["dmoz.org" ]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/" ,
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse( self , response):
sel = Selector(response)
sites = sel.xpath('//ul/li' )
for site in sites:
title = site.xpath('a/text()' ).extract()
link = site.xpath('a/@href' ).extract()
desc = site.xpath('text()' ).extract()
print title
注意,我们从scrapy.selector中导入了Selector类,并且实例化了一个新的Selector对象。这样我们就可以像Shell中一样操作xpath了。
我们来试着输入一下命令运行爬虫(在tutorial根目录里面):
运行结果如下:
果然,成功的抓到了所有的标题。但是好像不太对啊,怎么Top,Python这种导航栏也抓取出来了呢?
我们只需要红圈中的内容:
看来是我们的xpath语句有点问题,没有仅仅把我们需要的项目名称抓取出来,也抓了一些无辜的但是xpath语法相同的元素。
审查元素我们发现我们需要的具有class='directory-url'的属性,
那么只要把xpath语句改成sel.xpath('//ul[@class="directory-url"]/li')即可
将xpath语句做如下调整:
from scrapy.spider import Spider
from scrapy.selector import Selector
class DmozSpider(Spider):
name = "dmoz"
allowed_domains = ["dmoz.org" ]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/" ,
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse( self , response):
sel = Selector(response)
sites = sel.xpath('//ul[@class="directory-url"]/li' )
for site in sites:
title = site.xpath('a/text()' ).extract()
link = site.xpath('a/@href' ).extract()
desc = site.xpath('text()' ).extract()
print title
成功抓出了所有的标题,绝对没有滥杀无辜:
3.5使用Item
接下来我们来看一看如何使用Item。
前面我们说过,Item 对象是自定义的python字典,可以使用标准字典语法获取某个属性的值:
>>> item = DmozItem()
>>> item['title' ] = 'Example title'
>>> item['title' ]
'Example title'
作为一只爬虫,Spiders希望能将其抓取的数据存放到Item对象中。为了返回我们抓取数据,spider的最终代码应当是这样:
from scrapy.spider import Spider
from scrapy.selector import Selector
from tutorial.items import DmozItem
class DmozSpider(Spider):
name = "dmoz"
allowed_domains = ["dmoz.org" ]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/" ,
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse( self , response):
sel = Selector(response)
sites = sel.xpath('//ul[@class="directory-url"]/li' )
items = []
for site in sites:
item = DmozItem()
item['title' ] = site.xpath( 'a/text()' ).extract()
item['link' ] = site.xpath( 'a/@href' ).extract()
item['desc' ] = site.xpath( 'text()' ).extract()
items.append(item)
return items
4.存储内容(Pipeline)
保存信息的最简单的方法是通过Feed exports ,主要有四种:JSON,JSON lines,CSV,XML。
我们将结果用最常用的JSON导出,命令如下:
scrapy crawl dmoz -o items.json -t json
-o 后面是导出文件名,-t 后面是导出类型。
然后来看一下导出的结果,用文本编辑器打开json文件即可(为了方便显示,在item中删去了除了title之外的属性):
因为这个只是一个小型的例子,所以这样简单的处理就可以了。
如果你想用抓取的items做更复杂的事情,你可以写一个 Item Pipeline(条目管道)。
这个我们以后再慢慢玩^_^
你可能感兴趣的:(python,python)
Python 包管理工具 Pip全解
Wis57
python 技术 python pip pycharm
一、Pip1.1pip简介Python之所以受欢迎不光是因为它简单易学,更重要的是它有成千上万的宝藏库。这些库相当于是已经集成好的工具,只要安装就能在Python里使用。它们可以处理各式各样的问题,无需你再造轮子,而且随着社区的不断更新维护,有些库越来越强大,几乎能媲美企业级应用。那么这些工具库怎么下载安装呢?它们被放在一个统一的“仓库”里,名叫PyPi(PythonPackageIndex),所
Python中enumerate函数的使用详解
落英缤纷H
python 开发语言 linux Python
Python中enumerate函数的使用详解在Python编程中,我们经常需要遍历列表或其他可迭代对象,并同时获取元素的索引值。为了简化这个过程,Python提供了一个非常有用的内置函数enumerate()。enumerate()函数可以将一个可迭代对象转换为一个索引-元素对的迭代器,使我们能够同时访问索引和元素。enumerate()函数的语法如下:enumerate(iterable,st
如何优化爬虫以提高效率
数据小小爬虫
爬虫
在使用Python爬虫获取数据时,遵循一些最佳实践可以提高爬虫的效率和稳定性,同时避免潜在的法律和道德风险。以下是一些推荐的最佳实践:一、遵守robots.txt协议robots.txt文件是网站用来告诉爬虫哪些页面可以爬取,哪些不可以的规则文件。遵守robots.txt协议是爬虫的基本道德准则,可以避免对网站造成不必要的负担。二、使用合适的库和框架根据项目需求选择合适的爬虫库和框架。常用的库有r
基于微信小程序的个人健康管理系统
计算机学姐
微信小程序源码 微信小程序 小程序 spring boot java vue.js intellij-idea mybatis
作者:计算机学姐开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码精品专栏:Java精选实战项目源码、Python精选实战项目源码、大数据精选实战项目源码系统展示基于微信小程序+Java+SpringBoot+Vue+
深入解析Python的xmltodict库:简化XML数据处理的利器
kdayjj966
前端 数据库 python
一、引言在当今信息技术的世界中,数据的传输和存储形式多种多样。XML(可扩展标记语言)作为一种灵活而强大的数据格式,得到了广泛应用。它不仅在Web服务中用于数据交换,也在许多应用程序中作为配置文件的格式。然而,尽管XML以其良好的结构性和可读性著称,处理XML数据对于开发者来说仍然是一项繁琐的任务,尤其是在需要频繁进行数据解析和操作的场景。为了解决这一问题,Python社区提供了xmltodict
python cursor游标重置位置scroll_Python中使用MySQLdb连接MySQL ...
贺开
python
‘’‘#选择数据库conn.select_db('python');提交操作:conn.commit()回滚操作:conn.rollback()获取最近查询表的字段个数:conn.field_count上次查询或更新所发生行数:cursor.rowcountexcute(sql,单挑数据元组)、executemany(sql,序列)插入一条记录:executevalue=[1,"inserted?
抽取网易云音乐热门评论(附代码):html+css+python+js 音乐与灵魂的碰撞
爱玩游戏的jason
other html css python
抽取网易云音乐热门评论:html+css+python+js音乐与灵魂的碰撞代码链接不说废话,上代码!!!get.py#get.pyimporturllib.requestimporturllib.errorimporturllib.parseimportjson#抓取网易云音乐指定url的热评defget_hotComments(id):url='https://music.163.com/we
python常见绘图及代码
CodeJourney.
算法 人工智能 python
一、引言在数据驱动的时代,将数据转化为直观的图形对于理解数据、发现模式和传达信息至关重要。Python作为一种功能强大且广受欢迎的编程语言,拥有丰富的绘图库,能满足不同场景下的数据可视化需求。本文将深入探讨Python中常见的绘图程序,包括Matplotlib、Seaborn、Plotly和Bokeh,并提供详细的代码示例。二、Matplotlib:基础绘图的基石2.1简单折线图Matplotli
Python用 subprocess编写超时进程控制脚本
Steffen
Python
一直都寻找在Python下方便控制子进程运行时间的脚本。虽然网上有很多的好方法,但是都不能满足我的需求(也是我资质太低看别人的脚本总感觉太吃力,总有些看不明白的地方)。下面这个脚本和网上一样利用了subprocess函数创建一个子进程控制脚本。(闲话少说,直接上菜!!!)#!/usr/bin/pythonimportsubprocess,timedefTest_ilo():ilo_ip='10.2
25/1/21 算法笔记<ROS2> 编译ROS2 c++节点文档步骤
青椒大仙KI11
c++ 开发语言
在ROS2中,创建节点是指编写一个程序(通常是C++或Python代码),这个程序能够与ROS2系统进行交互,执行特定的任务。节点是ROS2中最基本的执行单元,每个节点通常负责完成一个特定的功能,例如控制机器人、处理传感器数据或执行计算。完整步骤:编译ROS2C++节点1.准备工作有ROS2安装colcon构建工具安装turtlesim包2.创建工作空间创建工作空间:ROS2的工作空间是一个目录结
Python中实现多层感知机(MLP)的深度学习模型
Echo_Wish
Python 笔记 从零开始学Python人工智能 python 深度学习 开发语言
深度学习已经成为机器学习领域的一个热门话题,而多层感知机(MLP)是最基础的深度学习模型之一。在这篇教程中,我将向你展示如何使用Python来实现一个简单的MLP模型。什么是多层感知机(MLP)?多层感知机(MLP)是一种前馈神经网络,它包含一个输入层、一个或多个隐藏层以及一个输出层。每个层都由一系列的神经元组成,神经元之间通过权重连接。MLP能够学习输入数据的非线性特征,因此在复杂问题的建模中非
Python异常处理:从基础到进阶
傻啦嘿哟
python 开发语言
目录一、异常处理基础1.1什么是异常1.2捕获异常1.3多个异常处理1.4else和finally子句二、进阶应用2.1自定义异常2.2异常链2.3使用contextlib进行上下文管理2.4捕获所有异常(慎用)2.5异常处理与函数返回值三、实战案例3.1文件读写异常处理3.2网络请求异常处理四、总结在编程过程中,我们经常会遇到各种运行时错误,比如除零错误、文件未找到错误等。为了处理这些错误,Py
Python识别处理验证码技术详解
傻啦嘿哟
python 开发语言
目录一、验证码的种类二、OCR技术简介三、使用OCR技术识别验证码1.安装所需库2.下载和处理验证码图片3.使用OCR进行识别4.完整代码示例四、处理复杂验证码五、案例:识别古诗文网验证码六、总结验证码作为一种常见的安全手段,广泛应用于各种网站和应用中,以防止自动化脚本的恶意攻击。然而,在自动化测试或数据抓取过程中,识别验证码成为了一个不得不面对的问题。本文将详细介绍如何使用Python来识别和处
python超时退出进程_长时间运行进程的超时和Windows服务(Python)
拉菲雪球兔
python超时退出进程
将服务用作具有多个线程的控制器。一个线程(Main)应该同步和排队命令,并使用win32serviceframework进行通信、注册到系统等。另一个线程(Worker)应该等待来自队列的命令并执行它们。如果您将任意代码作为单独的进程执行,那么您可以从工作线程中派生这些代码,并在它们完成后简单地读回结果并进行清理。在这样,当一个stop到达时,您的主线程将把它注册到它队列中的worker,它将唤醒
A股程序化交易接口有哪些?不同接口在功能和稳定性上有何差异?
财云量化
python炒股自动化 量化交易 程序化交易 a股 程序化交易 接口 功能 股票量化接口 股票API接口
炒股自动化:申请官方API接口,散户也可以python炒股自动化(0),申请券商API接口python炒股自动化(1),量化交易接口区别Python炒股自动化(2):获取股票实时数据和历史数据Python炒股自动化(3):分析取回的实时数据和历史数据Python炒股自动化(4):通过接口向交易所发送订单Python炒股自动化(5):通过接口查询订单,查询账户资产股票量化,Python炒股,CSDN
ssti注入
m0_73818134
flask python
flask有个明显的特征就是服务器模板,把用户输入的回显到web页面,一般在用户交互的地方(输入/输出),这个要用python去构造链子去执行python命令,来getshell。一般的注入是get型的如{{7*7}},{%7*7%},{#7*7#},还有{%print(7*7)%}.一般的链子1().__class__.__base__.__subclasses__()[140].__init_
python之.pyc文件
diantuge7474
java 运维 python
.pyc是个什么呢?计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。解释型语言就没有这个编译的过程,而是在程序
【人工智能】Python常用库-Keras:高阶深度学习 API
IT古董
深度学习 人工智能 Python 人工智能 python 深度学习
Keras:高阶深度学习APIKeras是一个高效、用户友好的深度学习框架,作为TensorFlow的高级API,支持快速构建和训练深度学习模型。它以模块化、简单和灵活著称,适合研究和生产环境。Keras的发音为[ˈkerəs],类似于“凯拉斯”或“克拉斯”。这个名字来源于希腊语κέρας(kéras),意思是“角”或“角质物”。这个词与深度学习的灵感来源——大脑的神经网络结构有一定联系。Kera
【Node.js]
ADFVBM
面试 学习路线 阿里巴巴 node.js
一、概述Node.js是一个基于ChromeV8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型,让JavaScript运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。官网地址:https://nodejs.org/zh-cnNode.js学习路线:JavaScript基础语法+Node.js内
SAP UI5 初学者教程之十三 - 如何添加自定义 CSS 类试读版
Python中的class体内定义方法时,如果没有显式地包含self参数,有时候依然可以被调用。这是一个非常有趣的话题,因为它涉及到对Python中类与对象之间关系的更深理解。要理解为什么这种情况下方法依然能够被调用,我们需要逐步拆解Python类的构造方式以及方法绑定的原理。
那些年我用过的SAP IDE
Python中的class体内定义方法时,如果没有显式地包含self参数,有时候依然可以被调用。这是一个非常有趣的话题,因为它涉及到对Python中类与对象之间关系的更深理解。要理解为什么这种情况下方法依然能够被调用,我们需要逐步拆解Python类的构造方式以及方法绑定的原理。
python代码转exe
xuaman
python python exe 编译
1.打开cmd控制台,跳转之python目录下的scripts.2.输入:pipinstallnumpy3.第二步成功后,输入:pipinstallPyInstaller4.第三步完成后,输入:pyinstaller-Fpy文件路径5.第四步完成后,在当前目录下出现,dist文件夹,里面就是编译成功的同名exe文件如有问题可以留言。
python将excel表数据可视化,python对excel数据可视化
www55597
信息可视化 人工智能
大家好,小编来为大家解答以下问题,利用python处理excel文件并可视化处理,用python对excel表进行可视化分析,现在让我们一起来看看吧!一.需求最近我们数据可视化的老师让我们把广州历史房价中的房价数据可视化,然后给我们发了广州历史房价.xls,然后看了一下数据确实有点小多,反正复制粘贴是有点费劲的,所以就想借用python帮我把数据修改成我一键复制的模样。二.安装xlrd模块pipi
Python集合运算:数据处理的强大工具
清水白石008
python Python题库 python 开发语言 算法
Python集合运算:数据处理的强大工具集合(Set)是Python中一种非常有用的数据结构,它用于存储无序且唯一的元素。集合支持各种数学运算,例如并集、交集、差集和对称差集,这些运算在数据处理、数据分析和算法实现中都非常有用。本文将以实用性为导向,深入讲解如何在Python中创建集合并进行各种集合运算,力求内容丰富、条理清晰、操作性强,帮助读者充分掌握Python集合的强大功能。一、集合的基本概
[287]python获取操作系统平台、版本及架构
周小董
Python前行者
platform模块提供了底层系统平台的相关信息系统架构32位还是64位>>>importplatform>>>platform.architecture()('64bit','ELF')#python3.3.2+64bitsondebianjessie64bits('32bit','WindowsPE')#python3.3.232bitsonwindows8.164bits('64bit','
Python打包脚本为EXE可执行文件
Ethan Hunt丶
开发 python bash
Python打包脚本为EXE可执行文件1.打包原理2.代码示例2.1项目需求2.2项目结构2.3文件内容2.4安装依赖库2.5使用Pyinstaller进行打包3.注意事项3.1新建虚拟环境3.2替换EXE文件图标4.效果展示1.打包原理Python脚本打包为EXE的过程,主要是通过将Python代码、依赖库和Python解释器一起打包成一个可执行文件,从而实现不依赖于Python环境的独立执行。
python3.6 split用法_对sklearn的使用之数据集的拆分与训练详解(python3.6)
weixin_39849054
python3.6 split用法
研修课上讲了两个例子,融合一下。主要演示大致的过程:导入->拆分->训练->模型报告以及几个重要问题:①标签二值化②网格搜索法调参③k折交叉验证④增加噪声特征(之前涉及)fromsklearnimportdatasets#从cross_validation导入会出现warning,说已弃用fromsklearn.model_selectionimporttrain-test_splitfromsk
python datasets_python基础之sklearn.datasets
weixin_39897887
python datasets
sklearn.datasets模块主要提供了一些导入、在线下载及本地生成数据集的方法,可以通过dir或help命令查看,我们会发现主要有三种形式:load_、fetch_及make_的方法(1)datasets.load_:sklearn包自带的小数据集In[2]:datasets.load_*?datasets.load_boston#波士顿房价数据集datasets.load_breast_
python 架构简介(转)
weixin_34367845
python 数据库
前言:开发语言python越来越火,作为开发比较火的语言,python对网页等的支持也很好,当你想用python来写网页的时候你就要选择框架了。到底要选择呢什么样子的框架,最适合你的项目能力。介绍:Django:PythonWeb应用开发框架Django应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响。Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用
Python第三方库GDAL 安装
一名写前端的GISer
python python 开发语言
安装GDAL的方式多种,包括pip、Anaconda、OSGeo4W等。笔者在安装过程中,唯独使用pip安装遇到问题。最终通过轮子文件(.whl)成功安装。本文主要介绍如何下载和安装较新版本的GDAL轮子文件。一、GDAL轮子文件下载打开Github网站(https://github.com/sion258/geospatial-wheels?tab=readme-ov-file#release-
辗转相处求最大公约数
沐刃青蛟
C++ 漏洞
无言面对”江东父老“了,接触编程一年了,今天发现还不会辗转相除法求最大公约数。惭愧惭愧!
为此,总结一下以方便日后忘了好查找。
1.输入要比较的两个数a,b
忽略:2.比较大小(因为后面要的是大的数对小的数做%操作)
3.辗转相除(用循环不停的取余,如a%b,直至b=0)
4.最后的a为两数的最大公约数
&
F5负载均衡会话保持技术及原理技术白皮书
bijian1013
F5 负载均衡
一.什么是会话保持? 在大多数电子商务的应用系统或者需要进行用户身份认证的在线系统中,一个客户与服务器经常经过好几次的交互过程才能完成一笔交易或者是一个请求的完成。由于这几次交互过程是密切相关的,服务器在进行这些交互过程的某一个交互步骤时,往往需要了解上一次交互过程的处理结果,或者上几步的交互过程结果,服务器进行下
Object.equals方法:重载还是覆盖
Cwind
java generics override overload
本文译自StackOverflow上对此问题的讨论。
原问题链接
在阅读Joshua Bloch的《Effective Java(第二版)》第8条“覆盖equals时请遵守通用约定”时对如下论述有疑问:
“不要将equals声明中的Object对象替换为其他的类型。程序员编写出下面这样的equals方法并不鲜见,这会使程序员花上数个小时都搞不清它为什么不能正常工作:”
pu
初始线程
15700786134
暑假学习的第一课是讲线程,任务是是界面上的一条线运动起来。
既然是在界面上,那必定得先有一个界面,所以第一步就是,自己的类继承JAVA中的JFrame,在新建的类中写一个界面,代码如下:
public class ShapeFr
Linux的tcpdump
被触发
tcpdump
用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支 持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
实用命令实例
默认启动
tcpdump
普通情况下,直
安卓程序listview优化后还是卡顿
肆无忌惮_
ListView
最近用eclipse开发一个安卓app,listview使用baseadapter,里面有一个ImageView和两个TextView。使用了Holder内部类进行优化了还是很卡顿。后来发现是图片资源的问题。把一张分辨率高的图片放在了drawable-mdpi文件夹下,当我在每个item中显示,他都要进行缩放,导致很卡顿。解决办法是把这个高分辨率图片放到drawable-xxhdpi下。
&nb
扩展easyUI tab控件,添加加载遮罩效果
知了ing
jquery
(function () {
$.extend($.fn.tabs.methods, {
//显示遮罩
loading: function (jq, msg) {
return jq.each(function () {
var panel = $(this).tabs(&
gradle上传jar到nexus
矮蛋蛋
gradle
原文地址:
https://docs.gradle.org/current/userguide/maven_plugin.html
configurations {
deployerJars
}
dependencies {
deployerJars "org.apache.maven.wagon
千万条数据外网导入数据库的解决方案。
alleni123
sql mysql
从某网上爬了数千万的数据,存在文本中。
然后要导入mysql数据库。
悲剧的是数据库和我存数据的服务器不在一个内网里面。。
ping了一下, 19ms的延迟。
于是下面的代码是没用的。
ps = con.prepareStatement(sql);
ps.setString(1, info.getYear())............;
ps.exec
JAVA IO InputStreamReader和OutputStreamReader
百合不是茶
JAVA.io操作 字符流
这是第三篇关于java.io的文章了,从开始对io的不了解-->熟悉--->模糊,是这几天来对文件操作中最大的感受,本来自己认为的熟悉了的,刚刚在回想起前面学的好像又不是很清晰了,模糊对我现在或许是最好的鼓励 我会更加的去学 加油!:
JAVA的API提供了另外一种数据保存途径,使用字符流来保存的,字符流只能保存字符形式的流
字节流和字符的难点:a,怎么将读到的数据
MO、MT解读
bijian1013
GSM
MO= Mobile originate,上行,即用户上发给SP的信息。MT= Mobile Terminate,下行,即SP端下发给用户的信息;
上行:mo提交短信到短信中心下行:mt短信中心向特定的用户转发短信,你的短信是这样的,你所提交的短信,投递的地址是短信中心。短信中心收到你的短信后,存储转发,转发的时候就会根据你填写的接收方号码寻找路由,下发。在彩信领域是一样的道理。下行业务:由SP
五个JavaScript基础问题
bijian1013
JavaScript call apply this Hoisting
下面是五个关于前端相关的基础问题,但却很能体现JavaScript的基本功底。
问题1:Scope作用范围
考虑下面的代码:
(function() {
var a = b = 5;
})();
console.log(b);
什么会被打印在控制台上?
回答:
上面的代码会打印 5。
&nbs
【Thrift二】Thrift Hello World
bit1129
Hello world
本篇,不考虑细节问题和为什么,先照葫芦画瓢写一个Thrift版本的Hello World,了解Thrift RPC服务开发的基本流程
1. 在Intellij中创建一个Maven模块,加入对Thrift的依赖,同时还要加上slf4j依赖,如果不加slf4j依赖,在后面启动Thrift Server时会报错
<dependency>
【Avro一】Avro入门
bit1129
入门
本文的目的主要是总结下基于Avro Schema代码生成,然后进行序列化和反序列化开发的基本流程。需要指出的是,Avro并不要求一定得根据Schema文件生成代码,这对于动态类型语言很有用。
1. 添加Maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<proj
安装nginx+ngx_lua支持WAF防护功能
ronin47
需要的软件:LuaJIT-2.0.0.tar.gz nginx-1.4.4.tar.gz &nb
java-5.查找最小的K个元素-使用最大堆
bylijinnan
java
import java.util.Arrays;
import java.util.Random;
public class MinKElement {
/**
* 5.最小的K个元素
* I would like to use MaxHeap.
* using QuickSort is also OK
*/
public static void
TCP的TIME-WAIT
bylijinnan
socket
原文连接:
http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html
以下为对原文的阅读笔记
说明:
主动关闭的一方称为local end,被动关闭的一方称为remote end
本地IP、本地端口、远端IP、远端端口这一“四元组”称为quadruplet,也称为socket
1、TIME_WA
jquery ajax 序列化表单
coder_xpf
Jquery ajax 序列化
checkbox 如果不设定值,默认选中值为on;设定值之后,选中则为设定的值
<input type="checkbox" name="favor" id="favor" checked="checked"/>
$("#favor&quo
Apache集群乱码和最高并发控制
cuisuqiang
apache tomcat 并发 集群 乱码
都知道如果使用Http访问,那么在Connector中增加URIEncoding即可,其实使用AJP时也一样,增加useBodyEncodingForURI和URIEncoding即可。
最大连接数也是一样的,增加maxThreads属性即可,如下,配置如下:
<Connector maxThreads="300" port="8019" prot
websocket
dalan_123
websocket
一、低延迟的客户端-服务器 和 服务器-客户端的连接
很多时候所谓的http的请求、响应的模式,都是客户端加载一个网页,直到用户在进行下一次点击的时候,什么都不会发生。并且所有的http的通信都是客户端控制的,这时候就需要用户的互动或定期轮训的,以便从服务器端加载新的数据。
通常采用的技术比如推送和comet(使用http长连接、无需安装浏览器安装插件的两种方式:基于ajax的长
菜鸟分析网络执法官
dcj3sjt126com
网络
最近在论坛上看到很多贴子在讨论网络执法官的问题。菜鸟我正好知道这回事情.人道"人之患好为人师" 手里忍不住,就写点东西吧. 我也很忙.又没有MM,又没有MONEY....晕倒有点跑题.
OK,闲话少说,切如正题. 要了解网络执法官的原理. 就要先了解局域网的通信的原理.
前面我们看到了.在以太网上传输的都是具有以太网头的数据包. 
Android相对布局属性全集
dcj3sjt126com
android
RelativeLayout布局android:layout_marginTop="25dip" //顶部距离android:gravity="left" //空间布局位置android:layout_marginLeft="15dip //距离左边距
// 相对于给定ID控件android:layout_above 将该控件的底部置于给定ID的
Tomcat内存设置详解
eksliang
jvm tomcat tomcat内存设置
Java内存溢出详解
一、常见的Java内存溢出有以下三种:
1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。
可以利用JVM提
Java6 JVM参数选项
greatwqs
java HotSpot jvm jvm参数 JVM Options
Java 6 JVM参数选项大全(中文版)
作者:Ken Wu
Email:
[email protected]
转载本文档请注明原文链接 http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm!
本文是基于最新的SUN官方文档Java SE 6 Hotspot VM Opt
weblogic创建JMC
i5land
weblogic jms
进入 weblogic控制太
1.创建持久化存储
--Services--Persistant Stores--new--Create FileStores--name随便起--target默认--Directory写入在本机建立的文件夹的路径--ok
2.创建JMS服务器
--Services--Messaging--JMS Servers--new--name随便起--Pers
基于 DHT 网络的磁力链接和BT种子的搜索引擎架构
justjavac
DHT
上周开发了一个磁力链接和 BT 种子的搜索引擎 {Magnet & Torrent},本文简单介绍一下主要的系统功能和用到的技术。
系统包括几个独立的部分:
使用 Python 的 Scrapy 框架开发的网络爬虫,用来爬取磁力链接和种子;
使用 PHP CI 框架开发的简易网站;
搜索引擎目前直接使用的 MySQL,将来可以考虑使
sql添加、删除表中的列
macroli
sql
添加没有默认值:alter table Test add BazaarType char(1)
有默认值的添加列:alter table Test add BazaarType char(1) default(0)
删除没有默认值的列:alter table Test drop COLUMN BazaarType
删除有默认值的列:先删除约束(默认值)alter table Test DRO
PHP中二维数组的排序方法
abc123456789cba
排序 二维数组 PHP
<?php/*** @package BugFree* @version $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $*** Sort an two-dimension array by some level
hive优化之------控制hive任务中的map数和reduce数
superlxw1234
hive hive优化
一、 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务。 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);2. 
Spring Boot 1.2.4 发布
wiselyman
spring boot
Spring Boot 1.2.4已于6.4日发布,repo.spring.io and Maven Central可以下载(推荐使用maven或者gradle构建下载)。
这是一个维护版本,包含了一些修复small number of fixes,建议所有的用户升级。
Spring Boot 1.3的第一个里程碑版本将在几天后发布,包含许多