提交多个表单并实现分页

Submitting multiple forms in scrapy and achieving pagination

本文关键字:实现 分页 表单 提交      更新时间:2023-09-26

我是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'

关键函数是你的回调。例如parse方法。当下载 start_urls 中的页面时调用它,并且该页面的响应作为参数传递给 parse 方法。

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

如果您要解析的页面不包含任何数据(例如,它是一个类别页面(或仅包含您需要的部分数据,并且您在其中发现了指向包含 [其他] 数据的其他页面的链接,则不会yield项目,而是生成一个包含另一个页面的 URL 和另一个回调的Request实例。

FormReques t 是 Request 的一个子类,所以你可以根据需要从解析方法中产生任意数量的 FormRequest s。

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