大概有70%的机会显示错误:
bool check(string to_be_Searched,string search_here)
{
for(int i=0,j=0;j<to_be_searched.length() && i<search_here.length();i++)
{
if(to_be_Searched[j]==search_here[i])
j++;
}
return j==to_be_searched.length();
}
不知道为什么,如果数据少于100,只有5%的机会显示该消息。任何人都知道如何改进?
res=pool.map(feng,urls)
File "c:\Python27\lib\multiprocessing\pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "c:\Python27\lib\multiprocessing\pool.py", line 567, in get
raise self._value
IndexError: list index out of range
stackoverflow:正文不能包含&#34;`pool ma p&#34;。 将其更改为res = pool.map4(feng,urls) 我试图通过多处理从这个网站获得一些子字符串。
答案 0 :(得分:0)
实际上,multiprocessing
使调试有点困难,因为您没有看到index out of bound
错误发生的位置(错误消息使其看起来好像发生在multiprocessing
内部}模块)。
在某些情况下,这一行:
content=str(soupout[1])
引发index out of bound
,因为羹是一个空列表。如果将其更改为
if len(soupout) == 0:
return None
然后删除通过更改
返回的None
res=pool.map(feng,urls)
到
res = pool.map(feng,urls)
res = [r for r in res if r is not None]
然后你可以避免错误。那就是说。您可能想要找出re.findall
返回空列表的根本原因。选择具有beatifulsoup
的节点比使用正则表达式更好,因为通常与bs4
匹配更稳定,特别是如果网站略微更改其标记(例如空格等)
<强>更新强>:
为什么
soupout
是一个空列表?当我没有使用pool.map
时,我从未显示此错误消息
这可能是因为您过快地敲击了Web服务器。在评论中,您提到您有时会在504
中获得response.status_code
。 504表示Gateway Time-out: The server was acting as a gateway or proxy and did not receive a timely response from the upstream server
这是因为haoshiwen.org似乎是由kangle驱动的,这是一个反向代理。现在,反向代理处理您发送给后面的Web服务器的所有请求,如果您现在启动太多进程,那么糟糕的Web服务器无法处理泛滥。 Kangle has a default timeout of 60s所以,一旦他在60秒内没有从网络服务器回复,他就会显示你发布的错误。
你如何解决这个问题?
pool=multiprocessing.Pool(2)
,您需要使用大量流程feng(url)
的顶部,您可以添加time.sleep(5)
,以便每个进程在每个请求之间等待5秒。在这里你还需要玩弄睡眠时间。