据我所知,我的代码工作得非常好 - 尽管对于经验丰富的眼睛看起来可能看起来有点简陋和粗糙。
目的:
创建一个'过滤器'循环通过(大)可能的ID号范围。每个ID都应尝试登录url
网站。如果id
为valid
,则应将其保存到hit_list
。
问题:
在大型循环中,程序会挂起'无限期的。虽然我没有证据(没有抛出异常)但我怀疑这是一个timeout
问题(或者更确切地说,如果指定了timeout
)
问题:
我想添加一个timeout
- 然后处理timeout
异常,以便我的程序停止挂起。如果这个理论错了,我也想听听我的问题是什么。
如何添加timeout
这个问题之前已被提出过:Here和here,但在整个周末都在讨论这个问题之后,我仍然在失利。说实话,我不明白这些答案。
我尝试过的事情:
try
& except
功能阻止了id_filter
。 try
位于r=s.get(url)
,异常位于函数末尾。我已经详细阅读了requests
个文档,here和here。这没有用。futures
的了解越多,我就越能确信除了futures
之外的错误,而不是requests
(就像我上面所做的那样)。所以我尝试在timeout
之后的括号中插入boss.map
,但就我所知,这没有任何影响 - 无论如何它似乎太简单了。所以,重申:
对于大循环(50,000 +),我的程序往往会无限期地挂起(开始时没有确切的点,尽管通常在处理完90%的循环之后)。我不知道为什么,但怀疑添加timeout
会引发异常 - 我可以将其除外。然而,这个理论可能是错误的。我尝试添加timeout
并处理requests
部分中的其他错误,但不起作用。
-Python 3.5
我的代码:
import concurrent.futures as cf
import requests
from bs4 import BeautifulSoup
hit_list =[]
processed_list=[]
startrange= 100050000
end_range = 100150000
loop_size=range(startrange,end_range)
workers= 70 #
chunks= 300
url = 'https://ndber.seai.ie/pass/ber/search.aspx'
def id_filter(_range):
with requests.session() as s:
s.headers.update({
'user-agent': 'FOR MORE INFORMATION ABOUT THIS DATA COLLECTION PLEASE CONTACT ########'
})
r = s.get(url)
time.sleep(.1)
soup = BeautifulSoup(r.content, 'html.parser')
viewstate = soup.find('input', {'name': '__VIEWSTATE' }).get('value')
viewstategen = soup.find('input', {'name': '__VIEWSTATEGENERATOR' }).get('value')
validation = soup.find('input', {'name': '__EVENTVALIDATION' }).get('value')
for ber in _range:
data = {
'ctl00$DefaultContent$BERSearch$dfSearch$txtBERNumber': ber,
'ctl00$DefaultContent$BERSearch$dfSearch$Bottomsearch': 'Search',
'__VIEWSTATE' : viewstate,
'__VIEWSTATEGENERATOR' : viewstategen,
'__EVENTVALIDATION' : validation,
}
y = s.post(url, data=data)
if 'No results found' in y.text:
#print('Invalid ID', ber)
else:
hit_list.append(ber)
print('Valid ID',ber)
if __name__ == '__main__':
with cf.ThreadPoolExecutor(max_workers=workers) as boss:
jobs= [loop_size[x: x + chunks] for x in range(0, len(loop_size), chunks)]
boss.map(id_filter, jobs)
下面的#record数据