Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Scrapy:修改用于刮取网页的规则_Javascript_Python_Regex_Scrapy - Fatal编程技术网

Javascript Scrapy:修改用于刮取网页的规则

Javascript Scrapy:修改用于刮取网页的规则,javascript,python,regex,scrapy,Javascript,Python,Regex,Scrapy,我已经开始在我的一个项目中使用scrapy从一个网球网站上搜集数据。是一个示例页面,我想从中删除数据。如你所见,我想为网球运动员搜集数据。我需要递归地浏览整个页面,收集球员比赛的“比赛统计”(每场比赛旁边都有一个名为“比赛统计”的链接)。我已经编写了代码来解析打开的match stats弹出窗口中的数据。我现在需要做的就是通过最初的蜘蛛打开这些比赛统计页面 在我读过的所有示例中,我们都可以编写规则,将scrapy导航到需要刮取的不同URL。在我的例子中,我只想为不同的match stats链接编

我已经开始在我的一个项目中使用scrapy从一个网球网站上搜集数据。是一个示例页面,我想从中删除数据。如你所见,我想为网球运动员搜集数据。我需要递归地浏览整个页面,收集球员比赛的“比赛统计”(每场比赛旁边都有一个名为“比赛统计”的链接)。我已经编写了代码来解析打开的match stats弹出窗口中的数据。我现在需要做的就是通过最初的蜘蛛打开这些比赛统计页面

在我读过的所有示例中,我们都可以编写规则,将scrapy导航到需要刮取的不同URL。在我的例子中,我只想为不同的match stats链接编写一个规则。但是,如果您看到我想要抓取的页面,“Match Stats”链接的格式如下:
javascript:makePopup('Match\u Stats\u 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
是从打开的匹配统计弹出窗口中解析数据的方法


希望我的问题足够清楚!

使用
BaseSgmlLinkExtractor
SgmlLinkExtractor
您可以指定要从中提取的标记和用于提取链接的
处理\u值
函数。在官方文档中有。以下是示例代码:

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

当我点击你的链接时,我只看到一个要点击的“比赛统计信息”。嗨!这是主链接:)有一个球员的比赛历史记录,每一场比赛都有一个对应的比赛统计信息链接,这会打开一个弹出窗口供你回复。这里是url:它有一个比赛统计链接的比赛列表。根据您提供的链接(谢谢!),代码看起来是否像这样:m=re.search(“javascript:makePopup('match_stats_popup.php?matchID=\d+'),value)m.group[1]在示例中指的是什么?:)