自动模拟登录豆瓣及验证码处理

items.py这个文件,如果不用item的话就可以不用写。

1、自动登录豆瓣,所以要知道豆瓣的网址:https://www.douban.com/

2、要找Post表单,打开源文件,找到method="post",可以看到旁边的action="https://www.douban.com/accounts/login,这个url,在一般情况下,不一定是真正的表单,如果有反爬机制强的话,很有可能就不是,所以尽量抓包分析,推荐用抓包工具fiddler。

3、登录需要账号和密码,分析源文件,可以看到name="form_email",name="form_password"前面第一个name是输入账号的字段,第二个是输入密码的字段。

4、豆瓣有反爬机制,所以要用伪装成浏览器和用户代理。我用了header和start_requests(),另外为了处理验证码的问题,我会把cookie保存起来,否则刷新了网页,就会丢失登录信息,所以要保存登录状态。

5、豆瓣在登录成功后会自动跳转到首页,如果想改变的话,在https://accounts.douban.com/login的源文件里找到‘redir’,这个是用来控制跳转后的页面。

6、实际发送表单时,用到FormRequest,所以要导入from scrapy.http import FormRequest,向服务器发送请求。

7、设置post表单数据,分有没有验证码,没有验证码时,只需要账号和密码就好。

"form_email":"xxxxxx",
                "form_password":"xxxxxx",
                "redir":"https://www.douban.com/people/xxxxx/",

有验证码时:会多一条验证码信息,去找登陆页面源文件关于验证码字段,‘captcha_img’,我们只需要判断这个属性有没有值,也就是长度是否大于0,大于的话就是存在验证码,那我们在表单数据里就要加一条。

"captcha_solution":captcha_value,

8、验证码的处理方式:

8.1、图片识别

8.2、通过接口处理,打码接口

8.3、半自动,就是获取图片到本地,手动输入,再传过去登录。


源代码附上:
import scrapy
from scrapy.http import Request,FormRequest
import urllib.request
class DbSpider(scrapy.Spider):
    name = 'db'
    allowed_domains = ['douban.com']
   # start_urls = ['http://douban.com/']
    header={"User-Agent:":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"}
    def start_requests(self):
        return [Request("https://accounts.douban.com/login",callback=self.parse,headers=self.header,meta={"cookiejar":1})]


    def parse(self, response):
        captcha=response.xpath("//img[@id='captcha_image']/@src").extract()
        url="https://accounts.douban.com/login"

        if len(captcha)>0:
            print("此时有验证码")
            localpath="D:/pythonlianxi/douban/captcha.png"
            urllib.request.urlretrieve(captcha[0],filename=localpath)#将验证码图片下载到本地再查看。
            print("请查看本地验证码图片并输入验证码")
            captcha_value=input()
            data = {
                "form_email": "xxxxxxxx",
                "form_password": "xxxxxxx",
                "captcha_solution":captcha_value,
                "redir":"https://www.douban.com/people/xxxxxx/",
            }
        else:
            print("此时没有验证码")
            data={
                "form_email":"xxxxxxx",
                "form_password":"xxxxxxxx",
                "redir":"https://www.douban.com/people/xxxxxx/",
            }
        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").extract()
        print(title[0])

你可能感兴趣的:(自动模拟登录豆瓣及验证码处理)