使用Python进行web抓取时可能存在的瓶颈问题
首先,我为这个模糊的标题道歉,但问题是我不确定是什么导致了这个错误 我正在使用Python从一个网站推断一些数据。 我创建的代码在一次传递一个链接时工作得很好,但在试图从我拥有的8000页中收集数据时,不知何故出现了中断(它实际上在以前中断了)。我需要做的过程是:使用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点工作了一段时间,然后我得到一些错误。每一次都是在不同的点上,而且从来都不一样。在
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