网络抓取时如何遵循javascript:GO(123456)hrefs进入新网址?

时间:2019-07-27 21:17:25

标签: web-scraping scrapy

我正试图创建一个网络分析器来解析不同的网球比赛,并试图跟随href链接进入包含每个锦标赛更多信息的页面。我目前正在使用Scrapy,之前已经完成了类似的任务,但是通常在href标记下,我会发现实际的URL可以简单地跟随。现在,我发现诸如之类的东西,并且在弄清楚如何使刮板遵循此方法时遇到了麻烦。

我发现很多网站都对Scrapy颇有兴趣,以及它与javascript相比效果如何,并且已经开始关注Selenium的潜在解决方案,而我对Selenium还是很陌生。问题是,除非他们在很高的层次上进行解释,否则这些工具都没有做我需要的事情,除非我需要“检查javascript并从Selenium那里跟随它”(我很想找出来)。

这是指向我要从中进行抓取的基本网站的链接(使用我的命令打开该网站的抓取外壳):

scrapy shell https://m.tennislink.usta.com/TournamentSearch/SearchResults.aspx?typeofsubmit=&Action=2&Keywords=&TournamentID=&SectionDistrict=&City=&State=&Zip=&Month=1&StartDate=&EndDate=&Day=&Year=2019&Division=G8&Category=&Surface=&OnlineEntry=&DrawsSheets=&UserTime=&Sanctioned=-1&AgeGroup=Y&SearchRadius=-1

然后获取具有href属性的表数据标签(一半是我将忽略的google map链接,而另一半是我想弄清楚并遵循的链接):

table = response.css('td> a::attr(href)')

以下是此处输出的示例:

 <Selector xpath='descendant-or-self::td/a/@href' data='http://maps.google.com/maps?q=30 Snyders'>,
 <Selector xpath='descendant-or-self::td/a/@href' data='javascript:Go(229689);'>,
 <Selector xpath='descendant-or-self::td/a/@href' data='http://maps.google.com/maps?q=60 Sea Cli'>,
 <Selector xpath='descendant-or-self::td/a/@href' data='javascript:Go(229805);'>]

但是在此之后我不能简单地使用

response.urljoin(next_page_URL_stub)

其中next_page_URL_stub是我通常所缺少的URL。

2 个答案:

答案 0 :(得分:0)

这将需要评估Javascript(这是现代搜索引擎所做的事情)以找到实际的结果链接(该链接可能不是链接,它可能是对新内容的页内检索,以代替旧内容)。

但是,如果您查看源代码,则可以看到上面给出的链接所涉及的Javascript是:

function Go(iTournamentID) {
    var oForm = document.forms[0];
    window.location = '../TournamentHome/Tournament.aspx?T=' + iTournamentID;
}

您可以使用上面的Go()调用中提供的ID将其用于硬替换,例如,添加检查以查看它是否以Javascript调用开头,然后提取ID(len()调用将在(之后的字符处开始提取,然后删除最后两个字符(;)):

if next_page_URL_stub.startswith('javascript:Go('):
    next_page_URL_stab = '../TournamentHome/Tournament.aspx?T=' + next_page_URL_stub[len('javascript:Go(')]:-2]

这应该与您以前的URL可以URL连接。

答案 1 :(得分:0)

只需自己构造所需的URL。

url_template = 'https://m.tennislink.usta.com/TournamentHome/Tournament.aspx?T={}'
url_ids = response.css('a::attr(href)').re('Go\((\d+)\)')

for url_id in url_ids:
    next_page_url = url_template.format(url_id)