How to parse text from html being written by javascript?
我是个新手,需要为数据挖掘项目搜集一些数据集。我需要抓取"http://www.moneycontrol.com/india/stockpricequote/"。跟踪每个链接并提取数据。我曾经用xpth和css编写了一个工作垃圾爬虫程序来获取数据,但是我在page中遇到了这个元素,它使用javascript来填充一个选项卡表。每个选项卡的xpath都相同。因此无法提取单个选项卡的数据。并从每个标签中获取数据股票收益百分比这是最后一列第5行中带有增益百分比的标签元素
我可以从xpath和css中获取数据,但页面的一部分是从javascript获取的。如何才能刮取这样的数据?我还需要每个标签的数据请告诉我一种方法,因为其他答案使用JSON,我对此不熟悉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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 |
查看splash:http://splash.readthedocs.io/en/stable/,它是一个scrappy的呈现服务,允许您对基于javascript的网站进行爬行。
您还可以创建自己的下载器中间件并使用Selenium:如何为Selenium和Scrapy编写定制的下载器中间件?
希望这有帮助。
这里介绍了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和天数范围。通过这个链接,你会看到我在说什么。
鉴于这些知识,您应该能够了解如何修改您的蜘蛛来获取这些信息。