七. 模拟登陆webscraping.com网站

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

七. 模拟登陆webscraping.com网站_第1张图片
image.png
1.观察登陆时的信息

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


七. 模拟登陆webscraping.com网站_第2张图片
image.png

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


七. 模拟登陆webscraping.com网站_第3张图片
image.png

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


七. 模拟登陆webscraping.com网站_第4张图片
image.png

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


七. 模拟登陆webscraping.com网站_第5张图片
image.png
2.使用FormRequest进行模拟登陆

① 通过scrapy shell 进行调试:
scrapy shell http://example.webscraping.com/places/default/user/login

② 然后想办法获取表单字段信息:email,password,_formkey,_formname,_next(均为input标签中的name属性)。其中后三个字段信息是隐藏的,我们可以通过查找form元素,然后在Properties中找到这几个字段信息。


七. 模拟登陆webscraping.com网站_第6张图片
image.png

③ 可以按照下述方式获取到隐藏的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'] = '[email protected]'
form_data['password'] = '12345678'

request = FormRequest('http://example.webscraping.com/places/default/user/login',formdata=form_data)
七. 模拟登陆webscraping.com网站_第7张图片
image.png

七. 模拟登陆webscraping.com网站_第8张图片
image.png

④ 当然,也可以不用捕捉隐藏的input,使用FormRequest的from_response方法即可。使用from_response方法时,需要传入一个Response对象作为第一个参数,然后from_response方法会自动解析Response对象中的

元素,并将隐藏在中的信息自动填入表单数据。这样的话,我们采用form_request方法,只需提供账户和密码即可:

from scrapy.http import FormRequest
form_data = {'email':'[email protected]','password':'12345678'}
request = FormRequest.from_response(response,formdata=form_data)
image.png

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


image.png

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


七. 模拟登陆webscraping.com网站_第9张图片
image.png

七. 模拟登陆webscraping.com网站_第10张图片
image.png

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


七. 模拟登陆webscraping.com网站_第11张图片
image.png
七. 模拟登陆webscraping.com网站_第12张图片
image.png
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': '[email protected]', '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))

你可能感兴趣的:(七. 模拟登陆webscraping.com网站)