【问题标题】:How to follow a list of links to get data from pages in scrapy?如何按照链接列表从scrapy中的页面获取数据?
【发布时间】:2017-08-22 08:55:14
【问题描述】:

我有一个网页要抓取。在页面上,是<table> 中的链接列表。我正在尝试使用规则部分来要求 Scrapy 通过链接,并获取链接目标页面上的数据。以下是我的代码:

class ToScrapeSpiderXPath(scrapy.Spider):
    name = 'coinmarketcap'
    start_urls = [
        'https://coinmarketcap.com/currencies/views/all/'
    ]

    rules = (
        Rule(LinkExtractor(allow=(), restrict_xpaths=('//tr/td[2]/a/@href',)), callback="parse", follow= True),
    )

    def parse(self, response):
        print("TEST TEST TEST")
        BTC = BTCItem()
        BTC['source'] = str(response.request.url).split("/")[2]
        BTC['asset'] = str(response.request.url).split("/")[4],
        BTC['asset_price'] = response.xpath('//*[@id="quote_price"]/text()').extract(),
        BTC['asset_price_change'] = response.xpath('/html/body/div[2]/div/div[1]/div[3]/div[2]/span[2]/text()').extract(),
        BTC['BTC_price'] = response.xpath('/html/body/div[2]/div/div[1]/div[3]/div[2]/small[1]/text()').extract(),
        BTC['Prct_change'] = response.xpath('/html/body/div[2]/div/div[1]/div[3]/div[2]/small[2]/text()').extract()
        yield (BTC)

我的问题是 Scrapy 没有关注这些链接。它只是在尝试从该链接中提取数据时使用该链接。我错过了什么?

更新#1: 为什么是抓取与抓取?

2017-03-28 23:10:33 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://coinmarketcap.com/currencies/pivx/> (referer: None)
2017-03-28 23:10:33 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://coinmarketcap.com/currencies/zcash/> (referer: None)
2017-03-28 23:10:33 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://coinmarketcap.com/currencies/bitcoin/> (referer: None)
2017-03-28 23:10:33 [scrapy.core.scraper] DEBUG: Scraped from <200 https://coinmarketcap.com/currencies/nem/>

【问题讨论】:

    标签: python web-scraping scrapy scrapy-spider


    【解决方案1】:

    您需要从 CrawlSpider 类继承链接提取器才能工作:

    from scrapy.spiders import CrawlSpider
    from scrapy.spiders import Rule
    from scrapy.contrib.linkextractors import LinkExtractor
    
    
    class ToScrapeSpiderXPath(CrawlSpider):
        name = 'coinmarketcap'
        start_urls = [
            'https://coinmarketcap.com/currencies/views/all/'
        ]
    
        rules = (
            Rule(LinkExtractor(restrict_xpaths='//tr/td[2]/a'), callback="parse_table_links", follow= True),
        )
    
        def parse_table_links(self, response):
            print(response.url)
    

    请注意,您需要修复 restrict_xpaths 值 - 它应该指向 a 元素,而不是元素的 @href 属性。而且,您可以将其定义为字符串而不是元组。

    另外,allow 参数是可选的。

    【讨论】:

    • 很抱歉之后再问,但是如果您查看 update#1,它会抓取一些页面,抓取其他页面。你能告诉我为什么吗?
    • 我正在寻找它访问的所有页面
    • @arcee123 我认为你应该得到所有这些 - 请重新检查控制台输出 - 你应该看到每个 url 的“抓取”和“抓取”日志消息。谢谢。
    • 好的。我不是。有超过 670 个链接要通过,它并没有得到所有的链接。来源在这里:coinmarketcap.com/currencies/views/all
    • @arcee123 等等,我刚刚将所有结果转储到一个 json 文件中,并在那里获得了 890 个链接。如果问题仍然可以重现,您能否在单独的问题中详细说明问题?这样,更多的人可能会提供帮助,并且您可能会在描述问题时看到问题:) 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2015-04-15
    • 2017-10-02
    • 2020-06-26
    • 1970-01-01
    • 2017-07-26
    • 2013-09-06
    相关资源
    最近更新 更多