簡體   English   中英

使用Python抓取網站數據時的性能問題

[英]Performance issues while scraping website data with Python

我正在嘗試從包含約4000頁(每頁25個鏈接)的網站上使用Python抓取數據。

我的問題是,在處理了大約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

我終於找到了解決方案。 問題是我以為我使用字符串列表作為tree.xpath的返回值,但是它是_ElementUnicodeResult-Objects的列表,阻止了GC清除內存,因為它們持有對其父代的引用。

因此,解決方案是將這些_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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM