python - Scrapy Crawler 仅提取 680 多个网址中的 19 个

标签 python scrapy

我正在尝试抓取此页面:https://coinmarketcap.com/currencies/views/all/

所有行的td[2]中的

是一个链接。我试图要求 scrapy 转到该 td 中的每个链接,并抓取链接代表的页面。下面是我的代码:

注意:另一个人非常出色地帮助我走到这一步

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

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

    def parse(self, response):
        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)

即使表格超过 600 多个链接/页面,当我运行 scrapy scrap coinmarketcap 时,我只得到 19 条记录。这意味着这个 600 多页列表中只有 19 页。我没有看到停止抓取的问题。任何帮助将不胜感激。

谢谢

最佳答案

你的蜘蛛走得太深了:按照这个规则,它也会在单个硬币的页面中找到并跟踪链接。您可以通过添加 DEPTH_LIMIT = 1 粗略地解决该问题,但您肯定可以找到更优雅的解决方案。 这是适合我的代码(还有其他细微的调整):

class ToScrapeSpiderXPath(CrawlSpider):
    name = 'coinmarketcap'
    start_urls = [
        'https://coinmarketcap.com/currencies/views/all/'
    ]
    custom_settings = {
        'DEPTH_LIMIT': '1',
    }

    rules = (
        Rule(LinkExtractor(restrict_xpaths=('//td[2]',)),callback="parse_item", follow=True),
    )

    def parse_item(self, response):
        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)

关于python - Scrapy Crawler 仅提取 680 多个网址中的 19 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43084632/

相关文章:

Python:tkinter,向列表框添加条目没有响应

python - 如何在 MySQL 数据库中存储动态 python 字典?

python - 如何在继承的 CrawlSpider 中重用基于 scrapy Spider 的蜘蛛的解析方法?

python - 在Python中使用一个列表理解来反转和反转二进制矩阵

python - 并行读取文件并参数化类参数

Python - 使用循环重命名目录中的所有文件

python - 如何在数据集中选择随机行并修改它们的值?

python - scrapy item 对象错误

python - 如何运行多个 scrapyd 服务器?

python - Scrapy在Python Shell和cmd.exe中有不同的结果