当 运行 第 1 列中的值循环(相同的 ROW 值)时,如何从第 2 列分配变量

How can I assign a variable from column 2 when running a loop of values in column 1 (same ROW value)

我会更详细地解释目标, 该脚本的重点是检查供应商网站 A 列中的(产品代码)值,如果该产品可用,则循环检查下一个值。

如果产品不在网站上,JSON PUT 请求将发送到将库存水平设置为 0 的其他销售网站。

问题是如何将同一 CSV 文件的 B 列中的值分配给 PUT 请求

CSV 文件

COL-A  COL-B
aaaaa  111
bbbbb  222
ccccc  333

这是我目前的代码

import scrapy
from scrapy.http import FormRequest
from scrapy.http import JsonRequest
from scrapy.http import Request
import pandas as pd
import requests
import bigcommerce

api = bigcommerce.api.BigcommerceApi(client_id='xxxxx', store_hash='zzzzz', access_token='11111')


def readcsv():
    df = pd.read_csv('data.csv')
    return df['COL-A'].values.tolist()


class datacheckSpider(scrapy.Spider):
    name = 'datacheck'
    start_urls = ['http://www.example.com/order/']


    def parse(self, response):
        for COL-A in readcsv():
            base_url = 'http://www.example.com/order/item={}'
            yield scrapy.Request(base_url.format(COL-A), callback=self.data)

    def data(self, response):
        if not response.xpath('//body[1]/div[1]/div[1]/div[4]/ul[1]/li[1]/div[1]/div[1]/div[1]/div[2]/div[2]/p[1]/text()').get():
            yield{
            api.Products.get(%SET_COL-B_VARIABLE_HERE%).update(inventory_level='0')}
        

如果您在 PUT 请求中手动设置来自 COL-B 的产品 ID,代码可以工作,但是我尝试将变量定义为与 COL-A 相同,但它没有工作

问题是我需要脚本在检查当前循环值编号时知道,CSV 文件中同一行的值是必需的,似乎 df.loc 可能有效,但我不确定如何对齐值

如果您有任何想法,请告诉我解决此问题的方法,因为我是 Scrapy 的初学者,Pandas 和 Python 总体上想学习。

来自scrapy的文档Passing additional data to callback functions, you basically want to pass the code to the data callback in Request’s cb_kwargs argument,

要获取所有代码,您可以迭代 (COL-A, COL-B) 对,而不仅仅是 COL-A 值。这里我们 return 二维 numpy 数组,因此是行列表,其中每一行都是 COL-ACOL-B 对:

def readcsv():
    df = pd.read_csv('data.csv')
    return df.values

然后在解析中您可以迭代这些对并将它们传递给下一个回调:

class datacheckSpider(scrapy.Spider):
    name = 'datacheck'
    start_urls = ['http://www.example.com/order/']

    def parse(self, response):
        base_url = 'http://www.example.com/order/item={}'
        for product_code, product_key in readcsv():
            scrapy.Request(base_url.format(product_code), callback=self.data, cb_kwargs={'product_key': product_key})

    def data(self, response, product_key):
        if not response.xpath('//body[1]/div[1]/div[1]/div[4]/ul[1]/li[1]/div[1]/div[1]/div[1]/div[2]/div[2]/p[1]/text()').get():
            yield api.Products.get(product_key).update(inventory_level='0')