我的程序这样做:
我在每个def上都使用大量请求:
def get_Price (SKU):
check ='https://www.XXX='+SKU
r = requests.get(check)
html = requests.get(r.url)
bsObj = BeautifulSoup(html.content,'html.parser')
return Price
def get_StoreName (SKU):
check ='https://XXX?keyword='+SKU
r = requests.get(check)
html = requests.get(r.url)
bsObj = BeautifulSoup(html.content,'html.parser')
return storeName
def get_h1Tag (u):
html = requests.get(u)
bsObj = BeautifulSoup(html.content,'xml')
h1 = bsObj.find('h1',attrs={'itemprop':'name'}).get_text()
return h1
如何减少URL的请求或连接数-并在整个程序中使用一个请求或一个连接?
答案 0 :(得分:2)
我假设这是一个脚本,其中包含按特定顺序调用的一组方法。
如果是这样,这对于dict
是一个很好的用例。我会写一个函数来记住对URL的调用。
然后您可以在其他功能中重复使用此功能:
requests_cache = {}
def get_url (url, format_parser):
if url not in requests_cache:
r = requests.get(url)
html = requests.get(r.url)
requests_cache[url] = BeautifulSoup(html.content, format_parser)
return requests_cache[url]
def get_Price (makat):
url = 'https://www.zap.co.il/search.aspx?keyword='+makat
bsObj = get_url(url, 'html.parser')
# your code to find the price
return zapPrice
def get_zapStoreName (makat):
url = 'https://www.zap.co.il/search.aspx?keyword='+makat
bsObj = get_url(url, 'html.parser')
# your code to find the store name
return storeName
def get_h1Tag (u):
bsObj = get_url(u, 'xml')
h1 = bsObj.find('h1',attrs={'itemprop':'name'}).get_text()
return h1
如果要避免使用全局变量,也可以将requests_cache
设置为get_url
的属性或定义中的默认参数。后者还允许您通过传递空的dict
来绕过缓存。
同样,这里的假设是您正在定期将此代码作为脚本运行。在这种情况下,requests_cache
将在您每次运行程序时清除。
但是,如果这是较大程序的一部分,则需要定期“过期”缓存,否则每次都会得到相同的结果。