爬取网址:http://example.webscraping.com

1.观察登陆时的信息
登陆后可以看到右上方的变化,出现了“欢迎Liu”,同时也可以在分析工具中看到有一个post的“method”。如果在chrome中没有显示“method”,可以在栏目中点击右键添加“method”属性。

选择这个表单数据,然后在Headers的最下方找到Form Data。

另外看回Headers的头部信息,由于Status code为303,表示页面重定向,此时浏览器会读取Response Headers中的Location字段,并根据此路径再次发送一个GET请求。

登陆后可以看到Headers中的Cookie字段,并看到右上方“欢迎Liu”的字样。

2.使用FormRequest进行模拟登陆
① 通过scrapy shell 进行调试:
scrapy shell http://example.webscraping.com/places/default/user/login
② 然后想办法获取表单字段信息:email,password,_formkey,_formname,_next(均为input标签中的name属性)。其中后三个字段信息是隐藏的,我们可以通过查找form元素,然后在Properties中找到这几个字段信息。

③ 可以按照下述方式获取到隐藏的form_data,然后再将账户和密码信息添加进字典即可。
from scrapy.http import FormRequest
form_hinfos = response.xpath('//input[@type="hidden"]')
form_name = form_hinfos.xpath('@name').extract()
form_value = form_hinfos.xpath('@value').extract()
form_data = dict(zip(form_name,form_value))
form_data['email'] = 'liushuo@webscraping.com'
form_data['password'] = '12345678'
request = FormRequest('http://example.webscraping.com/places/default/user/login',formdata=form_data)


④ 当然,也可以不用捕捉隐藏的input,使用FormRequest的from_response方法即可。使用from_response方法时,需要传入一个Response对象作为第一个参数,然后from_response方法会自动解析Response对象中的<form>元素,并将隐藏在<input>中的信息自动填入表单数据。这样的话,我们采用form_request方法,只需提供账户和密码即可:
from scrapy.http import FormRequest
form_data = {'email':'liushuo@webscraping.com','password':'12345678'}
request = FormRequest.from_response(response,formdata=form_data)

⑤ 使用上述③或④的方法构造好request(均属于FormRequest对象)后,就可以提交表单请求,在结果中可以看到scrapy先发送一个Post请求,然后自动发送一个get请求来跳转页面。最后验证是否登录,可以看到模拟登陆成功了。实质上,第二个get请求携带了第一个post请求获取的Cookie信息,而这个添加Cookie信息的工作由Scrapy内置的下载中间件CookiesMiddleware自动完成。

⑥ 可以尝试提取登陆后的个人页面信息


按照下图命令即可得到个人信息。值得注意的是,我们在页面上看到keys显示的是中文,但是通过scrapy进行请求时获取的是英文keys信息,所以实际得到的信息均为英文。这也是我们需要调用view(response)来看到最终的Response信息。


3.将上述内容进行总结,实现登陆spider
代码如下:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import FormRequest
class LoginSpider(scrapy.Spider):
name = 'login'
allowed_domains = ['example.webscraping.com']
start_urls = ['http://example.webscraping.com/places/default/user/profile']
##-------------------------------进行登录-------------------------------
#登录URL
login_url = "http://example.webscraping.com/places/default/user/login"
#改写start_requests方法
def start_requests(self):
yield scrapy.Request(self.login_url,callback=self.login)
#登录页面的信息处理
def login(self,response):
form_data = {'email': 'liushuo@webscraping.com', 'password': '12345678'}
yield FormRequest.from_response(response, formdata=form_data,callback=self.parse_login)
#登录成功后,会自动抓取start_urls中的网址,并用parse方法解析。
def parse_login(self,response):
if "Welcome Liu" in response.text:
yield from super().start_requests() #继承基类的start_requests方法,处理完会自动跳转到parse方法。
##-------------------------------登录后-------------------------------
#登录后的信息解析工作
def parse(self, response):
keys = response.xpath('//td[@class="w2p_fl"]/label/text()').re('(.*?):')
values = response.xpath('//td[@class="w2p_fw"]/text()').extract()
yield dict(zip(keys,values))
网友评论