“通过之前的分析,我们已经了解了表单数据应包含的信息:账号和密码信息,再加3个隐藏<input>中的信息。”
“信息:账号和密码信息,再加3个隐藏<input>中的信息。先把这些信息收集到一个字典中,然后使用这个表单数据字典构造FormRequest对象:”
“ >>> # 先提取3 个隐藏<input>中包含的信息,它们在<div style="display:none;">中
>>> sel = response.xpath('//div[@style]/input')
>>> sel
[<Selector xpath='//div[@style]/input' data='<input name="_next" type="hidden" value='>,
<Selector xpath='//div[@style]/input' data='<input name="_formkey" type="hidden" val'>,
<Selector xpath='//div[@style]/input' data='<input name="_formname" type="hidden" va'>]
>>> # 构造表单数据字典
>>> fd = dict(zip(sel.xpath('./@name').extract(), sel.xpath('./@value').extract()))
>>> fd
{'_formkey': '432dcb0c-0d85-443f-bb50-9644cfeb2f2b',
'_formname': 'login',
'_next': '/'}
>>> # 填写账号和密码信息
>>> fd['email'] = 'liushuo@webscraping.com'
>>> fd['password'] = '12345678'
>>> fd
{'_formkey': '432dcb0c-0d85-443f-bb50-9644cfeb2f2b',
'_formname': 'login',
'_next': '/',
'email': 'liushuo@webscraping.com',
'password': '12345678'}
>>> from scrapy.http import FormRequest
>>> request = FormRequest('http://example.webscraping.com/user/login', formdata=fd)”
“以上是直接构造FormRequest对象的方式,除此之外还有一种更为简单的方式,即调用FormRequest的from_response方法。调用时需传入一个Response对象作为第一个参数,该方法会解析Response对象所包含页面中的<form>元素,帮助用户创建FormRequest对象,并将隐藏<input>中的信息自动填入表单数据。使用这种方式,我们只需通过formdata参数填写账号和密码即可,代码如下:”
“ >>> fd = {'email': 'liushuo@webscraping.com', 'password': '12345678'}
>>> request = FormRequest.from_response(response, formdata=fd)”
“使用任意方式构造好FormRequest对象后,接下来提交表单请求:
”
“>>> fetch(request)
[scrapy] DEBUG: Redirecting (303) to <GET http://example.webscraping.com/> from
<POST http://example.webscraping.com/user/login>
[scrapy] DEBUG: Crawled (200) <GET http://example.webscraping.com/> (referer: None)
”
“在log信息中,可以看到和浏览器提交表单时类似的情形:POST请求的响应状态码为303,之后Scrapy自动再发送一个GET请求下载跳转页面。此时,可以通过在页面中查找特殊字符串或在浏览器中查看页面验证登录是否成功”
“>>> 'Welcome Liu' in response.text
True
>>> view(response)”
“验证结果表明模拟登录成功了。显然,Scrapy发送的第2个GET请求携带了第1个POST请求获取的Cookie信息,为请求附加Cookie信息的工作是由Scrapy内置的下载中间件CookiesMiddleware自动完成的。现在,我们可以继续发送请求,爬取那些只有登录后才能获取的信息了,这里以爬取用户个人信息为例”
“ >>> fetch('http://example.webscraping.com/user/profile') #下载用户个人信息页面
[scrapy] DEBUG: Crawled (200) <GET http://example.webscraping.com/user/profile>
>>> view(response)”
“提取页面中的用户个人信息”
“ >>> keys = response.css('table label::text').re('(.+):')
>>> keys
['First name', 'Last name', 'E-mail']
>>> values = response.css('table td.w2p_fw::text').extract()
>>> values
['Liu', 'Shuo', 'liushuo@webscraping.com']
>>> dict(zip(keys, values))
{'E-mail': 'liushuo@webscraping.com', 'First name': 'Liu', 'Last name': 'Shuo'}”
“到此,使用FormRequest模拟登录的过程就演示完了。
”
摘录来自: 刘硕. “精通Scrapy网络爬虫。” iBooks.
网友评论