码迷,mamicode.com
首页 > 编程语言 > 详细

python爬虫scrapy之登录知乎

时间:2017-11-28 23:16:30      阅读:476      评论:0      收藏:0      [点我收藏+]

标签:put   x64   分享图片   输入   win64   谷歌   输入验证码   windows   except   

下面我们看看用scrapy模拟登录的基本写法:

  注意:我们经常调试代码的时候基本都用chrome浏览器,但是我就因为用了谷歌浏览器(它总是登录的时候不提示我用验证码,误导我以为登录时不需要验证码,其实登录时候必须要验证码的),这里你可以多试试几个浏览器,一定要找个提示你输入验证码的浏览器调试。

  1、我们登录的时候,提示我们输入验证码,当验证码弹出之前会有个请求,我们打开这个请求,很明显,type是login,验证码无疑了,就算是看请求的因为名,你也应该知道这个就是验证码的请求,或者打开这个验证码的请求url,这。

  技术分享图片

  验证码的图片,悲惨了,这怎么整。别着急。。

  技术分享图片

  2、验证码提示我们要点击倒着写的字体,这。。。,爬虫和反爬虫就是无休止的互相折磨。这明显就是上面那个图片的信息。

  技术分享图片

  3、机智的我,发现验证码的请求参数里面有三个参数,r是一个13位的数字,type是登录用的,lang很可疑,改改它,把cn给他改成en。

 

技术分享图片

 

 

  技术分享图片

 

 

代码如下:

import json
import scrapy
import time
from PIL import Image


class ZhihuloginSpider(scrapy.Spider):
    name = ‘zhihu_login‘
    allowed_domains = [‘zhihu.com‘]
    start_urls = [‘https://www.zhihu.com/‘]
    header = {
        ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,‘
                                            ‘ like Gecko) Chrome/62.0.3202.94 Safari/537.36‘,
    }

    def parse(self, response):
        #主页爬取的具体内容
        print(response.text)

    def start_requests(self):
        ‘‘‘
        1、首先构造并抓取登录需要提交的验证码
        :return:
        ‘‘‘
        t = str(int(time.time() * 1000))
        captcha_url = ‘https://www.zhihu.com/captcha.gif?r={0}&type=login&lang=en‘.format(t)
        return [scrapy.Request(url=captcha_url, headers=self.header, callback=self.parser_captcha)]

    def parser_captcha(self, response):
        ‘‘‘
        1、根据start_requests方法返回的验证码,将它存入本地
        2、打开下载下来的验证码
        3、这里是需要手动输入的,这里可以接入打码平台
        :param response:
        :return:
        ‘‘‘
        with open(‘captcha.jpg‘, ‘wb‘) as f:
            f.write(response.body)
            f.close()
        try:
            im = Image.open(‘captcha.jpg‘)
            im.show()
            im.close()
        except:
            pass
        captcha = input("请输入你的验证>")
        return scrapy.FormRequest(url=‘https://www.zhihu.com/#signin‘, headers=self.header, callback=self.login, meta={
            ‘captcha‘: captcha
        })

    def login(self, response):
        xsrf = response.xpath("//input[@name=‘_xsrf‘]/@value").extract_first()
        if xsrf is None:
            return ‘‘
        post_url = ‘https://www.zhihu.com/login/phone_num‘
        post_data = {
            "_xsrf": xsrf,
            "phone_num": ‘你的账户名称‘,
            "password": ‘你的账户密码‘,
            "captcha": response.meta[‘captcha‘]
        }
        return [scrapy.FormRequest(url=post_url, formdata=post_data, headers=self.header, callback=self.check_login)]

    # 验证返回是否成功
    def check_login(self, response):
        js = json.loads(response.text)
        print(js)
        if ‘msg‘ in js and js[‘msg‘] == ‘登录成功‘:
            for url in self.start_urls:
                print(url)
                yield scrapy.Request(url=url, headers=self.header, dont_filter=True)
        else:
            print("登录失败,请检查!!!")

  

python爬虫scrapy之登录知乎

标签:put   x64   分享图片   输入   win64   谷歌   输入验证码   windows   except   

原文地址:http://www.cnblogs.com/lei0213/p/7912619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!