我是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
答案 0 :(得分:0)
此处包含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和历史定价的天数范围。按照该链接,您将看到我正在谈论的内容。
鉴于这些知识,您应该能够弄清楚如何修改您的蜘蛛来抓取这些信息。
答案 1 :(得分:0)
查看splash:http://splash.readthedocs.io/en/stable/,它是scrapy的渲染服务,可以让你抓取基于javascript的网站。
您还可以创建自己的下载中间件并使用Selenium:How to write customize Downloader Middleware for selenium and Scrapy?
希望这有帮助。