【问题标题】:How to parse text from html being written by javascript?如何解析由 javascript 编写的 html 中的文本?
【发布时间】:2017-04-21 04:54:47
【问题描述】:

我是scrapy的新手,需要为数据挖掘项目抓取一些数据集。我需要刮掉“http://www.moneycontrol.com/india/stockpricequote/”。按照每个链接并提取数据。我已经编写了一个工作的scrapy爬虫来使用xpth和css获取数据。但是我在页面中遇到了这个元素,它使用javascript来填充一个选项卡式表。每个选项卡的 xpath 都相同。因此无法为单个选项卡提取数据 并从每个选项卡中获取数据库存增益百分比this is the tabbed element with gainpercentage in 5th row last column

我可以从 xpath 和 css 中抓取数据,但页面的一部分是从 javascript 中获取的。怎么能刮到这样的数据?我还需要每个选项卡中的数据 请告诉我一种方法,因为其他答案使用 json,我不熟悉它。

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class NewsItem(scrapy.Item):
    name = scrapy.Field()

class StationDetailSpider(CrawlSpider):
    name = 'test2'
    start_urls = ["http://www.moneycontrol.com/india/stockpricequote/"]
    rules = (
    Rule(LinkExtractor(restrict_xpaths="//a[@class='bl_12']"), follow=False, callback='parse_news'),
    Rule(LinkExtractor(allow=r"/diversified/.*$"), callback='parse_news')
)


    def parse_news(self, response):

        item = NewsItem()
        NEWS1_SELECTOR = 'div#disp_nse_hist tr:nth-child(5) > td:nth-child(4)::text'
        TIME1_SELECTOR = 'div#disp_nse_hist tr:nth-child(5) > td:nth-child(4)::text'
        NAME_SELECTOR = 'div#disp_nse_hist tr:nth-child(5) > td:nth-child(4)::text'

        print("------------------------------------starting extraction------------")
        item['name']=response.css(NAME_SELECTOR).extract_first()
        item['time1']=response.css(TIME1_SELECTOR).extract_first()
        item['news1']=response.css(NEWS1_SELECTOR).extract()
        return item

【问题讨论】:

  • 你使用什么环境进行抓取?如果页面像你说的那样是动态的,你将需要像 phantomjs 这样的东西
  • 我在 python3 (linux) 上使用 scrapy。
  • 哦,原来是python的问题,跟javascript没关系,因为python没有javascript引擎
  • 所以我无法使用 python 从 html 中提取 javscript 结果?
  • 我非常怀疑

标签: javascript json xpath web-scraping scrapy


【解决方案1】:

查看splash:http://splash.readthedocs.io/en/stable/,它是scrapy 的渲染服务,可让您抓取基于javascript 的网站。

您也可以创建自己的下载器中间件并使用 Selenium:How to write customize Downloader Middleware for selenium and Scrapy?

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这里有介绍https://stackoverflow.com/a/8594831/7892562

    您所说的是抓取 AJAX 页面,即可以动态加载新内容而无需重新加载整个页面的页面。

    按照说明进行操作,您应该没有问题。作为您列出的页面的示例,当您单击不同的时间范围(周、月、年等)时,会向

    http://www.moneycontrol.com/stocks/company_info/get_histprices.php?ex=B&sc_id=B3M&range=7

    如您所见,url 传递了 3 个查询参数。最后两个表示公司 ID 和历史定价的天数范围。点击那个链接,你就会明白我在说什么。

    有了这些知识,你应该能够弄清楚如何修改你的蜘蛛来抓取这些信息。

    【讨论】:

    • 我不认为增益百分比是准确的。你能告诉我你是怎么得到这个链接的。如果您的链接是针对 3M india 的,我如何找到公司的 sc_id 来调用 scrappy 来关注这个 lnk
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2020-01-17
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多