gpt4 book ai didi

python - 如何只抓取两个预定义的页面,但它们抓取不同的项目?

转载 作者:太空宇宙 更新时间:2023-11-03 19:01:50 25 4
gpt4 key购买 nike

我正在尝试抓取由某些用户输入驱动的网站。例如,用户给我一个产品的 pid 和名称,一个单独的程序将启动蜘蛛,收集数据并将其返回给用户。

但是,我想要的唯一信息是在两个 xml 链接中找到的产品和人员。如果我知道这两个链接和模式,如何构建回调来解析不同的项目?

例如,如果我定义了这两个项目:

class PersonItem(Item):
name = Field()
...

class ProductItem(Item):
pid = Field()
...

我知道他们的链接有模式:

www.example.com/person/*<name_of_person>*/person.xml
www.example.com/*<product_pid>*/product.xml

然后我的蜘蛛看起来像这样:

class MySpider(BaseSpider):
name = "myspider"

# simulated given by user
pid = "4545-fw"
person = "bob"

allowed_domains = ["http://www.example.com"]
start_urls = ['http://www.example.com/person/%s/person.xml'%person, 'http://www.example.com/%s/product.xml'%pid]

def parse(self, response):

# Not sure here if scrapping person or item

我知道我也可以使用 Rule(SgmlLinkExtractor()) 定义规则,然后为人员和产品提供各自的解析回调。然而,我不确定它们在这里如何应用,因为我认为规则是为了爬得更深,而我只需要触及表面。

最佳答案

如果您想追溯,您可以将逻辑放入 parse() 中:

def parse(self, response):
if 'person.xml' in response.url:
item = PersonItem()
elif 'product.xml' in response.url:
item = ProductItem()
else:
raise Exception('Could not determine item type')

更新:

如果你想主动,你可以重写start_requests():

class MySpider(BaseSpider):
name = "myspider"
allowed_domains = ["example.com"]
pid = "4545-fw"
person = "bob"

def start_requests(self):
start_urls = (
('http://www.example.com/person/%s/person.xml' % self.person, PersonItem),
('http://www.example.com/%s/product.xml' % self.pid, ProductItem),
)
for url, cls in start_urls:
yield Request(url, meta=dict(cls=cls))

def parse(self, response):
item = response.meta['cls']()

关于python - 如何只抓取两个预定义的页面,但它们抓取不同的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15838325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com