Scrapy-解析页面以提取项目-然后关注并存储项目url内容

我对如何抓紧地做这件事有一个疑问。我有一个蜘蛛,可以爬行以列出项目页面。每次找到带有项目的列表页面时,都会调用parse_item()回调,以提取项目数据并产生项目。到目前为止,一切都很好。

但是,除了其他数据外,每个项目都有一个网址,其中包含有关该项目的更多详细信息。我想跟随该URL并将获取的该项目URL的内容存储在另一个项目字段(url_contents)中。

而且我不确定如何组织代码来实现这一点,因为两个链接(列表链接和一个特定项目链接)的遵循方式不同,在不同时间调用了回调,但是我必须在同一项目处理中将它们关联起来。

到目前为止,我的代码如下所示:

class MySpider(CrawlSpider):

name = "example.com"

allowed_domains = ["example.com"]

start_urls = [

"http://www.example.com/?q=example",

]

rules = (

Rule(SgmlLinkExtractor(allow=('example\.com', 'start='), deny=('sort='), restrict_xpaths = '//div[@class="pagination"]'), callback='parse_item'),

Rule(SgmlLinkExtractor(allow=('item\/detail', )), follow = False),

)

def parse_item(self, response):

main_selector = HtmlXPathSelector(response)

xpath = '//h2[@class="title"]'

sub_selectors = main_selector.select(xpath)

for sel in sub_selectors:

item = ExampleItem()

l = ExampleLoader(item = item, selector = sel)

l.add_xpath('title', 'a[@title]/@title')

......

yield l.load_item()

回答:

经过测试和思考,我找到了适合我的解决方案。想法是仅使用第一个规则,该规则为你提供项目列表,并且非常重要的是,在该规则中添加follow = True。

并且在parse_item()中,你必须产生一个请求而不是一个项目,但是要在加载该项目之后。要求是物品详细网址。并且你必须将加载的项目发送到该请求回调。你可以使用响应来完成工作,并且可以在其中生成项目。

因此parse_item()的完成将如下所示:

itemloaded = l.load_item()

# fill url contents

url = sel.select(item_url_xpath).extract()[0]

request = Request(url, callback = lambda r: self.parse_url_contents(r))

request.meta['item'] = itemloaded

yield request

然后parse_url_contents()将如下所示:

def parse_url_contents(self, response):

item = response.request.meta['item']

item['url_contents'] = response.body

yield item

如果有人采用另一种(更好)的方法,请告诉我们。

以上是 Scrapy-解析页面以提取项目-然后关注并存储项目url内容 的全部内容, 来源链接: utcz.com/qa/397487.html

回到顶部