【问题标题】:Executing Javascript functions using scrapy in python在python中使用scrapy执行Javascript函数
【发布时间】:2012-05-25 17:44:47
【问题描述】:

我对“scrapy”很陌生,我正在废弃一个网站,因为我有一些锚标签,其中包含带有 java script SubmitForm 函数的 href 属性。当我单击该 javascript 函数时,一个页面正在打开,我需要从中获取数据。我使用 Xpath 并找到了特定锚标记的 href,但无法执行包含 javascript 函数的 href 属性。 谁能告诉我如何在scrapy python中执行javascript提交锚标签的功能。我的HTML代码是

   <table class="Tbl" cellspacing="2" cellpadding="0" border="0">
     <tbody>
        <tr>
           <td class="TblOddRow">
             <table cellspacing="0" cellpadding="0" border="0">
               <tbody>
                 <tr>
                   <td valign="middle" nowrap="">
                        <a class="Page" alt="Click to view job description" title="Click to view job description" href="javascript:sysSubmitForm('frmSR1');">Accountant&nbsp;</a>
                   </td>
                 </tr>
               </tbody>
             </table>
           </td>
        </tr>
      </tbody>
  </table>                      

蜘蛛代码是

class MountSinaiSpider(BaseSpider):
   name = "mountsinai"
   allowed_domains = ["mountsinaicss.igreentree.com"]
   start_urls = [
       "https://mountsinaicss.igreentree.com/css_external/CSSPage_SearchAndBrowseJobs.ASP?T=20120517011617&",
   ]
   def parse(self, response):
       return [FormRequest.from_response(response,
                                        formdata={ "Type":"CSS","SRCH":"Search&nbsp;Jobs","InitURL":"CSSPage_SearchAndBrowseJobs.ASP","RetColsQS":"Requisition.Key¤Requisition.JobTitle¤Requisition.fk_Code_Full_Part¤[Requisition.fk_Code_Full_Part]OLD.Description(sysfk_Code_Full_PartDesc)¤Requisition.fk_Code_Location¤[Requisition.fk_Code_Location]OLD.Description(sysfk_Code_LocationDesc)¤Requisition.fk_Code_Dept¤[Requisition.fk_Code_Dept]OLD.Description(sysfk_Code_DeptDesc)¤Requisition.Req¤","RetColsGR":"Requisition.Key¤Requisition.JobTitle¤Requisition.fk_Code_Full_Part¤[Requisition.fk_Code_Full_Part]OLD.Description(sysfk_Code_Full_PartDesc)¤Requisition.fk_Code_Location¤[Requisition.fk_Code_Location]OLD.Description(sysfk_Code_LocationDesc)¤Requisition.fk_Code_Dept¤[Requisition.fk_Code_Dept]OLD.Description(sysfk_Code_DeptDesc)¤Requisition.Req¤","ResultSort":"" },
                                        callback=self.parse_main_list)]
   def parse_main_list(self, response):
       hxs = HtmlXPathSelector(response)
       firstpage_urls = hxs.select("//table[@class='Tbl']/tr/td/table/tr/td")

   for link in firstpage_urls:
       hrefs = link.select('a/@href').extract()

【问题讨论】:

标签: python scrapy


【解决方案1】:

Scrapy 不允许你“执行 javascript 提交函数”。为此,您必须使用 Splash 或支持与 JavaScript 交互的类似替代方法。 Scrapy 仅适用于底层 HTML。

解决 Scrapy 问题的方法是弄清楚 JavaScript 代码如何构建请求,并使用 Scrapy 重现这样的请求。

要弄清楚 JavaScript 代码的作用,您有两种选择:

  • 在页面 JavaScript 代码中找到 sysSubmitForm() 的定义,自己阅读 JavaScript 代码了解它的作用。

  • 使用 Web 浏览器开发者工具的“网络”选项卡查看触发该 JavaScript 代码时向服务器发送的请求,并检查请求以确定如何自己构建类似的请求。

【讨论】:

    【解决方案2】:

    使用内置的 FormRequest 或 FormRequest.from_response 函数 - 在它们内部指定要提交给表单的数据。

    【讨论】:

      猜你喜欢
      • 2012-05-25
      • 2012-05-25
      • 2018-11-14
      • 2012-12-14
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 2019-09-29
      相关资源
      最近更新 更多