代码之家  ›  专栏  ›  技术社区  ›  Javiar Sandra

对输入来自文本框的网页进行爬网

  •  0
  • Javiar Sandra  · 技术社区  · 9 年前

    我要爬网此网站: https://egov.uscis.gov/casestatus/landing.do

    我的目标是编写一个python脚本,在输入收据编号后,一旦该网页上的状态发生变化,就会立即提醒我。

    我以前从未这样做过,但在这里读了一些:有些人建议 urllib2 和其他 scrapy 。我对这是如何工作的有非常基本的了解。

    但我的问题是:

    当我输入收据编号时,提交后网页的url不会更改。查看源页面,我发现您需要在哪里输入收据编号:

    <input id="receipt_number" name="appReceiptNum" class="form-control textbox  initial-focus" maxlength="13" type="text">`
    

    如何将此收据编号信息传递到 URL库2 发痒的 或任何其他方法。收据编号的示例如下 EAC1590674053 .

    任何提示都非常感谢。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Frank Martin    9 年前

    该网站使用 Form 。所以你需要制作剪贴簿来填写字段并提交表单。我已经编译了一些代码来说明如何使用 scrapy :

    import scrapy
    
    class TestSpider(scrapy.Spider):
    
        name = 'casestatus'
        start_urls = ['https://egov.uscis.gov/casestatus/landing.do']
    
        def parse(self, response):
    
            request = scrapy.FormRequest.from_response(
                response,
                formname='caseStatusForm',
                formdata={'appReceiptNum': 'EAC1590674053'},
                callback=self.parse_caseStatus
            )
            print request.body
            yield request
    
        def parse_caseStatus(self,response):
            sel_current_status = response.xpath('//div[contains(@class,"current-status")]')
            if sel_current_status:
                txt_current_status = sel_current_status.xpath('./text()').extract()
                txt_current_status = " ".join(map(unicode.strip,txt_current_status))
                print txt_current_status
            else:
                print 'NO STATUS FOUND'
    
    # YIELDS THE FOLLOWING OUTPUT FOR ME:
    # [casestatus] DEBUG: Crawled (200) <POST https://egov.uscis.gov/casestatus/mycasestatus.do;jsessionid=A19A03FC933A208A2DDF89D98BE9F32E> (referer: https://egov.uscis.gov/casestatus/landing.do)
    # Case Rejected Because I Sent An Incorrect Fee