当前位置: 首页 > 编程日记 > 正文

Python网络爬虫--urllib

本篇随便记录学习崔庆才老师编著的《Python3 网络爬虫开发实战》以及urllib标准库使用

urllib库是Python内置的HTTP请求库,包含四个模块:

  • request:最基本的HTTP请求模块,可以用来模拟发送请求。
  • error:异常处理模块,包含request模块HTTP请求过程抛出的异常
  • parse:一个工具模块,提供了许多URL处理的方法,比如拆、解析、合并等
  • robotparser:主要用来识别网站的robot.txt文件,然后判断网站哪些部分可以爬取

发送请求

urllib.request.urlopen()

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
  • url:请求的网址,必选参数
  • data:可选参数,如果设定,则该请求为POST请求方法。data必须为字节流数据(可用内置函数bytes()方法转换为字节流),数据内容如果是字典,可以通过parse模块的urlencode()方法将其转换为url格式的字符串
  • timeout:可选参数,设置请求超时时间,单位为秒
  • cafile:可选参数,CA证书文件
  • capath:CA证书路径
  • cadefault:python3中已经弃用
  • context:可选参数,指定SSL设置,必须为ssl.SSLContext类型
import urllib.request
import urllib.parsename = bytes(urllib.parse.urlencode({"name":"Jane"}),encoding = "utf-8")
response = urllib.request.urlopen("https://www.python.org",data = name,timeout = 1)

urllib.request.Request()

urllib.request.open()方法可以实现最基本的请求,但是该方法中只有几个参数,有时候不能满足我们的要求。因此我们可以通过urllib.request.Request()构建一个请求

Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
  • url:必选参数,请求的网址
  • data:可选参数,如果设定,则该请求为POST请求方法。data必须为字节流数据(可用内置函数bytes()方法转换为字节流),数据内容如果是字典,可以通过parse模块的urlencode()方法将其转换为url格式的字符串
  • headers:可选参数,请求头
  • origin_req_host:客户端主机名称或者IP地址
  • unverifiable:用户没有足够的权限接收这个请求的结果,默认为False,即我们有权限接收
  • method:请求方法
from urllib import request,parseheaders = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36","accept-encoding":"gzip","Cookie":"_ga=GA1.2.1498502246.1545274514"}
data = bytes(parse.urlencode({"Language":"Python"}),encoding = "utf-8")
my_request = request.Request("https://www.python.org",headers = headers,data = data,method = "POST")
response = request.urlopen(my_request)

handler和opener

常用的handler:

  • HTTPDefaultErrorHandler:用于处理HTTP响应错误,错误都会抛出HTTPError类型的异常
  • HTTPRedirectHandler:用于处理重定向
  • HTTPCookieProcessor:用于处理Cookies
  • ProxyHandler:用于设置代理,默认代理为空
  • HTTPPasswordMgr:用于管理密码,维护用户名与密码的表单
  • HTTPBasicAuthHandler:用于管理认证,如果打开一个连接需要认真,那么可以用它来解决认证的问题
  • HTTPHandler:用来用处URL

opener:

  • urllib.request.build_opener([handler...]):实例化一个opener,使用各种功能的处理器
  • urllib.request.install_opener(opener) :设定一个全局opener,即程序里所有的请求都调用该opener

自定义的一般步骤:

  1. 使用相关功能的Handle处理器,来创建特定功能的处理器对象
  2. 然后通过如request.build_opener()方法,来使用这些处理器对象,创建自定义opener对象
  3. 使用自定义的opener对象,调用其open()方法向服务器发送请求
from urllib import request
http_handler = request.HTTPHandler() # 实例化一个具有处理url功能的处理器
my_opener = request.build_opener(http_handler) # 创建一个能使用该处理器的opener,此时该opener就具备了处理url功能
response = my_opener.open("https://www.python.org")  
# 设置代理
from urllib import request
my_proxy = {"http":"120.76.55.49:8088"}
proxy_handler = request.ProxyHandler(my_proxy)
proxy_opener = request.build_opener(proxy_handler)
response = proxy_opener.open("https://www.python.org")#如果有多个代理
from urllib import request
import random
my_proxies = [{"http" : "124.88.67.81:80"},{"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"},{"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"}]
proxy = random.choice(my_proxies)
proxy_handler = request.ProxyHandler(proxy)
proxy_opener = request.build_opener(proxy_handler)
response = proxy_opener.open("https://www.python.org")

平时我们设置Cookies都是在输入账户、密码登录之后,然后在浏览器保存这些信息(Cookies),然后再去查看源码找到这个Cookies(抓包),然后将它加入到请求头,根据源码再构建的请求。

而用handler的话,对于python2来说可以用cookielib模块和urllib.request.HTTPCookieProcessor来处理,对于cookielib模块有四个对象。在python3中,替换为http.cookiejar库,四个子类,同python2四个对象相同:

  • CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
  • FileCookieJar:FileCookieJar(filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问文件,即只有在需要时才读取文件或在文件中存储数据。
  • MozillaCookieJar:MozillaCookieJar(filename, delayload=None, policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例
  • LWPCookieJar:LWPCookieJar(filename, delay=None, policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的Set-Cookie3文件格式兼容的FileCookieJar实例。

python2中基本用法:

from urllib import request
import cookielib
cookiejar = cookielib.CookieJar() # 创建一个Cookiejar对象来保存cookie
cookie_handler = request.HTTPCookieProcessor(cookiejar) # 创建一个cookie处理器对象
my_opener = request.build_opener(cookie_handler) # 创建一个opener来使用这个处理器
response = my_opener.open("https://www.baidu.com")

python3中基本用法(CookieJar()):

from urllib import request
from http import cookiejarmy_cookiejar = cookiejar.CookieJar() # CookieJar()可以管理,储存HTTP请求生成的cookie,我们把这个保存的cookie实例化
my_cookiehandler = request.HTTPCookieProcessor(my_cookiejar) # 创建一个处理cookiejar的处理器,也就是处理器处理这个cookie
opener = request.build_opener(my_cookiehandler) # 创建一个opener,此时这个opener就包含了这个cookie
response = opener.open("https://www.baidu.com")

大多数情况我们使用CookieJar(),但是如果需要同本地文件进行交互(也就是从本地读取,或者在本地创建),那么可以使用MozillaCookieJar()和LWPCookieJar(),两者用法一样,只需要将MozillaCookieJar和LWPCookieJar名称互换

from urllib import request
from http import cookiejar
my_cookiejar = cookiejar.MozillaCookieJar(file) # 创建一个符合Mozilla浏览器标准的cookiejar对象,叫做my_cookiejar,此时它是一个对象,一个MozillaCookieJar实例化对象。file,即我们要创建的cookie文件的文件名字
my_cookiehandler = request.HTTPCookieProsessor(my_cookiejar) # 创建一个处理这个cookiejar实例的处理器对象
openr = request.build_opener(my_cookiehandler) # 创建一个opener,来使用这个处理器对象 
response = opener.open("https://www.baidu.com")
# sava()将这个实例化对象my_cookiejar包含的cookies信息,保存成本地文件,文件名之前已经确定了。另外,还可以通过load()方法从一个文件导入cookies
# save()方法中两个参数,ignore_discard:保存需要被丢弃的cookies;ignore_expires:保存过期的cookies
# 通过下面代码可以发现本地电脑中创建了一个名为cookie的文本文件
my_cookiejar.save(ignore_discard = True,ignore_expires = True)

对于某些网站需要输入账户、密码才能访问,此处我们可以用HTTPPasswordMgrWithDefaultReadlm(管理账户、密码)、HTTPBasicAuthHandler

from urllib import request
username = "Maria"
password = "123456"
np = request.HTTPPasswordMgrWithDefaultReadlm() # 创建一个账户密码管理器对象
np.add_password(username,password) # 账户密码管理器中加入账户密码
auth_handler = request.HTTPBasicAuthHandler(np) # 创建一个验证该账户密码的处理器对象
opener = request.build_opener(auth_handler)
response = opener.open("https://www.baidu.com")

异常

异常:urrlib库的error模块定义了由request模块产生的异常,如果request模块应用过程出现了问题,request模块便会抛出error模块定义的异常。即,error模块能捕获request模块使用过程中出现的问题,error模块主要有三类:

  • ContentTooShortError
  • HTTPError
  • URLError

urllib.error.URLError

当各种处理器(handler)运行出现问题的时候,一般是没有网络连接或者是无法连接服务器处理器会抛出异常。它是OSError的子类,它具有一个属性:reason

reason:这个错误的原因,它可以是一个字符信息或者是一个异常实

urllib.error.HTTPError

它是URLError的子类,这一种异常通常是连接服务器后,服务器响应出现问题,如返回错误信息或者重定向错误,网页验证错误等等。虽然它是一个异常,但是它也可以像非异常文件样的函数方法一样返回(像urlopen()方法返回值一样),这在处理外部HTTPError非常有用,比如 说验证请求错误。这个类包含三个属性:code、reason、headers

  code:HTTP状态码

reason:通常是一个字符串信息,解释这个错误的原因

headers:导致HTTPError的HTTP请求后服务器返回的HTTP响应的头部信息。

urllib.error.ContentTooShort

当urlretrieve()函数检测到下载的数据量小于预期(这个预期在头部信息,Content-Length给定)时,抛出该异常。其中,content属性储存着下载的(或删减过后的)数据

from urllib import request
from urllib import error
try:response = request.urlopen("https://www.sdkfjla.com")
except error.URLError as ue:print(ue.reson)print(ue)
except error.HTTPError as he:print(he.code)print(he.reason)print(he.headers)print(he)
except Exception as e:print(e)

解析链接

urlparse()

将一个URL链接解析为6部分:<协议>://<域名>/<路径>;<访问参数>?<查询条件>#<锚点>。结果返回包含6个元素的元组。

urlparse(url, scheme='', allow_fragments=True)Parse a URL into 6 components:
<scheme>://<netloc>/<path>;<params>?<query>#<gragment>   
Return a 6-tuple: (scheme, netloc, path, params, query, fragment).
Note that we don't break the components up in smaller bits
(e.g. netloc is a single string) and we don't expand % escape.
  • url:必选参数,即带解析的URL
  • scheme:默认的协议,如果待解析的URL不含协议信息,则会将该参数作为默认的协议
  • allow_fragment:即是否忽略fragment。如果设置为False,则fragment则会被忽略,而原本该解析为fragment的这一部分会被解析为path、parameters或者query的一部分,fragment则显示为空
from urllib import parse
result = parse.urlparse("https://i.cnblogs.com/EditPosts.aspx?postid=10813489&update=1")
print(type(result),result)
result1 = parse.urlparse("http://www .baidu .com/index .html;user?id=5#commen",allow_fragment = False)
print(result1)

运行结果:

<class 'urllib.parse.ParseResult'>
ParseResult(scheme='https', netloc='i.cnblogs.com', path='/EditPosts.aspx', params='', query='postid=10813489&update=1', fragment='')
ParseResult(scheme='http', netloc='www,baidu.com', path='/index.html', params='user', query='5#commen', fragment='')

urlunparse()

与urlparse()正好相反,构造一个URL链接,其接收的参数是一个可迭代对象,但是它的长度必须为6,否则会抛出参数数量不足或者过多的问题。

urlunparse(components)
Put a parsed URL back together again.  This may result in a slightly different, but equivalent URL, 
if the URL that was parsed originally had redundant delimiters,
e.g. a ? with an empty query (the draft states that these are equivalent).

如:

from urllib import parsecomponents = ["http","www.baidu.com","index.html","user","id=5","comment"]
URL = parse.urlunparse(components)
print(URL)

运行结果为:

"http://www.baidu.com/index.html;user?id=5#comment"

urlsplit()

这个方法和urlparse()非常相似,只不过它不再单独解析params这部分,只返回5个结果。

from urllib import parse
result = parse.urlsplit("http://www .baidu .com/index .html;user?id=5#commen")
print(result)

运行结果:

SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='id=5', fragment='comment')

urlunsplit()

该方法与urlunparse()非常相似,正好与urlsplit()相反。将链接各组分组合成一个完整的链接,传入的参数是一个可迭代对象,但是长度必须为5

from urllib import parse
components = ("http","www.baidu.com","/index.html;name=Jane","id=5","comment")
URL = parse.urlunsplit(components)
print(URL)

运行结果:

http://www.baidu.com/index.html;name=Jane?id=5#comment

urljoin()

urljoin(base, url, allow_fragments=True)Join a base URL and a possibly relative URL to form an absolute interpretation of the latter.
  • base:基础链接
  • url:待构建的一个链接
  • allow_fragment:是否包含锚点

首先提供一个基础链接作为第一个参数,将一个新链接作为第二个参数,该方法会分析基础链接的scheme、netloc、path这三个部分内容,然后根据这三个组分对新链接中的缺失部分进行补充,让后者形成一个完整的链接

from urllib import parse
URL = parse.urljoin("https://www.baidu.com","/index.html;name=Jane?id=2#comment")
print(URL)

运行结果:

https://www.baidu.com/index.html;name=Jane?id=2#comment

urlencode()

常用来构建GET请求参数,即标准链接中的params组分。为了方便我们常会现用字典表示参数,然后用该方法将它构建为URL中的params组分。

from urllib import parse
infomation = {"Maria":15,"Jane":16,"Mecheal":16}
base_url = "https://www.baidu.com?"
new_url = base_url+parse.urlencode(infomation)
print(new_url)

运行结果:

https://www.baidu.com?Maria=15&Jane=16&Mecheal=16

parse_qs()

反序列化,假如我们有一串GET请求参数,利用parse_qs()方法,我们可以将这些参数转回为字典

from urllib import parse
params = "Maria=15&Jane=16&Mecheal=16"
print(parse.parse_qs(params))

运行结果:

{'Maria': ['15'], 'Jane': ['16'], 'Mecheal': ['16']}

parse_qsl()

同parse_qs()方法相似,只是parse_qsl()方法是将请求参数转化为元组组成的列表

from urllib import parse
params = "Maria=15&Jane=16&Mecheal=16"
print(parse.parse_qsl(params))

运行结果:

[('Maria', '15'), ('Jane', '16'), ('Mecheal', '16')]

quote()

该方法可以将内容转化为URL编码,如URL中带有中文参数时,可能会出现乱码问题,我们可以用该方法将中文字符转换为URL编码

from urllib import parse
keyword = "冯宝宝"
url = "https://www.baidu.com/seach?wd="+parse.quote(keyword)
print(url)

运行结果:

https://www.baidu.com/seach?wd=%E5%86%AF%E5%AE%9D%E5%AE%9D

unquote()

与quote()方法相反,unquote()方法可以将URL中的中文编码解析还原为中文

from urllib import parse
url = "https://www.baidu.com/seach?wd=%E5%86%AF%E5%AE%9D%E5%AE%9D"
print(parse.unquote(url))

运行结果:

https://www.baidu.com/seach?wd=冯宝宝

解析Robots协议

Robots协议,全称为网络爬虫排除标准(Robots Exclusion Protocol),用来告诉爬虫或者搜索引擎哪些页面可以抓取,哪些页面不可以抓取。通常是一个Robots.txt文件,一般放在网站的根目录下

robotparser.RobotFileParser类

该类提供了很多方法:

  • can_fetch(self, useragent, url):返回的内容是该搜索引擎是否可以抓取这个 URL ,返回结果是 True 或 False
  • modified(self):将当前时间设置为上次抓取和分析robot.text文件的时间
  • mtime(self):返回的是上次抓取和分析robot.text文件的时间
  • parse(self, lines):用来解析 robots. txt 文件,传人的参数是 robots .txt某些行的内,它会按照 robots . txt的语法规则来分析这些内容 
  • read(self):读取 robots . txt 文件并进行分注意,这个方法执行一个读取和分析操作,如果不调用这个方法 接下来的判断都会为 False ,所以一定记得调用这个方法 这个方法不会返回任何内容,但是执行了读取操作 
from urllib.robotparser import RobotFileParser
rp = RobotFileParser() # 对RobotFileParser类实例化
rp.set_url("https://www.taobao.com/robots.text") # 设置robot.txt文件链接
rp.read() #读取该robot.txt文件并分析
# 分析我们是否能抓取该网站的某个页面
print(rp.can_fetch("*","https://www.taobao.com/markets/3c/tbdc?spm=a21bo.2017.201867-main.12.5af911d9DPQkf4"))

运行结果:

False

转载于:https://www.cnblogs.com/sakura-d/p/10813489.html

相关文章:

Python基础三--字典,集合,编码,深浅copy,元祖、文件操作

字典 dict数据类型划分&#xff1a;可变数据类型&#xff0c;不可变数据类型不可变数据类型&#xff1a; 元组&#xff0c;bool值&#xff0c;int&#xff0c;str 可哈希可变数据类型&#xff1a; list&#xff0c;dict&#xff0c;set 不可哈希dict key…

springboot +security +mybatis+thymeleaf 实现简单的用户 角色 权限(资源) 管理

1、用户 角色 资源的关系 2、实现思路 3、参考资料 Spring Boot Security Redis 实现简单权限控制 将返回结果变成json 响应改客户端 在第六项 4、实现代码 https://github.com/huyande/springsecurity.git 5、其他问题记录 在使用springboot 2.1.X 版本 &#xff0…

在JS中最常看到切最容易迷惑的语法(转)

发现一篇JS中比较容易迷惑的语法的解释,挺有用的,转载下,与大家分享: js中大括号有四种语义作用语义1&#xff0c;组织复合语句,这是最常见的 Js代码 if( condition ) { //... }else { //... } for() { //... } if( condition ) {//... }else {//... } f…

三、类型设计规范

一、类型的逻辑分组从CLR的角度来看&#xff0c;只有两种类型&#xff1a;引用类型和值类型。但从框架设计来说&#xff0c;可以进行更细致的分类 1、引用类型&#xff0c;包括&#xff1a;类、静态类、集合、数组、异常、属性2、值类型&#xff0c;包括&#xff1a;枚举和结构…

使用mybatis一次性添加多条数据 在oracle 数据库上

1、sql 语句 #sql 语句 insert into STD_XXXX &#xff08;表名&#xff09; (ID,NAME,CLASSNAME ) select STD_XXX_SEQUENCE.Nextval,&#xff08;自增序列名称&#xff09; XXX.* from (select 1,3 from dual unionselect 2,3 from dual)XXX 2、mybatis #多条插入 &…

使用SharpPCap在C#下进行网络抓包

转自http://www.cnblogs.com/billmo/archive/2008/11/09/1329972.html 在做大学最后的毕业设计了,无线局域网络远程安全监控策略那么抓包是这个系统设计的基础以前一直都是知道用winpcap的,现在网上搜了一下,有用C#封装好了的,很好用下面是其中的几个用法这个类库作者的主页:ht…

Spring Security的RBAC数据模型嵌入

1.简介 ​ 基于角色的权限访问控制&#xff08;Role-Based Access Control&#xff09;作为传统访问控制&#xff08;自主访问&#xff0c;强制访问&#xff09;的有前景的代替受到广泛的关注。在RBAC中&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而得…

实用Jquery开发自己的插件

实用Jquery开发自己的插件 jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。 jQuery.fn.extend(object);给jQuery对象添加方法。 fn 是什么东西呢。查看jQuery代码&#xff0c;就不难发现。 jQuery.fn jQuery…

无线网中的一些技术名词和解释

现在大家到处都可以听到在说WLAN&#xff0c;到底 个WLAN是什么意思呢&#xff1f;WLAN&#xff1a;Wireless Local Area Network的缩写&#xff0c;也是无线局域网的意思。AP&#xff1a;Access Point,无线接入器&#xff0c;常常缩写为AP。SSID&#xff1a;也缩写国ESSID&…

说到心里的哲理个性签名 学生时代的恋爱无非就是陪伴二字

学生时代的恋爱无非就是陪伴二字 也许因为得不到所以空想总是美好 . 让一个男人哭了 没错你赢了 但是你玩大了 曾经我们都那样嚣张后来怎么也学会了退让. 爱一个人成为习惯就会失去放手的勇敢. 有时沉默并不是因为词穷而是因为心空. 前任也曾是对的人 别打听我我没故事可说. 你…

切换用户启动程序

#!/bin/bash su - elasticsearch <<EOF /opt/elasticsearch-6.6.2/bin/elasticsearch -d exit EOF转载于:https://www.cnblogs.com/divl/p/10826803.html

即将到来的日子 ,你会寂寞吗?

见到如此的数字&#xff0c;不知道身边的你是否会想起一些往事&#xff0c;我想这一刻很难去形容&#xff0c;因为哥也会有寂寞的一天。 从来不太喜欢的节日&#xff0c;但是每逢到来的时候&#xff0c;总会有一阵阵的痛。今天不是好的节日&#xff0c;在地球上某一个角落&…

Mybatis 获取当前序列和下一个序列值 以及在一个方法中写多条SQL 语句

目录 1、Mybatis 获取当前序列和下一个序列值 2、Mybatis 在一个方法中写多条SQL 语句 1、Mybatis 获取当前序列和下一个序列值 #获取当前序列值 select XXX_sequence.currval from dual#获取下一个序列值 select XXX_sequence.Nextval from dual2、Mybatis 在一个方法中写多条…

MikuMikuDance 6 菜单汉化补丁

MikuMikuDance是日本人樋口优所开发&#xff0c; 将VOCALOID2的初音未来等角色制作3D模组的免费软件。 简称为MMD。 汉化过程中 有同学反映 原来4.0 完全汉化版会出错 而不得不用回原版故这次 汉化仅汉化菜单部分 理论上不会出错如果是日文模式请选择ヘルプ(&H)-&…

收缩临时库 shrink tempdb

tempdb实际占用空间40mb,文件大小70G, 原始大小2GB 无法使用dbcc shrinkfile进行收缩. 看到的解决方案是 重启数据库DBCC FREESYSTEMCACHE (ALL) ,然后再收缩.http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/7b45f0de-2aa3-4de0-930b-d9d0fe931b3a http…

H5如何测试?

它跟安卓APP与IOS APP有什么样的区别呢&#xff1f;★ 我们以往的APP是使用原生系统内核的&#xff0c;相当于直接在系统上操作&#xff0c;是我们传统意义上的软件&#xff0c;更加稳定★ H5的APP先得调用系统的浏览器内核&#xff0c;相当于是在网页中进行操作&#xff0c;较…

二维数组练习--矩阵的加法和乘法

数组的练习示例展示&#xff1a; package arrayList; /*** 矩阵的集中运算法则&#xff1a;求和&#xff0c;求积&#xff0c;求逆矩阵&#xff0c;转置矩阵......* author Drew**/ public class Arrays {/*** 两个二维数组&#xff08;矩阵&#xff09;求和。* param a 矩阵&a…

文件分享微信小程序的设计与开发 Java开发微信小程序 毕业设计

目录 使用的技术 2、功能介绍 3、此小程序未部署 所以体验不了 4、如何联系我或需要源码进行联系 使用的技术 SpringbootMybatisMysql 微信小程序Mpvue 1、小程序展示 后台管理 2、功能介绍 用户第一次使用小程序 用户授权上传视频和图片设置密码和有效期分享给微信好友…

Silverlight 3发布新版3.0.50106.0

微软1月19日发布Silverlight 3新版本3.0.50106.0.该版本主要修复以下几个问题&#xff1a;问题一&#xff1a; 当使用图形硬件加速功能&#xff08;GPU&#xff09;的时候&#xff0c;如果GPU驱动报错&#xff0c;Silverlight 3应用将不再正确显示内容。该问题是因为Silverligh…

递归该怎么写(二)

对于简单的递归&#xff08;可以写出数学表达式的递归&#xff09;&#xff0c;我们已经熟练掌握&#xff0c;但是对于有些递归我们有时候无从下手。这时候我们需要将抽象的问题数学化&#xff0c;或者能表达出来。 &#xff08;本节需要掌握&#xff1a; 熟悉递归函数的返回是…

chrome 浏览器打开静态html 获取json文件失败 解决方法

如图加&#xff1a; --allow-file-access-from-files

个人站立会议6

昨天做&#xff1a; 软件的出租功能部分 遇到问题&#xff1a; jsp 与数据库的连接 解决方法&#xff1a;查找资料&#xff0c;向他人请教。 今天做&#xff1a; 软件的出租功能部分。转载于:https://www.cnblogs.com/luohaochi/p/8092589.html

IIS配置跨服务器迁移

这几天&#xff0c;因为服务器要重装&#xff0c;要将此服务器的IIS网站搬到别一台服务器&#xff0c;因运行在此服务器上的站点有200多&#xff0c;不可能手动去重新设置&#xff0c;在网上找了一些迁移的工具&#xff0c;效果不理想&#xff0c;仔细研究IIS后&#xff0c;终天…

Express4.x API (四):Router (译)

Express4.x API 译文 系列文章 Express4.x API (一)&#xff1a;application (译) -- 完成Express4.x API (二)&#xff1a;request (译) -- 完成Express4.x API (三)&#xff1a;Response (译) -- 完成Express4.x API (四)&#xff1a;router (译) -- 完成已经完成了Express4.…

JavaScript(转载)

正则表达式用于字符串处理&#xff0c;表单验证等场合&#xff0c;实用高效&#xff0c;但用到时总是不太把握&#xff0c;以致往往要上网查一番。我将一些常用的表达式收藏在这里&#xff0c;作备忘之用。 匹配中文字符的正则表达式&#xff1a; [\u4e00-\u9fa5]匹配双字节字符…

复杂JSON参数传递后台处理方式

如图 或者使用 requestBoby 注解

shift()函数

用于对dataframe中的数整体上移或下移&#xff0c; 当为正数时&#xff0c;向下移。 当为负数时&#xff0c;向上移。 缺少的会填充NaN 参考&#xff1a; https://blog.csdn.net/kizgel/article/details/78333833 转载于:https://www.cnblogs.com/xxswkl/p/10831152.html

linux系统管理学习笔记之三----软件的安装

linux系统管理学习笔记之三----软件的安装 2009-12-29 19:10:02标签&#xff1a;linux 系统管理    [推送到技术圈] 版权声明&#xff1a;原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。htt…

Vue+element UI实现“回到顶部”按钮组件

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/caomage/article/details/85006973 背景 开发框架是vuewebpackelement-ui&#xff0c;需要一个回到顶部的通用组件。 开发 HTML部分 code&#xff1a; <template><t…

根据xml 文件生成 xsd文件 以及相关测试方法

1、下载trang.jar 下载地址&#xff1a; http://www.java2s.com/Code/Jar/t/Downloadtrang20091111jar.htm 2、用法介绍 将trang.jar 包 和xml 文件放到同一个目录下 执行以下命令 java -jar trang.jar a.xml a.xsd 3、测试类 public class CheckXML {public static voi…