【问题标题】:Scrapy Python fill form and get dataScrapy Python 填写表单并获取数据
【发布时间】:2015-10-20 17:15:45
【问题描述】:

我正在尝试使用 Scrapy 从网站自动下载数据。

我要做的是:

  • 使用我的凭据登录网站

  • 通过在“RIC”行上编写代码并选择感兴趣的时间段来选择我想要的数据

  • 单击“获取数据”后,将生成 .csv 文件,我可以从“下载/”网址下载它,我的所有文件都可以像这样使用:

我可以使用“FormRequest”登录。因此,我考虑这样做以填充“RIC”代码并单击“获取数据”按钮,但这失败了。 (我现在不是为了了解它的工作原理而更改日期)

这是我的代码:

class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["myDomain"]
start_urls = [
    "http://myDomain/dataServices/"
]

def parse(self, response):
    return scrapy.FormRequest.from_response(
        response,
        formdata={'username': 'myName', 'password': 'myPass'},
        callback=self.after_login
    )

def after_login(self, response):
    # check login succeed before going on
    if "Your email adress and password did not match" in response.body:
        print("\n\nFAIL\n\n")
        self.logger.error("Login failed")
        return

    else:
        print("\n\n LOGIN SUCCESSFUL \n\n")

        filename = response.url.split("/")[-2] + '.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
        ## THIS FAILS !!!
        return scrapy.http.FormRequest.from_response(
            response,
            formxpath='//input[@value = ""]',
            formdata={'value': 'DJ@'},
            clickdata={'value': 'Get data'},
            callback= self.foo
        )

这是表单的html:

<form method="post" action="."><div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='6b16efca43f6d99b34e46561ebf6a1ab' /></div>
RIC (s) : <input name="ric" value=""  size="20" />(one or several rics separated by spaces)<br /><br />
Begin date : <script>DateInput('beginDate', true, 'YYYYMMDD','20110303')</script>
<!-- <input type="button" onClick="alert(this.form.orderdate.value)" value="Show date value passed"> -->

<!--<input name="beginDate" value=""  size="60" /> --><br />
End Date : <script>DateInput('endDate', true, 'YYYYMMDD','20110306') </script><br />
<input type="submit" value="Get data" /> </form>

我从日志中得到的错误:

2015-10-20 18:49:53 [scrapy] DEBUG: Retrying <POST http://myDomain/dataServices/> (failed 1 times): 500 Internal Server Error
2015-10-20 18:49:53 [scrapy] DEBUG: Retrying <POST http://myDomain/dataServices/> (failed 2 times): 500 Internal Server Error
2015-10-20 18:49:53 [scrapy] DEBUG: Gave up retrying <POST http://myDomain/dataServices/> (failed 3 times): 500 Internal Server Error
2015-10-20 18:49:53 [scrapy] DEBUG: Crawled (500) <POST http://myDomain/dataServices/> (referer: http://myDomain/dataServices/)
2015-10-20 18:49:53 [scrapy] DEBUG: Ignoring response <500 http://myDomain/dataServices/>: HTTP status code is not handled or not allowed

你知道我做错了什么吗?

【问题讨论】:

    标签: python forms web-scraping scrapy scrapy-spider


    【解决方案1】:

    'formxpath' kwarg 应该是一个 xpath,它实际上包含一个表单元素,如 documentation 中所示 - “将使用与 xpath 匹配的第一个表单”。所以,如果 html 页面中只有一个表单,则无需使用 'formxpath'。

    在这种情况下,在提交表单时,您需要适当地构造“formdata”,它应该具有 ric、beginDate 和 endDate 的值(基本上所有表单元素,如输入、选择等,在 html 中没有默认值或其值需要更改/覆盖),就像您的代码用于登录表单提交一样。

        return scrapy.FormRequest.from_response( response,
            formdata={'ric': 'Some RIC Code', 'beginDate': '20110303', 'endDate': '20110306'},
            callback=self.after_ric_form_submit
        )
    
    def after_ric_form_submit(self, response):
        #go to download page...
        yield Request('http://myDomain/download/', callback = self.download_csv)
    

    【讨论】:

      猜你喜欢
      • 2020-06-06
      • 2016-05-18
      • 2019-10-17
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多