Python数据爬虫学习笔记(20)Scrapy模拟登录实现豆瓣用户信息爬虫

一、需求:在豆瓣官网中,使用Scrapy实现模拟登录,并爬取登录后的个人中心界面中的用户名及日记信息数据。

二、实现思路:

1、关于用户名与密码以及其提交网址:

    观察登录网页的源代码,注意到用户名与密码都使用不同name属性的input来输入。

     登录信息的提交网址为,这个网址可以在源代码中找到,但是非常建议使用Fiddler进行抓包分析得到,方法是首先对Fiddler进行clear,然后故意输入错误的用户名密码,点击登录,Fiddler立即回抓到登录信息的提交链接:

2、关于爬取的信息:

    1)用户名称:在网页的title标签中。

    2)日记内容:被class属性为note的div标签所包围。

2、关于处理豆瓣的反爬机制:

    1)伪装浏览器,获取浏览器的header,可参考Python数据爬虫学习笔记(6)爬虫异常处理与浏览器伪装

    2)登录验证码,采用半自动输入的方式,在实际工作时可以使用打码api实现。

三、编写Scrapy项目代码:

1、settings.py(非常重要):

#非常重要!否则运行爬虫会报crawl(403)的错误,无法爬取信息
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}
ROBOTSTXT_OBEY = False

2、soubanSpider.py(笔者创建的Scrapy爬虫文件):

import scrapy
from scrapy.http import Request,FormRequest
#导入用于爬取网页验证码
import urllib.request

class DoubanspiderSpider(scrapy.Spider):
    name = 'doubanSpider'
    allowed_domains = ['douban.com']
    #浏览器的header
    header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36 OPR/54.0.2952.71"}
    #start_urls = ['http://www.douban.com/']
    #设置提交登录信息的网址,注意要设置cookie储存登录信息以实现连续爬取
    def start_requests(self):
        return [Request("https://accounts.douban.com/login", callback=self.parse, meta={"cookiejar": 1})]

    #处理数据的方法
    def parse(self, response):
        #尝试获取网页中的验证码链接
        captcha = response.xpath("//img[@id='captcha_image']/@src").extract()
        #根据是否爬取到了验证码图片执行相关处理
        if len(captcha) > 0:
            print("此时有验证码")
            #爬取验证码图片至本地,提示用户进行输入
            localpath = "E:/Scrapy/result/captcha.png"
            urllib.request.urlretrieve(captcha[0], filename=localpath)
            print("请查看本地验证码图片并输入验证码")
            captcha_value = input()
            #设置需要提交至登录URL的数据,包括用户名、密码、验证码以及登录成功的回调页
            data = {
                "form_email": "正确的用户名",
                "form_password": "正确的对应密码",
                "captcha-solution": captcha_value,
                "redir": "https://www.douban.com/people/164741792/",
            }
        else:
            print("此时没有验证码")
            #设置需要提交至登录URL的数据,包括用户名、密码以及登录成功的回调页
            data = {
                "form_email": "正确的用户名",
                "form_password": "正确的对应密码",
                "redir": "https://www.douban.com/people/164741792/",
            }
        print("登录……")
        #登录成功后执行后续方法
        return [FormRequest.from_response(response,
                                          meta={"cookiejar": response.meta["cookiejar"]},
                                          headers=self.header,
                                          formdata=data,
                                          callback=self.next,
                                          )]

    #登录成功后,提取用户信息
    def next(self, response):
        print("此时已经登陆完成并爬取了个人中心的数据")
        title = response.xpath("/html/head/title/text()").extract()
        note = response.xpath("//div[@class='note']/text()").extract()
        print(title[0])
        print(note[0])

四、运行结果:

1、输入命令运行爬虫,等待出现输入验证码提示:

2、到对应目录查看验证码图片,本博文存储在E盘Scrapy的result文件夹中:

3、之后输入验证码,即可查看爬取结果:

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值