scrapy能同时满足请求和项目吗?

2024-05-18 08:34:26 发布

您现在位置:Python中文网/ 问答频道 /正文

当我编写parse()函数时,是否可以为一个页面同时生成请求和项?

我想在A页提取一些数据,然后将数据存储在数据库中,并提取要遵循的链接(这可以通过爬行蜘蛛中的规则来完成)。

我把A页的链接页面称为B页,所以我可以编写另一个parse_item()从B页中提取数据,但是我想提取B页中的一些链接,所以我只能使用规则来提取链接?如何处理Scrapy中的重复url?


Tags: 数据函数数据库urlparse链接规则页面
3条回答

我不是百分之百的理解你的问题,但是下面的代码使用basespider从一个起始url请求站点,然后扫描起始url中的ref's,然后循环每个链接调用parse\u urlparse_url中匹配的所有内容都将发送到项目管道。

def parse(self, response):
       hxs = HtmlXPathSelector(response)
       urls = hxs.select('//a[contains(@href, "content")]/@href').extract()  ## only grab url with content in url name
       for i in urls:
           yield Request(urlparse.urljoin(response.url, i[1:]),callback=self.parse_url)


def parse_url(self, response):
   hxs = HtmlXPathSelector(response)
   item = ZipgrabberItem()
   item['zip'] = hxs.select("//div[contains(@class,'odd')]/text()").extract() ## this bitch grabs it
   return item

来自谷歌集团的史蒂文·阿尔梅罗斯:

你说得对,你可以提出请求并返回一个项目列表,但这不是你想要的。您试图生成一个项目列表,而不是返回它们。而且由于已经将parse()用作生成函数,因此不能同时使用yield和return。但你可以有很多收益。

试试这个:

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    base_url = response.url
    links = hxs.select(self.toc_xpath)

    for index, link in enumerate(links):
        href, text = link.select('@href').extract(), link.select('text()').extract()
        yield Request(urljoin(base_url, href[0]), callback=self.parse2)

    for item in self.parse2(response):
        yield item

是的,您可以同时提交请求和项目。来自what I've seen

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    base_url = response.url
    links = hxs.select(self.toc_xpath)

    for index, link in enumerate(links):
        href, text = link.select('@href').extract(), link.select('text()').extract()
        yield Request(urljoin(base_url, href[0]), callback=self.parse2)

    for item in self.parse2(response):
        yield item

相关问题 更多 >