如何从已知的html id写入输入数据处理器?

时间:2013-07-30 06:35:29

标签: python web-scraping scrapy

我想抓取这个网页:http://goo.gl/Eqfiuy

我想将输入作为日期从列表中提取,scrapy应该将该值赋予表单,并通过给出响应“打印报告”将其重定向到结果页面。然后我想解析其中的数据。

我的问题是如何让scrapy为html id提供输入日期?

我正在使用scrapy 0.16.5,ubuntu 12.04,firefox + firebug + firefinder

请举一个示例代码

2 个答案:

答案 0 :(得分:1)

基本上,此表单向http://164.100.167.12/pwd/report.php发出POST请求。以下是如何在Scrapy中模拟它:

from scrapy.http import FormRequest
from scrapy.spider import BaseSpider


class MySpider(BaseSpider):
    name = "myspider"
    allowed_domains = ["http://164.100.167.12/"]
    report_date = '30/07/2013'

    def start_requests(self):
        yield FormRequest(url='http://164.100.167.12/pwd/report.php',
                          method='POST',
                          callback=self.parse_page,
                          formdata={'reportdate': self.report_date})

    def parse_page(self, response):
        # save the pdf
        with open('output.pdf', 'w') as f:
            f.write(response.body)

请注意,生成的html中有一个embed标记,里面有一个pdf - 它已保存到output.pdf

希望有所帮助。

答案 1 :(得分:1)

感谢alecxe,这是工作代码:

from scrapy.spider import BaseSpider
from scrapy.http import FormRequest
from datetime import date
from dateutil.rrule import rrule, DAILY

 class MySpider(BaseSpider):
     name = "tnpwd"
     allowed_domains = ["http://164.100.167.12/"]
     start_urls = ["http://164.100.167.12/pwd/report.php"]

     def start_requests(self):
         start_date = date(2012, 06, 15)
         end_date = date(2012, 06, 20)
         for i in rrule(DAILY, dtstart= start_date, until=end_date):
             report_date = i.strftime('%d/%m/%Y')
             file_name = i.strftime('%d_%m_%Y')
             yield FormRequest(url='http://164.100.167.12/pwd/report.php',
                               method='POST',
                               callback=self.parse_page,
                               formdata={'reportdate': report_date},
                               meta = {'file_name': file_name})
     def parse_page(self, response):
        a= response.meta['file_name']
        print 'downloading %s' %a
        with open('/home/USERNAME/Documents/test/%s.pdf' %a, 'w') as f:
            f.write(response.body)