我有一个代码,可以使用查询和时间范围(最长可达一年)从此newspaper检索新闻结果。
结果每页分页最多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")
答案 0 :(得分:1)
最可能减慢的是服务器,因此并行化http请求将是使代码运行更快的最佳方式,尽管您可以做的很少,以加快服务器响应。在IBM处有一个很好的教程来完成这个
答案 1 :(得分:1)
这是试用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
答案 2 :(得分:0)
在我看来,你正在寻找一份报纸,该报纸没有做广告。然而,这是一个以前已经解决的问题 - 有许多网站会为您为任意网站生成供稿,从而至少解决您的一个问题。其中一些需要一些人为指导,而另一些则需要更少的调整机会,而且更自动。
如果你完全可以避免分页并解析自己,我会推荐它。如果你不能,我为了简单起见,我使用gevent
。也就是说,如果他们将你送回500,你的代码可能不是一个问题,增加并行性可能无济于事。
答案 3 :(得分:0)
您可以尝试异步拨打所有电话。
看看这个: http://pythonquirks.blogspot.in/2011/04/twisted-asynchronous-http-request.html
你也可以使用gevent而不是扭曲但只是告诉你选项。
答案 4 :(得分:0)