首页 > 解决方案 > 如何减少请求数量并仅使用一个?

问题描述

我的程序这样做:

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

标签: python-3.xbeautifulsouppython-requests

解决方案


我假设这是一个脚本,其中包含您按特定顺序调用的一组方法。如果是这样,这是一个很好的用例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每次运行程序时都会清除。

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


推荐阅读