数据分析与数据挖掘实战视频——学习笔记之自动模拟登陆爬虫实战(微博爬虫和豆瓣爬虫,验证码和扫码登陆)(失败,回头继续)

2、自动模拟登陆爬虫实战(失败)
E:\FHLAZ\Python37\Anaconda3\scrapy_document\first\第7次课
scrapy startproject douban
cd .\douban\
scrapy genspider -t basic db  douban.com
#https://www.douban.com/
scrapy crawl db --nolog

首先打开豆瓣的网址:https://www.douban.com/, 然后可以发现登陆的界面,这里需要抓包分析fiddler,我找到的真实登陆网址是这个:https://accounts.douban.com/passport/login,
然后再db文件里面写了初始url,然后写了ua,

这个网址主要是说有验证码的爬取过程,但是现在不是图片验证码,而是移动缺口的验证方式,暂时运行失败了,先说一下视频的理解吧,之后有时间找别的网站尝试.
后来老师答疑的时候,说了这种移动缺口的一般可以扫描二维码登陆,然后把cookie记录下来就行了。具体怎么操作还没有做,之后有时间可以试试。

验证码处理方式包括半自动处理、打码平台接口、图片识别
在这里插入图片描述

今天是2019.5.26.刚刚尝试的微信爬虫没成功,但是不影响后续的学习。
豆瓣的爬取验证码变成了移动滑块,说这种可以尝试扫码登陆,但是具体怎么操作也没说。我也想对有验证码的继续研究一下,所以我自行换了一个微博登陆,我来试试。

cd E:\FHLAZ\Python37\Anaconda3\scrapy_document\first\第7次课
scrapy startproject weibo
cd .\weibo\
scrapy genspider -t basic wb  weibo.com
#https://www.douban.com/
scrapy crawl wb --nolog

目标:首先要微博登陆。先找到微博登陆地址
https://login.sina.com.cn/signup/signin.php?entry=sso

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

登陆时post请求,而不是get请求。

现在回到pycharm里面,先写wb.py文件。先设置url,然后找登陆字段。
在这里插入图片描述

在这里插入图片描述
我先写下没有验证码的登陆代码吧。

# -*- coding: utf-8 -*-
import scrapy
import urllib.request
import re
from scrapy.http import Request,FormRequest
#FormRequest 相对应服务器发送请求

class WbSpider(scrapy.Spider):
    name = 'wb'
    allowed_domains = ['sina.com.cn']
    '''
    start_urls = ['http://weibo.com/']
    '''

    header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}

    def start_requests(self):
        return [Request("https://login.sina.com.cn/signup/signin.php?entry=sso",callback=self.parse,meta={"cookiejar":1})]
        #Request第一个参数登陆url,callback回调函数,第三个是cookiejar,需要是开启的,可以加上一个meta,cookiejar设置为1 就是开启了,如果没有cookiejar,下次登陆可能就不行了。


    def parse(self, response):
        '''
        pat='<script src="(.*?)">'
        captcha=response.xpath('/html/body/script[1]/@src').extract()#这里可以提取验证码的链接,但是微博的我没有找到,我找到一个网址,这个网址里面有,但是不好提取。假设这个就是我要的验证码链接
        url="https://login.sina.com.cn/signup/signin.php?entry=sso"
        if len(captcha)>0:
            print("此时有验证码")
            localpath="F:/pic/captcha.png"
            urllib.request.urlretrieve(captcha[0],filename=localpath)
            print("请登录查看本地验证码图片")
        '''
        print("此时没有验证码")
        data = {
            "username": "……",
            "password": "……",
        }
        #也可以设置登陆后返回的网址redir:“”但是我没有找到,所以就没写了
        print("登陆中……")
        #print(captcha)
        print(response)
        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('//p[@class="me_name"]/text()').extract()
        print(title)

在这里插入图片描述

最开始代码里面的allowed_domains是weibo.com,然后出错了,我查了这个的解决方法,https://blog.csdn.net/feifly329/article/details/49702063,然后我改成了sina.com.cn

在这里插入图片描述

基础的ok了,但是没有爬取内容。

通过print(response.text)可以查看爬取的内容,但是我发现还是没有登陆成功的界面内容.这个时候应该是微博没有登陆成功。

后续需要验证码部分就是写了一个验证码的网址,然后把图片下载到本地,然后手动输入验证码爬取。
但是找验证码的链接除了问题。微博登陆暂时还没有成功,我之后再回来尝试。
先把正常情况下的代码记载下来吧

# -*- coding: utf-8 -*-
import scrapy
import urllib.request
import re
from scrapy.http import Request,FormRequest
#FormRequest 相对应服务器发送请求

class WbSpider(scrapy.Spider):
    name = 'wb'
    allowed_domains = ['sina.com.cn']
    '''
    start_urls = ['http://weibo.com/']
    '''

    header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}

    def start_requests(self):
        return [Request("https://login.sina.com.cn/signup/signin.php?entry=sso",callback=self.parse,meta={"cookiejar":1})]
        #Request第一个参数登陆url,callback回调函数,第三个是cookiejar,需要是开启的,可以加上一个meta,cookiejar设置为1 就是开启了,如果没有cookiejar,下次登陆可能就不行了。


    def parse(self, response):
        captcha=response.xpath('/html/body/script[1]/@src').extract()#这里可以提取验证码的链接,但是微博的我没有找到,我找到一个网址,这个网址里面有,但是不好提取。假设这个就是我要的验证码链接
        url="https://login.sina.com.cn/signup/signin.php?entry=sso"
        if len(captcha)>0:
            print("此时有验证码")
            localpath="F:/pic/captcha.png"
            urllib.request.urlretrieve(captcha[0],filename=localpath)
            print("请登录查看本地验证码图片并输入验证码")
            captcha_value=input()
            data = {
                "username": "……",
                "password": "……",
                "door": "captcha_value",
            }
        else:
            print("此时没有验证码")
            data = {
                "username": "……",
                "password": "……",
                "door": "captcha_value"
            }

        #也可以设置登陆后返回的网址redir:“”但是我没有找到,所以就没写了
        print("登陆中……")
        #print(captcha)
        #print(response)
        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('//p[@class="me_name"]/text()').extract()
        print(response.text)
        print(title)

半自动验证码我还可以找找别的需要验证码登陆的尝试下。

暂时先继续视频学习把,看看后面有没有新的解决方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值