如何减少请求数量并仅使用一个?

时间:2019-03-02 18:57:26

标签: python-3.x beautifulsoup python-requests

我的程序这样做:

  1. 从我的网站获取XML
  2. 运行所有URL
  3. 通过请求从我的网页获取数据(SKU,名称,标题,价格等)
  4. 通过将具有相同SKU的价格与请求进行比较,以从其他网站获得最低价格。

我在每个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的请求或连接数-并在整个程序中使用一个请求或一个连接?

1 个答案:

答案 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将在您每次运行程序时清除。

但是,如果这是较大程序的一部分,则需要定期“过期”缓存,否则每次都会得到相同的结果。