【问题标题】:Multiple pages per item - using scraped links每个项目多个页面 - 使用抓取的链接
【发布时间】:2018-05-16 17:54:45
【问题描述】:

我的蜘蛛看起来像这样/;

class ScrapeMovies(scrapy.Spider):

    start_urls = [
        'https://www.trekearth.com/members/page1.htm?sort_by=md'
    ]

    def parse(self, response):
        for row in response.xpath('//table[@class="member-table"]//tr[position() > 1]'):

            item = loopitem()
            website = row.xpath('./td[2]//a/@href/text()').extract_first()
            item['name'] = row.xpath('./td[2]//a/text()').extract_first()

            yield item
   # This part is responsible for scraping all of the pages on a start url commented out for convinience    
#       next_page=response.xpath('//div[@class="page-nav-btm"]/ul/li[last()]/a/@href').extract_first()
#       if next_page is not None:
#            next_page=response.urljoin(next_page)
#            yield scrapy.Request(next_page, callback=self.parse)

它的作用是知道它会刮桌子(请参阅起始网址)。我希望它转到链接(成员名称列),然后从该链接中提取一些信息(链接例如https://www.trekearth.com/members/monareng/)并将其作为项目返回。

我应该如何处理这个问题?

如果有任何不清楚的地方,请随时要求澄清。

编辑: 现在我的代码如下所示(但仍然不起作用):

class ScrapeMovies(scrapy.Spider):
    name='final'

    start_urls = [
        'https://www.trekearth.com/members/page1.htm?sort_by=md'
    ]

    def parse(self, response):
        for row in response.xpath('//table[@class="member-table"]//tr[position() > 1]'):

            item = FinalItem()    
            website = row.xpath('./td[2]//a/@href/text()').extract_first()
            item['name'] = row.xpath('./td[2]//a/text()').extract_first()

            request = scrapy.Request(website,
            callback=self.parse_page2)
            request.meta['item'] = item
            return request

    def parse_page2(self, response): 
        item = response.meta['item']
        item['other_url'] = response.url
        item['groups'] = response.xpath('//div[@class="groups-btm"]/ul/li/text()').extract_first()
        return item

【问题讨论】:

    标签: python web web-scraping scrapy


    【解决方案1】:

    使用meta 字段将项目转发到下一个回调

    def parse_page1(self, response):
        item = MyItem(main_url=response.url)
        request = scrapy.Request("http://www.example.com/some_page.html",
                                 callback=self.parse_page2)
        request.meta['item'] = item
        return request
    
    def parse_page2(self, response):
        item = response.meta['item']
        item['other_url'] = response.url
        return item
    

    UPD:要处理所有行,请在循环中使用 yield

        for row in response.xpath('//table[@class="member-table"]//tr[position() > 1]'):
    
            item = FinalItem()    
            website = row.xpath('./td[2]//a/@href/text()').extract_first()
            item['name'] = row.xpath('./td[2]//a/text()').extract_first()
    
            request = scrapy.Request(website,
            callback=self.parse_page2)
            request.meta['item'] = item
            yield request
    

    【讨论】:

    • 谢谢!但是现在我什么时候把我的代码的最后一部分从第 1 页到最后(你有一个用户名列表,我正在从个人资料链接中刮掉这张表 + 信息的页数)?
    • 我看到两个问题,一个是使用通过xpath(变量xpath)提取的网站地址,另一个是如何正确合并在一起?我的意思是为每个用户访问这些链接,然后从第 1 页一直关注到最后?
    • 我不明白你试图解决的任务。一个项目可以包含来自多个页面的数据 - 我向您展示了如何做到这一点
    • 访问我正在使用的页面。我想废弃 trekearth.com/members 上的表格(所有页面,到目前为止,您的页面从 1 到 300 不等)然后我想访问每个用户个人资料并将其中的信息添加到我的主要输出中。
    • @Mrowkacala 我更新了答案。拜托,让我们完成这个问题,你可以接受它。因为所有其他错误都与该主题无关。我不能只为你写一个刮板。如果您有其他问题,请提出新问题。你可以在 cmets 里面提到我,我去看看。
    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 2020-09-21
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多