Web scraping 如何遵循javascript:GO(123456)hrefs在浏览网页时访问新URL?

Web scraping 如何遵循javascript:GO(123456)hrefs在浏览网页时访问新URL?,web-scraping,scrapy,Web Scraping,Scrapy,我正在尝试创建一个webscraper来解析不同的网球比赛,并尝试通过href链接访问每场比赛的更多信息页面。我目前正在使用Scrapy,以前也做过类似的工作,但通常在href标记下,我会发现实际的URL可以简单地跟随。现在,我发现类似的事情,并且很难弄清楚如何使刮板遵循这一点 我发现很多网站都在贬低Scrapy,以及它在javascript中的效果如何,并且已经开始关注Selenium的潜在解决方案,我对Selenium是非常陌生的。问题是,这些都没有做我需要做的事情,除非他们在一个非常高的层

我正在尝试创建一个webscraper来解析不同的网球比赛,并尝试通过href链接访问每场比赛的更多信息页面。我目前正在使用Scrapy,以前也做过类似的工作,但通常在href标记下,我会发现实际的URL可以简单地跟随。现在,我发现类似的事情,并且很难弄清楚如何使刮板遵循这一点

我发现很多网站都在贬低Scrapy,以及它在javascript中的效果如何,并且已经开始关注Selenium的潜在解决方案,我对Selenium是非常陌生的。问题是,这些都没有做我需要做的事情,除非他们在一个非常高的层次上解释我需要“检查javascript并从Selenium开始跟踪它”(我在试图弄清楚这一点时迷失了方向)

以下是指向我正在从中抓取的基本网站的链接(使用我的命令打开网站的scrapy shell):

然后使用href属性获取表数据标记(一半是我将忽略的google地图链接,另一半是我想找出并遵循的链接):

以下是此处输出的示例:

 <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);'>]

下一个页面URL存根是我通常会丢失的URL。

这需要评估Javascript(这是现代搜索引擎所做的)以找到实际生成的链接(可能不是链接,可能是新内容的页面内检索以替换旧内容)

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

function Go(iTournamentID) {
    var oForm = document.forms[0];
    window.location = '../TournamentHome/Tournament.aspx?T=' + iTournamentID;
}
您可以使用它来使用上面Go()调用中给定的id执行硬替换,例如,添加一个检查,查看它是否以Javascript调用开始,然后提取id(len()调用将在
之后的字符处开始提取)(
然后删除最后两个字符(
;)
):


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

这需要评估Javascript(这是现代搜索引擎所做的)以找到实际生成的链接(可能不是链接,可能是新内容的页内检索以替换旧内容)

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

function Go(iTournamentID) {
    var oForm = document.forms[0];
    window.location = '../TournamentHome/Tournament.aspx?T=' + iTournamentID;
}
您可以使用它来使用上面Go()调用中给定的id执行硬替换,例如,添加一个检查,查看它是否以Javascript调用开始,然后提取id(len()调用将在
之后的字符处开始提取)(
然后删除最后两个字符(
;)
):


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

只需自己构造所需的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)


只需自己构造所需的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)


这太棒了;非常感谢你。没有足够的声誉提升核心,但会回来这么做sap。也许是个愚蠢的问题,但你能分享你是如何找到javascript源代码的吗?我打开了所有我能找到的标签,搜索函数,但没有成功…有什么方法可以做到这一点,或者只是猜测和检查?只是“vi”“我的浏览器中的ew source”并搜索
Go(
。这太棒了;非常感谢。没有足够的声誉来提升核心,但会回来这么做sap。也许是个愚蠢的问题,但你能分享一下你是如何找到javascript源代码的吗?我打开了所有我能找到的标签,搜索函数,但没有成功…有什么方法可以做到这一点,或者只是猜测和检查?只需在我的浏览器中“查看源代码”,然后搜索
Go(
)。
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_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)