Scrapy 实现模拟登录-抓取登录之后的页面

鳄鱼君Ba

发表文章数:518

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python教程 » Scrapy 实现模拟登录-抓取登录之后的页面

为什么需要登录?是为了我们可以获取到登陆后的页面。我们回顾requests是如何模拟登录的,有两种方式,第一种是直接携带cookies请求页面,第二种是找接口发送Post请求,然后存储Cookies,那么Selenium是如何模拟登录的,同样是找到对应的登陆页面,传入账户和密码等参数,登录之后获取Cookies,然后添加cookies,并请求登录之后的页面。

Scrapy实现登录,也有两种方式,第一种就是直接携带Cookies,第二种是找到发送Post请求的url地址,带上账户和密码等信息,发送请求。

Scrapy模拟登录之携带Cookies

我们可以直接携带Cookies登录,主要应用场景:

  • 1.Cookies过期时间很长,常见于一些不规范的网站
  • 2.能在Cookies过期之前把数据拿到
  • 3.配合其他程序使用,比方说使用selenium把登录之后的Cookies获取保存到本地,Scrapy返送请求之前先读取本地的Cookies

我们在使用Scrapy创建爬虫的时候,有个start_url变量,这个是我们开始请求的url地址,那么start_url是谁请求的呢?那么我们可以查看源码,我们定义spider下的start_url默认都是交给start_requests处理的,所以我们如果想在之前做一些事情,比方说加入cookies,headers都可以,可以重写start_requests。

我们通过演示模拟登录蜂窝来说明:

# -*- coding: utf-8 -*-
import scrapy
import re

class FwSpider(scrapy.Spider):
    name = 'fw'
    allowed_domains = ['mafengwo.cn']
    #开始的url为我们个人主页
    start_urls = ['http://mafengwo.cn/u/52891300.html']
    def start_requests(self):
        #添加headers
        headers={
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
            'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9,am;q=0.8',
        'Connection': 'keep-alive',
        'Host': 'www.mafengwo.cn',
        'Referer': 'http://www.mafengwo.cn/u/52891300.html',
        'Upgrade-Insecure-Requests': 1,
        #可以添加UA,或者在settings更换
        }
        #我们手动登录马蜂窝,找到cookies,cookies格式 通过:分割,等号左边(key):等号右边(value)
        cookies="使用谷歌浏览器登录,然后复制cookies到这里"
        cookies={i.split('=')[0]:i.split('=')[1] for i in cookies.split('; ')}
        yield scrapy.Request(
            self.start_urls[0],
            cookies=cookies,
            headers=headers,
            callback=self.parse,
        )
    def parse(self, response):
        print(response.body.decode())
        name=re.findall('<div class="MAvaName">(.*?)</div>',response.body.decode(),re.S)[0]
        print(name)

上面的代码我们重写了start_requests函数,在最开始请求的url上,我们添加了headers和cookies,这里经过测试,cookies放到headers中,还是成功的获取到我的用户名,按理说不应该成功的,具体可参考:scrapy.Request的参数

如果在输入scrapy crawl 爬虫名字(fw)时,无任何输出,那么就是失败,如果输出的内容用户名为空,呢也是失败,就是访问不了我们的个人页面,没有登录成功。

通常一般的网站是没有反爬测试的,添加cookies就可成功获取到登陆之后的页面,如果遇到一些网站添加cookies仍不能成功,就是做了反爬测试,具体报错就是错过了个人中心的页面,那么我们可以再添加headers参数,其中最为重要的参数就是HOST和Referer,这样应该是可以成功的,目前没有遇到特殊的url。

那么我们是否可以请求包括个人页面,但不仅限于个人页面,当然是可以了。Scrapy的settings有个配置文件COOKIES_ENABLED,默认为False,就是已经启用了cookies,然后再开启COOKIES_DEBUG=TRUE,就可以看到cookie在不同解析函数中是如何传递的。

#COOKIES_ENABLED=False cookie在settings是默认开启的
COOKIES_DEBUG=True  #前提是cookie开启,即COOKIES_ENABLES=False

关闭settings文件中的LOG_LEVEL=’WARNING’,如果添加的话。那么我们重新运行爬虫,就可以看到很多Set-Cookie的字段,这些就是cookie的传递过程,不在详细说明。

不仅仅是蜂窝网,我们对任何的网站,想要获取登录后的页面,就可以使用这种方式。

未经允许不得转载:作者:鳄鱼君Ba, 转载或复制请以 超链接形式 并注明出处 鳄鱼君Ba
原文地址:《Scrapy 实现模拟登录-抓取登录之后的页面》 发布于2020-03-16

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

8 + 8 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册