Scrapy:修改网页抓取规则
我开始用 scrapy 来做一个项目,想从一个网球网站上抓取数据。这里是我想抓取数据的一个示例页面。你可以看到,我想抓取一个网球选手的数据。我需要遍历整个页面,收集每场比赛的“比赛统计”(每场比赛旁边都有一个叫“比赛统计”的链接)。我已经写了代码来解析打开的比赛统计弹窗中的数据。现在我只需要通过最初的爬虫打开这些比赛统计页面。
在我读过的所有示例中,我们可以写规则来引导 scrapy 去不同的需要抓取的链接。在我的情况下,我只想写一个规则来处理不同的比赛统计链接。不过,如果你看过我想抓取的页面,“比赛统计”链接的格式是这样的:javascript:makePopup('match_stats_popup.php?matchID=183704502')
。我在网上看到(可能我理解错了!),scrapy 不能处理 javascript,因此无法“点击”这个链接。不过,由于这些链接是 javascript 弹窗,我们可以把 match_stats_popup.php?matchID=183704502
这一部分添加到主网址上,从而得到一个标准的 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
是一个方法,用来解析打开的比赛统计弹窗中的数据。
希望我的问题足够清楚!
1 个回答
使用 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 i