python-3.x - 如何减少请求数量并仅使用一个?
问题描述
我的程序这样做:
- 从我的网站获取 XML
- 运行所有 URL
- 通过请求从我的网页(SKU、名称、标题、价格等)获取数据
- 通过将相同 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 的请求或连接数 - 并在整个程序中使用一个请求或一个连接?
解决方案
我假设这是一个脚本,其中包含您按特定顺序调用的一组方法。如果是这样,这是一个很好的用例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
每次运行程序时都会清除。
但是,如果这是一个较大程序的一部分,您会希望定期“使”缓存“过期”,否则每次都会得到相同的结果。
推荐阅读
- node.js - 如何使用 click 和 waitForNavigation?
- video - android:以编程方式流式传输视频,优先考虑视频质量而不是文件压缩
- android - 冷启动:主机 gpu 已更改
- java - 如何避免使用 Java 生成 XML 中的额外空行?
- json - 如何使用 Angular 将选择选项绑定到 JSON 对象?
- javascript - 使用 API (Rails) 中的 Svelte 正确处理错误
- python - 如何在接收列表输入的函数中转换我的 for 循环以适应该列表输入并返回输出?
- c++ - 为什么 c++ openMP 程序执行时间更长
- javascript - 我正在尝试创建一个 JavaScript 程序,提示用户“输入是或否退出”
- reactjs - 结合 React 路由器和 Firebase 函数 api