如何在concurrent.futures

时间:2016-05-30 12:15:32

标签: python-3.x web-scraping timeout python-requests concurrent.futures

据我所知,我的代码工作得非常好 - 尽管对于经验丰富的眼睛看起来可能看起来有点简陋和粗糙。

目的:

创建一个'过滤器'循环通过(大)可能的ID号范围。每个ID都应尝试登录url网站。如果idvalid,则应将其保存到hit_list

问题:

在大型循环中,程序会挂起'无限期的。虽然我没有证据(没有抛出异常)但我怀疑这是一个timeout问题(或者更确切地说,如果指定了timeout

问题:

我想添加一个timeout - 然后处理timeout异常,以便我的程序停止挂起。如果这个理论错了,我也想听听我的问题是什么。

如何添加timeout这个问题之前已被提出过:Herehere,但在整个周末都在讨论这个问题之后,我仍然在失利。说实话,我不明白这些答案。

我尝试过的事情:

  1. 创建try& except功能阻止了id_filtertry位于r=s.get(url),异常位于函数末尾。我已经详细阅读了requests个文档,herehere。这没有用。
  2. 我对futures的了解越多,我就越能确信除了futures之外的错误,而不是requests(就像我上面所做的那样)。所以我尝试在timeout之后的括号中插入boss.map,但就我所知,这没有任何影响 - 无论如何它似乎太简单了。
  3. 所以,重申:

    对于大循环(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数据

0 个答案:

没有答案