使用 Python 抓取网站数据时出现性能问题
Performance issues while scraping website data with Python
我正尝试使用 Python 从一个包含大约 4000 个页面的网站中抓取数据,每页包含 25 个链接。
我的问题是,在处理了大约 200 个页面后,性能变得非常糟糕,甚至我计算机上的其他程序都冻结了。
我想这是我没有正确使用内存或类似的东西。如果有人可以帮助我解决这个问题,让我的脚本 运行 更流畅并且对我的系统要求更低,我将不胜感激。
在此先感谢您的帮助。 :)
编辑:
我找到了解决方案,您可以在向下滚动时在我给出的答案中找到它。感谢所有试图帮助我的人,尤其是 etna 和 Walter A,他们为我提供了很好的建议让我走上正轨。 :)
from pprint import pprint
from lxml import etree
import itertools
import requests
def function parsePageUrls(page):
return page.xpath('//span[@class="tip"]/a/@href')
def function isLastPage(page):
if not page.xpath('//a[@rel="next"]'):
return True
urls = []
for i in itertools.count(1):
content = requests.get('http://www.example.com/index.php?page=' + str(i), allow_redirects=False)
page = etree.HTML(content.text)
urls.extend(parsePageUrls(page))
if isLastPage(page):
break
pprint urls
我终于找到了解决办法。问题是我认为我使用字符串列表作为 return 值 tree.xpath,但它是阻止 GC 清除内存的 _ElementUnicodeResult-Objects 列表,因为他们提到了他们的 parent.
所以解决办法是将这些_ElementUnicodeResult-Objects转换成普通字符串,去掉引用。
这是帮助我理解问题的来源:http://lxml.de/api/lxml.etree._ElementTree-class.html#xpath
至于提供的代码,以下修复了它:
而不是:
urls.extend(parsePageUrls(page))
必须是:
for url in parsePageUrls(page):
urls.append(str(url))
我正尝试使用 Python 从一个包含大约 4000 个页面的网站中抓取数据,每页包含 25 个链接。
我的问题是,在处理了大约 200 个页面后,性能变得非常糟糕,甚至我计算机上的其他程序都冻结了。
我想这是我没有正确使用内存或类似的东西。如果有人可以帮助我解决这个问题,让我的脚本 运行 更流畅并且对我的系统要求更低,我将不胜感激。
在此先感谢您的帮助。 :)
编辑: 我找到了解决方案,您可以在向下滚动时在我给出的答案中找到它。感谢所有试图帮助我的人,尤其是 etna 和 Walter A,他们为我提供了很好的建议让我走上正轨。 :)
from pprint import pprint
from lxml import etree
import itertools
import requests
def function parsePageUrls(page):
return page.xpath('//span[@class="tip"]/a/@href')
def function isLastPage(page):
if not page.xpath('//a[@rel="next"]'):
return True
urls = []
for i in itertools.count(1):
content = requests.get('http://www.example.com/index.php?page=' + str(i), allow_redirects=False)
page = etree.HTML(content.text)
urls.extend(parsePageUrls(page))
if isLastPage(page):
break
pprint urls
我终于找到了解决办法。问题是我认为我使用字符串列表作为 return 值 tree.xpath,但它是阻止 GC 清除内存的 _ElementUnicodeResult-Objects 列表,因为他们提到了他们的 parent.
所以解决办法是将这些_ElementUnicodeResult-Objects转换成普通字符串,去掉引用。
这是帮助我理解问题的来源:http://lxml.de/api/lxml.etree._ElementTree-class.html#xpath
至于提供的代码,以下修复了它:
而不是:
urls.extend(parsePageUrls(page))
必须是:
for url in parsePageUrls(page):
urls.append(str(url))