scrapy可以产生请求和项目吗?

时间:2012-12-30 18:13:25

标签: python scrapy

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

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

我调用A页面的链接页面是B页面,所以我可以写另一个parse_item()来从B页面中提取数据,但我想在B页面中提取一些链接,所以我只能使用规则提取链接?如何解决Scrapy中的重复URL?

3 个答案:

答案 0 :(得分:18)

是的,您可以同时处理请求和项目。来自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

答案 1 :(得分:10)

我不是100%我理解你的问题,但是下面的代码使用basespider从起始网址请求网站,然后扫描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

答案 2 :(得分: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