- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章基于python分布式爬虫并解决假死的问题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
python版本:3.5.4 。
系统:win10 x64 。
放函数只需要两个参数即可下载相应内容到本地,一个是网址,一个是保存位置 。
1
2
3
4
|
import
urllib.request
url
=
'http://xxx.com/xxx.mp4'
file
=
'xxx.mp4'
urllib.request.retrieve(url,
file
)
|
但是博主在使用过程中发现,该函数没有timeout方法。使用时,可能由于网络问题导致假死! 。
使用方法如下:
1
2
3
4
5
6
7
|
import
urllib.request
url
=
'http://xxx.com/xxx.mp4'
file
=
'xxx.mp4'
response
=
urllib.request.urlopen(url, timeout
=
5
)
data
=
response.read()
with
open
(
file
,
'wb'
) as video:
video.write(data)
|
此函数有timeout设置,可以避免假死.
伪代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
import
urllib.request
import
socket
from
urllib
import
error
from
queue
import
Queue
from
threading
import
Thread
import
os
class
DownloadWorker(Thread):
#定义一个类,继承自thread类,重写其run函数
def
__init__(
self
, queue):
Thread.__init__(
self
)
self
.queue
=
queue
#标准的多线程实现方法都使用了queue
def
run(
self
):
while
True
:
link,
file
=
self
.queue.get()
#从队列中获取一组网址以及对应的保存位置
try
:
#使用try except方法进行各种异常处理
response
=
urllib.request.urlopen(link, timeout
=
5
)
data
=
response.read()
with
open
(
file
,
'wb'
) as video:
video.write(data)
except
error.HTTPError as err:
print
(
'HTTPerror, code: %s'
%
err.code)
except
error.URLError as err:
print
(
'URLerror, reason: %s'
%
err.reason)
except
socket.timeout:
print
(
'Time Out!'
)
except
:
print
(
'Unkown Error!'
)
self
.queue.task_done()
#标记队列中的一个元素已经被处理
def
main():
queue
=
Queue()
#定义队列
for
x
in
range
(
8
):
#开启8个线程
worker
=
DownloadWorker(queue)
worker.daemon
=
True
worker.start()
for
lineData
in
txtData:
#向队列中放入数据
link
=
lineData[
0
]
file
=
lineData[
1
]
queue.put((link,
file
))
queue.join()
#等待队列中的数据被处理完毕
if
__name__
=
=
'__main__'
:
main()
|
补充:基于python的一个大规模爬虫遇到的一些问题总结 。
前些天在某个论坛看到一些很感兴趣的信息,想要将其爬取下来,预估了下规模,想要做的是:将整个论坛的所有文章爬取下来,保存为本地的txt.
一开始写了个爬虫,大致思路是:
先从论坛的起始页开始爬起,得到所有分区版面的网址 。
然后从分区版面得到该区总共的页码数,根据网址规律得到分区版面所有页数的网页 。
从上面的分区版面的某一页的网页中得到该页所有文章的网址,然后抓取这些文章,保存为本地txt 。
上面的思路是典型的自上而下的思路,这样第一版本的代码就写好了.
下面进入正题,总结一下遇到的问题:
上面的爬虫在调试阶段表现还是不错的,后来实测中,跑起来发现,跑了一段时间后就会发生http错误,由于使用的是有线网,且检查后不是网络本身的错误,所以判定为本网站封禁了,于是开始研究这个问题.
一般来说,python爬虫将自己伪装为浏览器时,使用的方法是在urllib2.Request函数中加入headers参数,也即类似于 。
1
|
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"
|
的user_agent代码片段,但是这样在大规模爬取中,就会被网站判定为一个用于长期快速访问,容易被封禁。本来在开始的代码中,爬虫访问两个网页之间是加入了0.5s的时间延时,就是为了防止这一问题的,结果还是不可以,而如果将延时加大,将会影响到爬虫的效率,而且如此大规模的爬取更是不知要何时才能结束.
于是,考虑伪装成多个浏览器的访问的方法来解决这一问题,具体做的就是,找许多user_agent,保存为一个列表,而在访问网页时,轮流使用以上user_agent,这样就伪装成了许多浏览器。附上具体子函数如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
user_agent_list
=
[
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"
,
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11"
,
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6"
,
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6"
,
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1"
,
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5"
,
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5"
,
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3"
,
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3"
,
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3"
,
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3"
,
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3"
,
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3"
,
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3"
,
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3"
,
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3"
,
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
,
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0 Zune 3.0)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET CLR 4.0.20402; MS-RTC LM 8)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET CLR 1.1.4322; InfoPath.2)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET CLR 3.0.04506; Media Center PC 5.0; SLCC1)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; .NET CLR 3.0.04506; Media Center PC 5.0; SLCC1)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; FDM; Tablet PC 2.0; .NET CLR 4.0.20506; OfficeLiveConnector.1.4; OfficeLivePatch.1.3)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET CLR 3.0.04506; Media Center PC 5.0; SLCC1; Tablet PC 2.0)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET CLR 1.1.4322; InfoPath.2)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.3029; Media Center PC 6.0; Tablet PC 2.0)'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; Media Center PC 3.0; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; FDM; .NET CLR 1.1.4322)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; Alexa Toolbar; .NET CLR 2.0.50727)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; Alexa Toolbar)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.40607)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322)'
,
'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.0.3705; Media Center PC 3.1; Alexa Toolbar; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'
,
'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)'
,
'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; el-GR)'
,
'Mozilla/5.0 (MSIE 7.0; Macintosh; U; SunOS; X11; gu; SV1; InfoPath.2; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)'
,
'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; c .NET CLR 3.0.04506; .NET CLR 3.5.30707; InfoPath.1; el-GR)'
,
'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; c .NET CLR 3.0.04506; .NET CLR 3.5.30707; InfoPath.1; el-GR)'
,
'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; fr-FR)'
,
'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US)'
,
'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.2; WOW64; .NET CLR 2.0.50727)'
,
'Mozilla/4.79 [en] (compatible; MSIE 7.0; Windows NT 5.0; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)'
,
'Mozilla/4.0 (Windows; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)'
,
'Mozilla/4.0 (Mozilla/4.0; MSIE 7.0; Windows NT 5.1; FDM; SV1; .NET CLR 3.0.04506.30)'
,
'Mozilla/4.0 (Mozilla/4.0; MSIE 7.0; Windows NT 5.1; FDM; SV1)'
,
'Mozilla/4.0 (compatible;MSIE 7.0;Windows NT 6.0)'
,
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'
,
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0;)'
,
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; YPC 3.2.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; .NET CLR 3.5.30729; .NET CLR 3.0.30618)'
,
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; YPC 3.2.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506)'
,
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; Media Center PC 5.0; .NET CLR 2.0.50727)'
,
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 3.0.04506)'
,
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; .NET CLR 3.5.30729; .NET CLR 3.0.30618; .NET CLR 1.1.4322)'
,
]
|
上面大概有60多个user_agent,这样就伪装成了60多个浏览器。尝试这种方法后,发现在此长时间爬取,出错或者访问速度变慢的情况就很少出现了,基本解决了这一问题.
但是,需要注意的是,如果网站不是根据user_agent,而是根据用户的IP来封禁的话,那就不好办了,网上的一些解决办法是云计算之类的,貌似略麻烦,不太适合个人用户,有兴趣的可以看一下相关资料.
由于规模略大,不可能一直守在电脑前,所以,代码的稳定性(容错性)需要较高,这里,python的try……except……语法就发挥了很好的作用.
前几天的实践证明,出错大多数是由于一时的网络不稳定而出现的,而解决办法也很简单,重新访问以下就好了,于是将抓取网页的函数写成下面的形式 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
def
get_page_first(url):
global
user_agent_index
user_agent_index
+
=
1
user_agent_index
%
=
len
(user_agent_list)
user_agent
=
user_agent_list[user_agent_index]
#print user_agent
print
user_agent_index
headers
=
{
'User-Agent'
: user_agent }
print
u
"正在抓取"
+
url
req
=
urllib2.Request(url,headers
=
headers)
try
:
response
=
urllib2.urlopen(req,timeout
=
30
)
page
=
response.read()
except
:
response
=
urllib2.urlopen(req,timeout
=
30
)
page
=
response.read()
print
u
"抓取网页"
+
url
return
page
|
这里,如果访问一个网页30s无响应,就重新访问。基本解决了这一问题.
由于txt的命名采用的是 “日期--作者——标题”的形式,而一些帖子的标题含有诸如?等txt中不允许出现的命名,这样就会发生报错。这里解决办法是,如果保存文件出错,则先尝试将名称改为“日期--作者——编号”形式,仍然出错,而保存为“日期--编号”的形式。具体代码如下:
1
2
3
4
5
6
7
8
9
10
|
try
:
if
news_author[
0
]
=
=
'':
save_file(path
+
'//'
+
news_time[
0
]
+
'--'
+
news_title
+
'.txt'
,news)
else
:
save_file(path
+
'//'
+
news_time[
0
]
+
'--'
+
news_author[
0
]
+
u
"——"
+
news_title
+
'.txt'
,news)
except
:
try
:
save_file(path
+
'//'
+
news_time[
0
]
+
'--'
+
news_title
+
'.txt'
,news)
except
:
save_file(path
+
'//'
+
news_time[
0
]
+
'--'
+
str
(j)
+
'-'
+
str
(index)
+
'.txt'
,news)
|
开始的代码考虑不周,没有想到同一天的帖子中会出现作者和名称都相同的情况,于是后来发现一些版面的总文章数和保存的txt数目不同,后来发现了这一问题。于是将保存文件的子函数修改如下,大致思路就是保存前先检查同名文件是否存在,不存在直接保存;存在的话,在名称后加(i)(i从1开始递增变化),重复上述步骤,直至同名文件不存在:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
def
save_file(path,inf):
if
not
os.path.exists(path):
f
=
file
(path,
'w'
)
f.write(inf)
f.close
else
:
i
=
0
while
(
1
):
i
+
=
1
tpath
=
path[:
-
4
]
tpath
+
=
'('
+
str
(i)
+
')'
+
'.txt'
if
not
os.path.exists(tpath):
break
f
=
file
(tpath,
'w'
)
f.write(inf)
f.close
|
理论上,大规模的爬虫可以采用多线程的方法加快抓取速度,但是考虑到不要对网站造成过大的压力,也为避免被网站封禁IP,所以主程序中未引入多线程的概念。但是又为了加快进度,就手动打开多个命令行窗口运行爬虫,来同时抓取不同的版面的文章。这样,当一个程序报错,其他的仍然能运行,也是增强了程序的容错性.
实际运行一段时间后,发现该程序的时间延迟最主要是发生在抓取网页的环节,也就是下载网页的时间上,想要提高效率也就是需要改善这一环节。当我正考虑应该采用什么办法解决这一问题时,忽然发现,原来该论坛还提供了无图版的网页(也就是类似于手机版),这样,每个网页的大小就减小了很多,而且文章内容之类所需信息仍然存在,所以就重新修改了代码。然后,发现速度确实有了极大的提升。所以,以后 抓取网页前一定要先看看是否存在类似于无图版(手机版)的网页,这样就可以很大的提高速度.
经过后期一些完善,该代码基本上已经能够连续运行好几天而不出错了,稳定性基本解决了,而且没有漏抓的现象。经过大致十几天日夜兼程,终于抓完了.
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.
原文链接:https://blog.csdn.net/u013832707/article/details/81476609 。
最后此篇关于基于python分布式爬虫并解决假死的问题的文章就讲到这里了,如果你想了解更多关于基于python分布式爬虫并解决假死的问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
@Cacheable在同一类中方法调用无效 上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoom()方法,这样即便标识了Cacheable标签,
目录 @Transaction注解导致动态切换更改数据库失效 使用场景 遇到问题 解决 @Transaction
@RequestBody不能class类型匹配 在首次第一次尝试使用@RequestBody注解 开始加载字符串使用post提交(貌似只能post),加Json数据格式传输的时候,
目录 @Autowired注入static接口问题 @Autowired自动注入普通service很方便 但是如果注入static修饰的serv
目录 @RequestBody部分属性丢失 问题描述 JavaBean实现 Controller实现
目录 解决@PathVariable参数接收不完整的问题 今天遇到的问题是: 解决办法: @PathVariable接受的参
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚。后来终于找到了原因。 如果你也出现了这种情况,可以从下面开始排查。 1、特性 先来了解一下@Trans
概述: ? 1
场景: 在处理定时任务时,由于这几个方法都是静态方法,在aop的切面中使用@Around注解,进行监控方法调用是否有异常。 发现aop没有生效。 代码如下:
最近做项目的时候 用户提出要上传大图片 一张图片有可能十几兆 本来用的第三方的上传控件 有限制图片上传大小的设置 以前设置的是2M&nb
我已经实现了这个SCIM reference code在我们的应用程序中。 我实现的代码确实通过了此postman link中存在的所有用户测试集合。 。我的 SCIM Api 也被 Azure 接受
我一直对“然后”不被等待的行为感到困扰,我明白其原因。然而,我仍然需要绕过它。这是我的用例。 doWork(family) { return doWork1(family)
我正在尝试查找 channel 中的消息是否仍然存在,但是,我不确定如何解决 promise ,查看其他答案和文档,我可以看到它可能是通过函数实现的,但我是不完全确定如何去做。我希望能在这方面获得一些
我有以下情况: 同一工作区中的 2 个 Eclipse 项目:Apa 和 Bepa(为简洁起见,使用化名)。 Apa 项目引用(包括)Bepa 项目。 我在 Bepa 有一个类 X,具有公共(publ
这个问题已经有答案了: Why am I getting a NoClassDefFoundError in Java? (31 个回答) 已关闭 6 年前。 我正在努力学习 spring。所以我输入
我正在写一个小游戏,屏幕上有许多圆圈在移动。 我在两个线程中管理圈子,如下所示: public void run() { int stepCount = 0; int dx;
我在使用 Sympy 求解方程时遇到问题。当我运行代码时,例如: 打印(校正(10)) 我希望它打印一个数字 f。相反,它给我错误:执行中止。 def correction(r): from
好吧,我制作的每个页面都有这个问题。我不确定我做错了什么,但我所有的页面都不适用于所有分辨率。可能是因为我使用的是宽屏?大声笑我不确定,但在小于宽屏分辨率的情况下,它永远不会看起来正确。它的某些部分你
我正在尝试像这样进行一个非常简单的文化 srting 检查 if(culture.ToUpper() == "ES-ES" || "IT-IT") { //do something } else
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗?Upda
我是一名优秀的程序员,十分优秀!