我正试图创建一个网络分析器来解析不同的网球比赛,并试图跟随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。
答案 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)