代码之家  ›  专栏  ›  技术社区  ›  snoob dogg

刮,在管道前等待

  •  0
  • snoob dogg  · 技术社区  · 6 年前

    (我是新来的瘙痒)。

    假设有一个站点 https://example.com 我想刮一下。

    <body>
    <ul>
        <li>
            title_foo
            <a href="https://example.com/title_foo">a desription</a>
        </li>
        <li>
            title_bar
            <a href="https://example.com/title_bar">an another desription</a>
        </li>
    </ul>
    </body>
    

    遵循 <a> 链接,我可以得到一个描述,我需要在创建我的项目,并将它们发送到我的管道将存储到我的数据库。

    比如说,当我跟随 https://example.com/title_foo

    <div class="a-descrption">
        a description
    </div>
    

    items.py ,我:

    class MyItem(scrapy.Item):
        title = scrapy.Field()
        description = scrapy.Field()
    

    import scrapy
    from scrapy_project.items import MyItem
    
    class MySpider(scrapy.Spider):
        name = "my_spider"
    
        def start_requests(self):
            urls = [
                'https://example.com',
            ]
            for url in urls:
                yield scrapy.Request(url=url, callback=self.parse)
    
        def parse(self, response):
            for li in response.xpath('//li/text()').getall()
                yield {"title": li }
    

    问题

    1 回复  |  直到 6 年前
        1
  •  2
  •   renatodvc    6 年前

    在您的示例中,唯一刮取的字段是 title ,所以我不完全确定,但听起来你想刮 在 https://example.com ,请求详细信息页面(如 https://example.com/title_foo )把描述删掉 yield description 和 标题 .

    这类问题的常见解决方案是使用 cb_kwargs 或meta。( )

    cb_kwargs

    class MySpider(scrapy.Spider):
        name = "my_spider"
    
        start_urls = ['https://example.com',]
    
        def parse(self, response):
            for li in response.xpath('//li'):
                title = li.xpath('text()').get()
                url_to_detail_page = li.xpath('a/@href').get()
                yield scrapy.Request(
                    url=url_to_detail_page,
                    callback=self.parse_detail_page,
                    cb_kwargs={
                        'title': title
                    })
    
        def parse_detail_page(self, response, title):  # Notice title as a keyword arg
            description = response.xpath('//div[@class="a-descrption"]//text()').getall()
            yield {
                'title': title,
                'description': description,
            }
    

    这里是第一页的数据,存储到 标题