【问题标题】:Submitting multiple forms in scrapy and achieving pagination在scrapy中提交多个表单并实现分页
【发布时间】:2012-05-27 23:27:03
【问题描述】:

我是scrapy的新手,我正在抓取一个由职位组成的基于工作的网站,即,当我们点击职位时,将打开一个新页面,其中包含我需要获取的数据。

例如页面包含如下格式的表格,

      Job Title                  Full/Part Time                             Location/Affiliates
1.   Accountant                   Full Time                           Mount Sinai Medical Center (Manhattan)  
2.   Accountant                   Full Time                           Mount Sinai Medical Center (Manhattan) 
3.   Admin Assistant              Full Time                           Mount Sinai Hospital (Queens) 
4.   Administrative Assistant     Full Time                      Mount Sinai Medical Center (Manhattan)  


Page:  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 

上面提到的所有职位都是 javascript 生成的链接,我需要提交所有带有值的 javascript 链接(使用 firebug 查找)。如何一次提交多个表单,或者如何编写一种循环所有表单的方法职位链接,以便我们可以从职位的每个链接中获取数据。

我还需要对上面提到的所有页面进行分页,当我点击第 2 页时,会打开一个页面,该页面由相同的表格格式和不同的职位等组成,我如何在 scrapy 中对这些页面进行分页。

我的代码是

class MountSinaiSpider(BaseSpider):
   name = "mountsinai"
   allowed_domains = ["mountsinaicss.igreentree.com"]
   start_urls = [
       "https://mountsinaicss.igreentree.com/css_external/CSSPage_SearchAndBrowseJobs.ASP?T=20120517011617&",
   ]

# This method is for submitting starting page with some values for clicking "Find Jobs"
   def parse(self, response):
       return [FormRequest.from_response(response,
                                        formdata={ "Type":"CSS","SRCH":"Search 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):
       return [FormRequest.from_response(response,
                                        formdata={ "Key":"","Type":"CSS","InitPage":"1","InitURL":"CSSPage_SearchAndBrowseJobs.ASP","SRCH":"earch Jobs","Search":"ISNULL(Requisition.DatePostedExternal, '12/31/9999')¤BETWEEN 1/1/1753 AND Today¥","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":"[sysfk_Code_Full_PartDesc]" },
                                        dont_click = True,
                                        callback=self.parse_fir_pag_urls)]


   def parse_fir_pag_urls(self, response):
       print response'

【问题讨论】:

    标签: javascript python scrapy


    【解决方案1】:

    关键功能是您的回调。例如parse 方法。当下载来自start_urls 的页面时调用它,并将该页面的响应作为参数传递给parse 方法。

    parse 方法中,您通常使用HtmlXPathSelector 分析(解析)页面,并从该页面收集您需要的数据,并将其放入Item。如果你收集了你需要的所有东西,你 yield 该项目和scrapy 检测到它是一个项目并将其传递给管道。

    如果您正在解析的页面不包含任何数据(例如,它是一个类别页面)或仅包含您需要的部分数据,并且您在其上找到了指向带有 [附加] 的其他页面的链接数据,而不是 yielding 一个项目,你产生一个带有另一个页面的 URL 和另一个回调的 Request 实例。

    FormRequest 是Request 的子类,因此您可以根据需要从解析方法中生成任意数量的FormRequests。

    当您最终到达您需要的页面时,在相应的解析方法中提取数据(使用 HtmlXPathSelector)并从该方法中生成一个 Item 实例。

    【讨论】:

    • :谢谢你的回复,那我怎么实现分页呢
    • 在解析搜索结果页面的回调中,生成另一个FormRequest,其中包含获取下一页所需的数据并回调到相同的parse方法。
    • :非常感谢,我明白了这个概念,无论如何你能不能给我一个例子,这样我可以更灵活地安排它。
    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多