12

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

我想在页面A中提取一些数据,然后将数据存储在数据库中,并提取要跟踪的链接(这可以通过CrawlSpider中的规则来完成)。

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

4

3 回答 3

23

是的,您可以同时生成请求和项目。据我所见

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
于 2013-04-11T03:48:52.213 回答
10

我不是 100% 我理解你的问题,但下面的代码使用 basespider 从起始 url 请求站点,然后扫描起始 url 以查找 href,然后循环每个调用parse_url的链接。parse_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
于 2013-01-02T04:00:22.843 回答
4

来自谷歌群组的 Steven Almeroth:

你是对的,你可以产生请求并返回一个项目列表,但这不是你想要的。您正在尝试生成项目列表而不是返回它们。而且由于您已经使用 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
于 2014-05-09T20:43:09.930 回答