Scrapy从入门到精通(6)--模拟登录

有些网站需要登录后才能爬取到有用的信息,Scrapy先模拟登录,再进行信息爬取。

登录实质

理解登录的实质,跟踪一次登录操作

http://example.webscraping.com/

这里写图片描述
页面的表单对应的HTML的 《form》,log in会根据form元素的内容发送一个http请求给服务器

  • method决定请求方法 post
  • action 请求的url (#为当前页面)
  • enctype 编码类型
  • 《input》表单数据的内容
    再来看《form》中的《input》元素:

  • name属性为‘email’和‘password’的两个input

  • 在《div style=’display:none’》中包含了3个隐藏的《input type=”hidden”》
    这里写图片描述
    分析请求信息
    从图中可以看出,捕获到很多http请求,其中第一个就是发送登录表单的post请求,可以找到url、请求方法(method)、请求头部(header)、表单数据(form data)等信息
    这里写图片描述
    form data中的数据
    表单数据由多个键值对构成,每个键值对对应一个input,上图中并不是实际的POST正文(count),这样的显示方式只是为了方便用户查看。点击view source,可以看到实际的POST正文。这样显示只是未来方便查看。
    这里写图片描述
    分析相应信息
    这里写图片描述
    Set-Cookie:网站服务器保存的cookie
    Status Code:303 SEE OTHER :303代表重定向 读取location字段,再发送一个get请求
    这里写图片描述
    观察request头部的信息,它携带了之前POST请求获取的cookie信息,最终浏览器用该请求相应了html文档刷新了页面。

Scrapy模拟登录

使用FormResquset
前期讲解了登录的实质,核心是向服务器发送含有登录表单数据的HTTP请求(通常是post).Scrapy提供了一个FormRequest类(Request的子类),专门用于构造含有表单数据的请求,FormRequest的构造方法有一个Formdata参数,接收字典形式的表单数据。接下来,我们在scrapy shell环境下演示用FormRequest模拟登录。
首先爬取登录页面信息

scrapy shell http://example.webscraping.com/user/login

上面已经分析过了,表单数据对应包含的信息、账号和密码信息,再加三个隐藏中的信息。先把这些信息收集到一个字典中,然后使用这个表单数据字典构造FormRequest对象:

#先提取3个隐藏<input>中包含的信息,它们在<div style="dispaly:none;">中
sel = response.xpath('//div[@style]/input')
#构造表单数据字典
fd = dict(zip(sel.xpath('./@name').extract(),sel.xpath('./@value').extract()))
#填写账号和密码信息
fd['email'] = '******'
fd['password'] = '********'
from scrapy.http import FormRequest
requset = FormResquset('http://example.webscrapying.com/user/login',formdata = fd)

以上直接构造FormRequest对象的方式,还有一种更加简单的方式,即调用FormRequest的from_response方法。调用时需要传入一个response对象作为第一个参数,该方法会解析Response对象所包含页面的《form》元素,帮助用户创建FormRequest对象,并将隐藏《input》中的信息自动填充表单数据。这方法只需要通过formdata参数填写账号密码即可

这里写代码片

猜你喜欢

转载自blog.csdn.net/weixin_39381833/article/details/81078551