scrapy模拟登陆(手动输入验证码),显示验证码会话无效

发布于 2022-09-05 08:38:03 字数 2540 浏览 22 评论 0

class ZhihuSpider(scrapy.Spider):
    name = "zhihu"
    allowed_domains = ["www.zhihu.com"]
    start_urls = ['https://www.zhihu.com/']
    headers = {
        "HOST": "www.zhihu.com",
        "Referer": "https://www.zhizhu.com",
        'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
    }
    def parse(self, response):
        pass

    def parse_detail(self,response):
        pass

    def start_requests(self):
        return [scrapy.Request('https://www.zhihu.com#signin/', headers=self.headers, callback=self.login) ]


    def login(self,response):
        t = str(int(time.time() * 1000))
        captcha_url = "https://www.zhihu.com/captcha.gif?r={0}&type=login".format(t)
        session = requests.session()
        t = session.get(captcha_url, headers=self.headers)
        with open("captcha.jpg", "wb") as f:
            f.write(t.content)
            f.close()
        captcha = input("输入验证码:")
        response_text = response.text
        pattern = 'name="_xsrf" value="(.*?)"'  # 这里的_xsrf 返回的是一个list
        _xsrf = re.findall(pattern, response_text)
        if _xsrf[0]:
            xsrf = _xsrf[0]
        if xsrf:
            post_url = "https://www.zhihu.com/login/phone_num"
            post_data = {
                "_xsrf": xsrf,
                "phone_num": "手机号",
                "password": "密码",
                "captcha": captcha
            }
            return [scrapy.FormRequest(
                url=post_url,
                formdata=post_data,
                headers=self.headers,
                callback=self.check_login,
                encoding="utf-8"
            )]

    def check_login(self,response):
        text_json = json.load(response.text)
        if "msg" in text_json and text_json["msg"] == "登陆成功":
            for url in self.start_urls:
                yield scrapy.Request(url,dont_filter=True,headers=self.headers)

在check_login之前设置断点都能正常
clipboard.png

clipboard.png
但是在check_login这里设置断点之后
clipboard.png
应该是我代码这里callback=self.check_login回调的原因,但如何修改? 百度了很多callback还是感觉讲的挺模糊

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

太傻旳人生 2022-09-12 08:38:03

因为你获取验证码的会话和抓取网页的会话不是同一个
其实你完全可以自己手动登录好,把cookie信息放到headers里就行啦,不用搞得这么复杂

寂寞美少年 2022-09-12 08:38:03

你好,请问你解决了嘛,我也遇到了这个问题

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文