当 运行 第 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-A
、COL-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')
我会更详细地解释目标, 该脚本的重点是检查供应商网站 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-A
、COL-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')