当前位置: 首页 > 面试题库 >

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

钱均
2023-03-14
问题内容

我对如何抓紧地做这件事有一个疑问。我有一个蜘蛛,可以爬行以列出项目页面。每次找到带有项目的列表页面时,都会调用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项目,正在尝试将输出项保存为Django模型定义中的对象(我不使用DjangoItem)。 我正在按此处指定的方式导入Django设置。 在我的Scrapy项目中,我有一个管道类,该类最终处理所有项目并将其保存到数据库中: 但是,发生了一些奇怪的事情,对于第一个项目,我得到了一个错误(请参阅下文)。对于其余项目,一切都很好。假设我要保存7个项目,因此我在第一个保存错

  • 检查一个方法的代码,该方法用于等待SeleniumWebDriver中的元素,我以这种方式调用它waitForElement(By.id(idOfElement)); 这个方法应该找到元素并点击它 它工作得很好,本来应该单击元素然后从方法返回,但现在失败了,因为驱动程序单击了重定向到另一个页面的元素,在新页面显示驱动程序而不是从方法返回后,它进入catch异常,最后代码失败了,因为驱动程序试图找到

  • 本文向大家介绍Erlang项目内存泄漏分析方法,包括了Erlang项目内存泄漏分析方法的使用技巧和注意事项,需要的朋友参考一下 随着项目越来越依赖Erlang,碰到的问题也随之增加。前段时间线上系统碰到内存高消耗问题,记录一下troubleshooting的分析过程。线上系统用的是Erlang R16B02版本。 问题描述 有几台线上系统,运行一段时间,内存飙升。系统模型很简单,有网络连接,poo

  • 我对laravel是新手,刚刚创建了一个项目(laravel版本5.4.34)。 使用后:composer创建项目Laravel/Laravel项目 在添加mysql数据库连接的详细信息并运行 PHP工匠make: auth 我浏览到项目的url,得到基本的laravel主页,登录和注册链接在左上方。 当我单击register或login链接时,它似乎陷入了重定向循环。安装后会发生什么情况?这会是

  • webpack打包老项目,那种jquery的,然后多页面的 这种的话要怎么定义入口呢,也不知道哪个是入口,入口一般都是有相应的和html同名的js文件,但是老项目是没有的,当然可以用htmlwebpackplugin生成多个html文件,但是它里面用哪些模块呢,也不知道入口,这种有没有什么解决方案呢,要是有例子的话就更好了 用了htmlwebpackplugin 老项目中每个page底下的html

  • 我有一个本地的artifactory存储库。我在应用程序的pom.xml中有一个依赖项,如下所示: 我在我的“ext-local-snapshot”存储库中部署了一个activequant-p2-1.3-snapshot.jar。Artifactory将其部署在org/activequant/activequant-p2/activequant-p2-1.3-20130925.170928.jar