使用Python抓取网站数据时的性能问题

2024-06-16 11:06:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python从一个包含大约4000个页面的网站中删除数据,每个页面包含25个链接。在

我的问题是,在处理了大约200个页面之后,性能变得如此糟糕,甚至连我电脑上的其他程序都冻结了。在

我想是因为我没有正确的记忆或者类似的东西。如果有人能帮我解决这个问题,让我的脚本运行得更流畅,对我的系统要求更低,我将不胜感激。在

提前谢谢你的帮助。:)

编辑: 我找到了答案,你可以在我给你的答案中找到,当你向下滚动一点。感谢所有帮助我的人,特别是埃特纳和沃尔特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

Tags: 答案fromimportreturndefpagefunction页面
1条回答
网友
1楼 · 发布于 2024-06-16 11:06:35

我终于找到了解决办法。问题是我认为我使用的是字符串列表作为树.xpath,但实际上是一个_ElementUnicodeResult-Objects的列表阻止GC清除内存,因为它们包含对其父对象的引用。在

因此,解决方案是将这些ElementUnicodeResult-Objects转换成一个普通字符串,以消除引用。在

以下是帮助我理解问题的来源:http://lxml.de/api/lxml.etree._ElementTree-class.html#xpath

对于所提供的代码,以下内容将其修复:

而不是:

urls.extend(parsePageUrls(page))

必须是:

^{pr2}$

相关问题 更多 >