【问题标题】:Scrape JavaScript download links from ASP website从 ASP 网站抓取 JavaScript 下载链接
【发布时间】:2013-10-22 13:53:53
【问题描述】:

我正在尝试从this website 下载所有文件以进行备份和镜像,但是我不知道如何正确解析 JavaScript 链接。

我需要在命名文件夹中以相同的方式组织所有下载。例如,在第一个文件夹中,我将有一个名为“DAP-1150”的文件夹,其中有一个名为“DAP-1150 A1 FW v1.10”的文件夹,其中包含“DAP1150A1_FW110b04_FOSS.zip”文件,依此类推。文件。我尝试在 Python 中使用 beautifulsoup,但它似乎无法正确处理 ASP 链接。

【问题讨论】:

  • 我认为 Selenium 在这方面可能有点矫枉过正。我注意到,一旦您单击了链接,它就会进行 POST 提交(因为不询问用户就无法刷新结果页面)。因此,弄清楚单击链接的作用——它可能会在表单中插入一个值并提交它。您在抓取系统中需要做的就是模拟这一点,使用抓取的链接来计算出您需要的输入。
  • 是的,在我看来,scrapy 是要走的路,我需要为下载创建文件夹结构并生成完整的下载列表和路径,我可以排队并在有时更新变化。
  • 我尝试了很多方法,但仍然无法正常工作,这个网站看起来很奇怪。我想我需要某种可以正确连接到 jquery 的刮板,但我不知道该怎么做。我可以使用时间线功能跟踪在 chrome 中进行的所有调用,但我不知道您如何将其调整为 scrapy 或类似的东西。
  • 不,您根本不需要挂钩到 jQuery 或使用 JavaScript。见my answer here
  • 我想我刚刚在 scrapy 中获得了一个可用的 xpath,使用 chrome 插件“//strong/a”至少提供了所有链接。

标签: javascript python asp.net web-scraping


【解决方案1】:

当您遇到 Javascript 链接时,您可以尝试一下 Selenium:http://selenium-python.readthedocs.org/en/latest/getting-started.html

from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get("http://www.python.org")
time.sleep(3)   # Give your Selenium some time to load the page
link_elements = driver.find_elements_by_tag_name('a')
links = [link.get_attribute('href') for link in links]

您可以使用这些链接并将它们传递给urllib2 以相应地下载它们。 如果您需要的不仅仅是脚本,我可以推荐您使用 Scrapy 和 Selenium 的组合: selenium with scrapy for dynamic page

【讨论】:

    【解决方案2】:

    这就是它正在做的事情。我只是使用 Firefox 中的标准网络检查器来快照 POST 操作。请记住,就像我指出的 my other answer 一样,这不是一个写得特别好的网站 - 根本不应该使用 JS/POST。

    首先,这是 JS - 它非常简单:

    function oMd(pModel_,sModel_){
    obj=document.form1;
    obj.ModelCategory_.value=pModel_;
    obj.ModelSno_.value=sModel_;
    obj.Model_Sno.value='';
    obj.ModelVer.value='';
    obj.action='downloads2008detail.asp';
    obj.submit();
    }
    

    写入这些字段:

    <input type=hidden name=ModelCategory_ value=''>
    <input type=hidden name=ModelSno_ value=''>
    

    因此,您只需要一个针对此 URL 的 POST 表单:

    http://tsd.dlink.com.tw/downloads2008detail.asp
    

    这是来自 FF 网络分析器的一组示例数据。只有两个项目需要更改——从 JS 链接中获取——你可以用普通的刮擦来获取:

    • Enter=OK
    • ModelCategory=0
    • ModelSno=0
    • ModelCategory_=DAP
    • ModelSno_=1150
    • Model_Sno=
    • ModelVer=
    • sel_PageNo=1
    • 操作系统=GPL

    您可能会通过实验发现并非所有这些都是必需的。我确实尝试在浏览器中为此使用 GET,但看起来目标页面坚持使用 POST。

    不要忘记在点击和提交之间在抓取工具中留出相当长的时间,因为每一次都代表远程服务器上的一次点击;我建议 5 秒,模拟人为的延迟。如果您这样做太快 - 如果您的连接良好,那么很可能 - 远程端可能会认为您正在对它们进行 DoSing,并且可能会阻止您的 IP。记住刮痧的座右铭:做一个好机器人!

    【讨论】:

    • 从scrapy shell中使用 hxs.select("//strong/a/@href").extract() 我似乎能够获得单个页面所需的信息。但是,相同的路径似乎不适用于抓取页码。为此,我得到了“//tr[21]/td/table/tbody/tr/td/a”,但似乎scrapy根本不解释“tbody”,有没有另一种方法可以找到正确的xpath刮痧?
    • 刚刚想通了,看来我可以像 tsd.dlink.com.tw/… 这样修改页面请求以增加页面
    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 2020-06-30
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2020-01-30
    • 2012-02-18
    相关资源
    最近更新 更多