簡體   English   中英

加速HTTP請求python和500錯誤

[英]speed up a HTTP request python and 500 error

我有一個代碼,使用查詢和時間范圍(可能長達一年)從本報檢索新聞結果。

結果每頁最多分10篇文章,因為我找不到增加它的方法,我發出每個頁面的請求,然后檢索每篇文章的標題,網址和日期。 每個周期(HTTP請求和解析)需要30秒到一分鍾,這非常慢。 最終它將以500的響應代碼停止。我想知道是否有辦法加速它或者可能一次發出多個請求。 我只是想在所有頁面中檢索文章的詳細信息。 這是代碼:

    import requests
    import re
    from bs4 import BeautifulSoup
    import csv

    URL = 'http://www.gulf-times.com/AdvanceSearchNews.aspx?Pageindex={index}&keywordtitle={query}&keywordbrief={query}&keywordbody={query}&category=&timeframe=&datefrom={datefrom}&dateTo={dateto}&isTimeFrame=0'


    def run(**params):
        countryFile = open("EgyptDaybyDay.csv","a")
        i=1
        results = True
        while results:
                    params["index"]=str(i)
                    response = requests.get(URL.format(**params))
                    print response.status_code
                    htmlFile = BeautifulSoup(response.content)
                    articles = htmlFile.findAll("div", { "class" : "newslist" })

                    for article in articles:
                                url =  (article.a['href']).encode('utf-8','ignore')
                                title = (article.img['alt']).encode('utf-8','ignore')
                                dateline = article.find("div",{"class": "floatright"})
                                m = re.search("([0-9]{2}\-[0-9]{2}\-[0-9]{4})", dateline.string)
                                date =  m.group(1)
                                w = csv.writer(countryFile,delimiter=',',quotechar='|', quoting=csv.QUOTE_MINIMAL)
                                w.writerow((date, title, url ))

                    if not articles:
                                results = False
                    i+=1
        countryFile.close()


    run(query="Egypt", datefrom="12-01-2010", dateto="12-01-2011")

最可能減速的是服務器,因此並行化http請求將是使代碼運行更快的最佳方式,盡管您可以做的很少,以加快服務器響應。 有一個很好的教程在IBM完成這個

這是嘗試gevent的好機會。

您應該為request.get部分設置一個單獨的例程,以便您的應用程序不必等待IO阻塞。

然后,您可以生成多個工作人員並擁有隊列來傳遞請求和文章。 也許類似的東西:

import gevent.monkey
from gevent.queue import Queue
from gevent import sleep
gevent.monkey.patch_all()

MAX_REQUESTS = 10

requests = Queue(MAX_REQUESTS)
articles = Queue()

mock_responses = range(100)
mock_responses.reverse()

def request():
    print "worker started"
    while True:
        print "request %s" % requests.get()
        sleep(1)

        try:
            articles.put('article response %s' % mock_responses.pop())
        except IndexError:
            articles.put(StopIteration)
            break

def run():
    print "run"

    i = 1
    while True:
        requests.put(i)
        i += 1

if __name__ == '__main__':
    for worker in range(MAX_REQUESTS):
        gevent.spawn(request)

    gevent.spawn(run)
    for article in articles:
        print "Got article: %s" % article

在我看來,你正在尋找一個報紙沒有做廣告的飼料。 然而,這是一個以前已經解決的問題 - 有許多網站會為您為任意網站生成供稿,從而至少解決您的一個問題。 其中一些需要一些人為指導,而另一些則需要更少的調整機會,而且更自動。

如果你完全可以避免分頁和解析自己,我會推薦它。 如果你不能,我第二次使用gevent來簡化。 也就是說,如果他們將你送回500,你的代碼可能不是一個問題,增加並行性可能無濟於事。

您可以嘗試異步進行所有調用。

看看這個: http//pythonquirks.blogspot.in/2011/04/twisted-asynchronous-http-request.html

你也可以使用gevent而不是扭曲,但只是告訴你選項。

這很可能接近你正在尋找的東西。

通過Python發送多個HTTP請求的理想方法? [重復]

源代碼: https//github.com/kennethreitz/grequests

暫無
暫無

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

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