我已经开始在我的一个项目中使用刮除从一个网球网站上的数据。这里是我想要刮掉数据的示例页面。正如你所看到的,我想为一个网球运动员搜集数据。我需要递归浏览整个页面,并收集“匹配统计”(这是一个名为“匹配统计”的链接,旁边的每一场比赛)球员的比赛。我已经编写了代码来解析打开的匹配状态弹出的数据。我现在需要做的就是打开这些匹配状态页面,通过初始蜘蛛。
在我已经阅读过的所有示例中,我们可以编写规则来导航刮取到需要抓取的不同urls。在我的例子中,我只想为不同的匹配状态链接编写一个规则。但是,如果您看到我想刮的页面,“Match Stats”链接的格式如下:javascript:makePopup('match_stats_popup.php?matchID=183704502')。正如我在网上读到的(我可能错了!),scrapy无法处理javascript,因此不能“单击”该链接。但是,由于链接是javascript弹出窗口,因此可以将链接的match_stats_popup.php?matchID=183704502部分添加到主url以获得标准的html页面:
http://www.tennisinsight.com/match_stats_popup.php?matchID=183704502我希望我能在刮擦之前修改一下规则。总之,我只想找到类型为:javascript:makePopup('match_stats_popup.php?matchID=183704502的链接,并对它们进行修改,使它们现在属于http://www.tennisinsight.com/match_stats_popup.php?matchID=183704502类型。
到目前为止,这是我在规则中所写的,它没有打开任何页面:
rules = (
Rule(SgmlLinkExtractor(allow='/match_stats_popup.php?matchID=\d+'),
'parse_match', follow=True,
),
)parse_match是从打开的匹配状态弹出解析数据的方法。
希望我的问题足够清楚!
发布于 2014-03-10 06:29:58
使用BaseSgmlLinkExtractor或SgmlLinkExtractor,您可以指定要从中提取的标记和用于提取链接的process_value函数。官方文档中有好例子。下面是示例的代码:
class GetStatsSpider(CrawlSpider):
name = 'GetStats'
allowed_domains = ['tennisinsight.com']
start_urls = ['http://www.tennisinsight.com/player_activity.php?player_id=1']
def getPopLink(value):
m = re.search("javascript:makePopup\('(.+?)'\)", value)
if m:
return m.group(1)
rules = (
Rule(SgmlLinkExtractor(allow=r"match_stats_popup.php\?matchID=\d+",
restrict_xpaths='//td[@class="matchStyle"]',
tags='a', attrs='href', process_value=getPopLink), callback='parse_item', follow=True),
)
def parse_item(self, response):
sel = Selector(response)
i = TennisItem()
i['url_stats'] = response.url
return ihttps://stackoverflow.com/questions/22289742
复制相似问题