美文网首页
利用scrapy登录豆瓣

利用scrapy登录豆瓣

作者: caelansar | 来源:发表于2018-08-02 11:13 被阅读0次

    利用scrapy登录豆瓣

    一、网页分析

    1533178210298.png

    豆瓣的登录页面如上,如果你是第一次登陆是不需要输入验证码的,当多次登录失败后将出现验证码。

    点击登录并抓包,得到如下的参数

    1533178357775.png

    其中form_email和form_password分别是用户名和密码,captcha-solution是输入的验证码, captcha-id为验证码id, 在对登录网址进行get请求时可以得到

    1533178553839.png

    这样我们就能大概有了一个思路:

    首先get请求登录页面, 若有验证码则保存本地, 并提取出captcha-id, 之后post请求登录页,完成登录过程, 若无验证码则直接发送post请求。整体流程没有难度, 所有字段都是明文,没有任何加密。

    二、代码实现

    scrapy的项目结构如下:

    1533178806702.png

    编写start.py脚本用于启动scrapy:

    from scrapy import cmdline
    
    if __name__ == '__main__':
        cmdline.execute('scrapy crawl db'.split())
    

    主要代码db.py

    import scrapy
    from PIL import Image
    import urllib
    class DbSpider(scrapy.Spider):
        name = "db"
        # allowed_domains = ["douban.com"]
        start_urls = (
            'https://accounts.douban.com/login',
        )
    
        def parse(self, response):
            captcha =response.xpath("//img[@id='captcha_image']/@src").extract_first()
            if captcha:
                print captcha
                print 'find captcha...'
                urllib.urlretrieve(captcha, 'captcha.jpg')
                Image.open('captcha.jpg')
                cap = raw_input('input captcha manually:')
                captcha_id = response.xpath("//input[@name='captcha-id']/@value").extract_first()
                print captcha_id
                yield scrapy.FormRequest(
                    url='https://accounts.douban.com/login',
                    formdata={
                        'source': 'None',
                        'redir': 'https://www.douban.com /',
                        'form_email': 'xxxxxxxx',
                        'form_password': 'xxxxxxxx',
                        'login': '登录',
                        'captcha-solution': cap,
                        'captcha-id': captcha_id
                    },
                    callback=self.parse_after_login,
                )
            else:
                print 'no captcha'
                yield scrapy.FormRequest(
                    url='https://accounts.douban.com/login',
                    formdata={
                        'source': 'None',
                        'redir': 'https://www.douban.com /',
                        'form_email': 'xxxxxxx',
                        'form_password': 'xxxxxx',
                        'login': '登录',
                    },
                    callback=self.parse_after_login,
                )
    
    
        def parse_after_login(self, response):
            print response.url
            if 'caelansar' in response.body: # 如果用户名在页面中,则登录成功
                print 'login success'
            else:
                print 'fail'
    

    需要注意的是,必须要在setting中设置USER_AGENT, 否则访问登录页将出现403错误。

    相关文章

      网友评论

          本文标题:利用scrapy登录豆瓣

          本文链接:https://www.haomeiwen.com/subject/rfejvftx.html