我目前正在制作一个脚本,该脚本将添加到shopify平台上运行的电子商务网站上的购物车和结帐项目
我正在尝试通过在多个线程上运行add to cart方法来加快进程。我的添加到购物车功能如下所示:
def add_to_cart(keywords,size,session,quantity=1):
...
其中keywords是字符串列表,因此我们可以解析并找到正确的项目,session是来自请求模块的新会话。该函数首先解析站点地图,找到唯一的产品ID,然后向会话变量发送一个帖子请求,将所述项目添加到购物车。
但是,当我使用线程运行脚本将多个项目添加到购物车时,我只看到购物车中的一个项目。为什么这不起作用?我是否需要锁定+解锁会话变量并逐个发送POST请求?
这是我正在运行的代码:
from ATC import *
from checkout import *
import requests
import time
import threading
from bs4 import BeautifulSoup
session = requests.Session()
init = time.time()
t1 = threading.Thread(target=add_to_cart, args=(['carabiner', 'black'], 'one size', session, 1,))
t2 = threading.Thread(target=add_to_cart, args=(['drury', '8.2'], '8.2', session, 1,))
t1.start()
t2.start()
t1.join()
t2.join()
now = time.time()
print("Time Taken: " + str(format(now-init, '.3g')) + 's')
答案 0 :(得分:1)
根据我的经验,如果您同时使用多个购物车更改购买Shopify,则只会有一个更新。我的猜测是Shopify处理这样的购物车:
在时间0,我们有我们的初始购物车 - 称之为cart0
在时间t,我们提交n个同时添加/更新/更改购物车的请求
请求0:取cart0并申请请求,返回结果 请求1:获取cart0并申请请求,返回结果 ... 请求n:获取cart0并申请请求,返回结果
这似乎与我在同时测试多个请求时获得的购物车返回值一致 - 每个回调函数都会触发一个已应用单个更改的购物车。
我找到了两种方法来处理这种限制。第一个是确保请求被链接,以便我们在下一个请求之前等待一个请求完成 - 有效地将异步请求转换为同步请求。速度不是最好的。
另一种方法仅在我们没有令人担心的订单项属性时才有效:将所有添加/更改合并到一个/cart/update.js
调用中,同时传递变体ID和所需数量 - 请参阅{例如{3}}。如果您不需要担心线路属性,将单线路添加更改为一个大型更新将显着提高速度和可靠性。