Scrapy Python填充表单并获取数据
我正在尝试使用Scrapy从网站自动下载数据 我要做的是:Scrapy Python填充表单并获取数据,python,forms,web-scraping,scrapy,scrapy-spider,Python,Forms,Web Scraping,Scrapy,Scrapy Spider,我正在尝试使用Scrapy从网站自动下载数据 我要做的是: 使用我的凭据登录网站 通过在“RIC”行上编写代码并选择感兴趣的时段,选择我想要的数据 单击“获取数据”后,将生成.csv文件,我可以从“下载/”url下载该文件,我的所有文件如下所示: 我可以使用“FormRequest”登录。因此,为了填写“RIC”代码并单击“获取数据”按钮,我也考虑过这样做,但失败了。(我现在更改日期不是为了了解它的工作原理) 这是我的代码: class DmozSpider(scrapy.Spider)
- 使用我的凭据登录网站
- 通过在“RIC”行上编写代码并选择感兴趣的时段,选择我想要的数据
- 单击“获取数据”后,将生成.csv文件,我可以从“下载/”url下载该文件,我的所有文件如下所示:
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>
RIC:(一个或多个RIC,用空格分隔)
开始日期:DateInput('beginDate',true,'YYYYMMDD','20110303')
结束日期:DateInput('endDate',true,'YYYYMMDD','20110306')
我从日志中获得的错误:
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
2015-10-20 18:49:53[scrapy]调试:重试(失败1次):500内部服务器错误
2015-10-20 18:49:53[scrapy]调试:重试(失败2次):500内部服务器错误
2015-10-20 18:49:53[scrapy]调试:放弃重试(失败3次):500内部服务器错误
2015-10-20 18:49:53[scrapy]调试:爬网(500)(参考:http://myDomain/dataServices/)
2015-10-20 18:49:53[scrapy]调试:忽略响应:HTTP状态代码未处理或不允许
你知道我做错了什么吗?formxpath kwarg应该是一个实际包含表单元素的xpath,如“将使用与xpath匹配的第一个表单”中所示。因此,如果html页面中只有一个表单,则无需使用“formxpath” 在这种情况下,在提交表单时,您需要适当地构造“formdata”,它应该具有ric、beginDate和endDate的值(基本上是所有表单元素,如input、select等,它们在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)