七.|七. 模拟登陆webscraping.com网站

【七.|七. 模拟登陆webscraping.com网站】爬取网址:http://example.webscraping.com
七.|七. 模拟登陆webscraping.com网站
文章图片
image.png 1.观察登陆时的信息 登陆后可以看到右上方的变化,出现了“欢迎Liu”,同时也可以在分析工具中看到有一个post的“method”。如果在chrome中没有显示“method”,可以在栏目中点击右键添加“method”属性。

七.|七. 模拟登陆webscraping.com网站
文章图片
image.png 选择这个表单数据,然后在Headers的最下方找到Form Data。

七.|七. 模拟登陆webscraping.com网站
文章图片
image.png 另外看回Headers的头部信息,由于Status code为303,表示页面重定向,此时浏览器会读取Response Headers中的Location字段,并根据此路径再次发送一个GET请求。

七.|七. 模拟登陆webscraping.com网站
文章图片
image.png 登陆后可以看到Headers中的Cookie字段,并看到右上方“欢迎Liu”的字样。

七.|七. 模拟登陆webscraping.com网站
文章图片
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网站
文章图片
image.png ③ 可以按照下述方式获取到隐藏的form_data,然后再将账户和密码信息添加进字典即可。

from scrapy.http import FormRequestform_hinfos = response.xpath('//input[@type="hidden"]') form_name = form_hinfos.xpath('@name').extract() form_value = https://www.it610.com/article/form_hinfos.xpath('@value').extract() form_data = https://www.it610.com/article/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=https://www.it610.com/article/form_data)

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

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

七.|七. 模拟登陆webscraping.com网站
文章图片
image.png ⑥ 可以尝试提取登陆后的个人页面信息

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

七.|七. 模拟登陆webscraping.com网站
文章图片
image.png 七.|七. 模拟登陆webscraping.com网站
文章图片
image.png 3.将上述内容进行总结,实现登陆spider 代码如下:
# -*- coding: utf-8 -*- import scrapy from scrapy.http import FormRequestclass 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 = https://www.it610.com/article/{'email': 'liushuo@webscraping.com', 'password': '12345678'} yield FormRequest.from_response(response, formdata=https://www.it610.com/article/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))

    推荐阅读