如何使用不同的值多次提交一个表单?

时间:2015-05-12 15:47:59

标签: python web-scraping web-crawler scrapy

背景
我一般都非常习惯使用Scrapy和webscraping,我正在尝试访问目标网页,填写目前的表单,提交该表单并从已返回项目的页面中删除数据。完成这些步骤后,我想回到目标网页,填写包含不同信息的表单,抓取已返回的数据,并将此数据附加到这些相同的项目。

我有什么
以下代码填写目标表单,抓取返回的页面以获取信息,并将该信息放入项目中。

import scrapy
from AirScraper.items import AirscraperItem

class airSpider(scrapy.Spider):
    name = "airSpider"
    start_urls = ["https://book.jetblue.com"]
    origin = "MCO"
    dest = "BOS"
    dateDep = "2015-05-13"
    dateRet = "2015-05-15"

    def parse(self, response):
        return scrapy.FormRequest.from_response(
            response,
            formname = "searchForm",
            formdata={'origin' : self.origin, 'destination' : self.dest, 'departureDate' : self.dateDep, 'returnDate' : self.dateRet},
            callback=self.after_search
        )

    def after_search(self, response):
        flights = response.xpath('//*[contains(@class, "flight-row no-mint")]')
        for sel in flights:
            #scrape data about target flight
            yield item

我需要什么
一旦我从第一个表单请求中删除了数据,我就需要返回到原始表单页面,用类似的数据填充它,然后抓取它的结果。我只是不确定如何告诉蜘蛛返回第一页并执行一系列不同的操作。

1 个答案:

答案 0 :(得分:1)

事实证明,这实际上非常简单 在parse方法中,只需使用以下代码替换单个return:

def parse(self, response):
    yield scrapy.FormRequest.from_response(
        response,
        formname = "searchForm",
        formdata={'origin' : self.origin, 'destination' : self.dest, 'departureDate' : self.dateDep, 'returnDate' : self.dateRet},
        callback=self.after_search
    )

    yield scrapy.FormRequest.from_response(
        response,
        formname = "searchForm",
        formdata={'origin' : self.NEWorigin, 'destination' : self.NEWdest, 'departureDate' : self.NEWdateDep, 'returnDate' : self.NEWdateRet},
        callback=self.after_search_2
    )

这将使您已定义的蜘蛛执行第一次和第二次搜索,并使用您已定义的任何新信息。