python - 一个蜘蛛有 2 个不同的 URL 和 2 个使用 Scrapy 解析
问题描述
嗨,我有 2 个不同的域和 2 种不同的方法在一个蜘蛛中运行我已经尝试过这段代码,但没有任何想法吗?
class SalesitemSpiderSpider(scrapy.Spider):
name = 'salesitem_spider'
allowed_domains = ['www2.hm.com','www.forever21.com']
url = ['https://www.forever21.com/eu/shop/Catalog/GetProducts' , 'https://www2.hm.com/en_us/sale/shopbyproductladies/view-all.html?sort=stock&image-size=small&image=stillLife&offset=0&page-size=20']
#Json Payload code here
def start_requests(self):
for i in self.url:
if (i == 'https://www.forever21.com/eu/shop/Catalog/GetProducts'):
print("sample: " + i)
payload = self.payload.copy()
payload['page']['pageNo'] = 1
yield scrapy.Request(
i, method='POST', body=json.dumps(payload),
headers={'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/json; charset=UTF-8'},
callback=self.parse_2, meta={'pageNo': 1})
if (i == 'https://www2.hm.com/en_us/sale/shopbyproductladies/view-all.html?sort=stock&image-size=small&image=stillLife&offset=0&page-size=20'):
yield scrapy.Request(i, callback=self.parse_1)
def parse_1(self, response):
#Some code of getting item
def parse_2(self, response):
data = json.loads(response.text)
for product in data['CatalogProducts']:
item = GpdealsSpiderItem_f21()
#item yield
yield item
# simulate pagination if we are not at the end
if len(data['CatalogProducts']) == self.payload['page']['pageSize']:
payload = self.payload.copy()
payload['page']['pageNo'] = response.meta['pageNo'] + 1
yield scrapy.Request(
self.url, method='POST', body=json.dumps(payload),
headers={'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/json; charset=UTF-8'},
callback=self.parse_2, meta={'pageNo': payload['page']['pageNo']}
)
我只是总是有这个问题
NameError:名称'url'未定义
解决方案
你在同一个班级有两个不同的蜘蛛。为了可维护性,我建议您将它们保存在不同的文件中。
如果您真的想将它们放在一起,将网址分成两个列表会更容易:
type1_urls = ['https://www.forever21.com/eu/shop/Catalog/GetProducts', ]
type2_urls = ['https://www2.hm.com/en_us/sale/shopbyproductladies/view-all.html?sort=stock&image-size=small&image=stillLife&offset=0&page-size=20', ]
def start_requests(self):
for url in self.type1_urls:
payload = self.payload.copy()
yield Request(
# ...
callback=self.parse_1
)
for url in self.type2_urls:
yield scrapy.Request(url, callback=self.parse_2)
推荐阅读
- python-3.x - 如何在 tkinter 中刷新屏幕以显示新的标签文本?
- angular - 如何在样式规则中使用带有插值的 ngStyle
- mysql - 如何将一行的多列总和存储在同一张表的同一行的另一列上?
- reactjs - Reactjs:如何在生产应用程序的 devtools 中隐藏节点模块和 webconfig?
- java - 从用户那里获得五个输入的最大值和最小值
- java - 主要/次要对角线和行未在连接四个项目中注册为胜利
- java - 异步 servlet 如何在不打开更多线程的情况下保持与 http 客户端的连接
- c# - 当内存转储显示使用的内存非常少时调试内存不足的情况
- javascript - 如何改变鼠标位置?
- c# - Settings.Default 改变 Specialized.StringCollection 元素的行尾