使用Python进行web抓取时可能存在的瓶颈问题

使用Python进行web抓取时可能存在的瓶颈问题,python,selenium-webdriver,web-scraping,selenium-chromedriver,disqus,Python,Selenium Webdriver,Web Scraping,Selenium Chromedriver,Disqus,首先,我为这个模糊的标题道歉,但问题是我不确定是什么导致了这个错误 我正在使用Python从一个网站推断一些数据。 我创建的代码在一次传递一个链接时工作得很好,但在试图从我拥有的8000页中收集数据时,不知何故出现了中断(它实际上在以前中断了)。我需要做的过程是: 从一个页面收集所有链接(8000个链接) 从每个链接推断包含在iframe中的另一个链接 从2中的链接中删除日期 第1点很简单,效果很好。 第2点和第3点工作了一段时间,然后我得到一些错误。每一次都是在不同的点上,而且从来都不一样。在

首先,我为这个模糊的标题道歉,但问题是我不确定是什么导致了这个错误

我正在使用Python从一个网站推断一些数据。 我创建的代码在一次传递一个链接时工作得很好,但在试图从我拥有的8000页中收集数据时,不知何故出现了中断(它实际上在以前中断了)。我需要做的过程是:

  • 从一个页面收集所有链接(8000个链接)
  • 从每个链接推断包含在iframe中的另一个链接
  • 从2中的链接中删除日期
  • 第1点很简单,效果很好。 第2点和第3点工作了一段时间,然后我得到一些错误。每一次都是在不同的点上,而且从来都不一样。在一些测试之后,我决定尝试另一种方法,在1中的所有链接上运行代码直到第2点,首先尝试收集所有链接。在这一点上,我发现,可能,我在这个阶段得到了错误。 代码是这样工作的:在for循环中,我将URL列表的每一项传递给下面的函数。它应该搜索到Discus网站的链接。应该只有一个链接,而且总是有一个链接。因为对于lxml库,不可能在iframe内部进行扫描,所以我使用selenium和ChromeDriver

    def get_url(webpage_url):
        chrome_driver_path= '/Applications/chromedriver' 
        driver = webdriver.Chrome(chrome_driver_path) 
        driver.get(webpage_url)
        iframes=driver.find_elements_by_tag_name("iframe")
        list_urls=[]
        urls=[]
    
        # collects all the urls of all the iframe tags
        for iframe in iframes:
            driver.switch_to_frame(iframe)
            time.sleep(3)
            list_urls.append(driver.current_url)
            driver.switch_to_default_content()
        driver.quit()
    
        for item in list_urls:
            if item.startswith('http://disqus'):
                urls.append(item)
    
        if len(urls)>1:
            print "too many urls collected in iframes"
        else:
            url=urls[0]
    
        return url
    
    一开始没有时间睡觉,它工作了大约30个链接。然后我放了一个时间。睡眠(2)和它到达大约60。随着时间的推移,sleep(3)在130个链接上都能正常工作。当然,这不是一个解决方案。我现在得到的错误总是一样的(url=url[0]中的索引超出范围),但每次都使用不同的链接。如果我用一个断开的链接检查我的代码,代码就会工作,因此它可以在那里找到URL。当然,有时会传递一个链接,在该链接之前它就停止了,并且可以正常工作。 我怀疑我得到这个可能是因为超时,但我当然不确定

    那么,我如何理解这里的问题呢

    如果问题是它发出了太多的请求(即使是睡眠),我该如何处理


    谢谢。

    根据您对问题的描述,当您在给定时间内发出过多请求时,主机可能会限制您的客户端。这是针对DoS攻击和行为不端的机器人(如您的机器人)的常见保护

    这里干净的解决方案是检查站点是否有文件,如果有,解析它并遵守规则——否则,在两个请求之间设置足够长的等待时间,这样你就不会被踢

    此外,您还可能遇到很多其他问题—404、网络连接丢失等—甚至使用
    selenium.webdriver

    取决于多个因素,包括操作系统/浏览器组合, WebDriver可能等待页面加载,也可能不等待页面加载。在某些方面 在这种情况下,WebDriver可能会在页面关闭之前返回控件 已完成,甚至已开始加载。为了确保健壮性,您需要 使用Explicit and命令等待元素在页面中存在 隐式等待

    警告/你的索引器,你盲目地假设你至少会得到一个url(这意味着至少有一个iframe),这可能不是因为上述任何原因(以及其他一些原因)。首先,您要确保正确处理所有角落的情况,然后修复代码,这样您就不会假设您至少有一个url:

    url = None
    if len(urls) > 1:
        print "too many urls collected in iframes"
    elif len(urls) == 0:
        url = urls[0]
    else:
        print "no url found"
    
    此外,如果您只需要找到第一个url,则无需收集所有url,然后将其过滤掉,然后返回第一个url:

    def get_url(webpage_url):
        chrome_driver_path= '/Applications/chromedriver' 
        driver = webdriver.Chrome(chrome_driver_path) 
        driver.get(webpage_url)
        iframes=driver.find_elements_by_tag_name("iframe")
        # collects all the urls of all the iframe tags
        for iframe in iframes:
            driver.switch_to_frame(iframe)
            time.sleep(3)
            if driver.current_url.startswith('http;//disqus'):
                return driver.current_url 
            driver.switch_to_default_content()
        driver.quit()
        return None # nothing found