代码之家  ›  专栏  ›  技术社区  ›  Yuan

多线程爬虫在运行一段时间后速度越来越慢

  •  2
  • Yuan  · 技术社区  · 6 年前

    我在Windows下编写了一个多线程网络爬虫。我用过的图书馆 requests threading

    import requests, threading,queue
    req = requests.Session()
    
    urlQueue = queue.Queue()
    pageList = []
    urlList = [url1,url2,....url500]
    [urlQueue.put(i) for i in urlList]
    
    def parse(urlQueue):
    
        try:
           url = urlQueue.get_nowait()
        except:
           break
        try:
           page = req.get(url)
           pageList.append(page)
        except:
           continue
    
    if __name__ == '__main__':
    
        threadNum = 4
        threadList = []
        for i in threadNum:
            t = threading.Thread(target=(parse),args=(urlQueue,))
            threadList.append(t)
        for thread in threadList:
            thread.start()
        for thread in threadList:
            thread.join()
    

    1. netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    2. 找到了 TIME_WAIT 将近2瓦。因此,必须有许多TCP连接。
    3. 使用以下代码分别设置TCP的重用时间和回收时间: echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle

    这个答案似乎是正确的。这应该是一个网络问题。我应该如何在Windows下解决这个问题。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Yuan    6 年前

    多线程爬虫程序将耗尽TCP连接。我们需要设定 TcpTimedWaitDelay 快速重用和回收TCP连接。我们可以通过手动更改 regedit 或者输入密码。

    (您需要以管理员身份运行代码,否则将引发错误。 )

    import win32api,win32con
    
    key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, r'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters', 0, win32con.KEY_SET_VALUE)
    
    win32api.RegSetValueEx(key, 'TcpTimedWaitDelay', 0, win32con.REG_SZ, '30')
    
    win32api.RegCloseKey(key)
    

    如何在Windows上手动执行:

    1. RUN ,和类型 正则表达式
    2. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
    3. 点击 Edit - New - Expandable String Value
    4. 创建 TcpTimedWaitDelay延迟
    5. 渴望多线程爬虫。)

    感谢你们所有人对问题的贡献。这对很多人都有帮助。

    Reference site