在利用scrapy框架爬各种网站时,一定会碰到某些网站是需要登录才能获取信息。

这两天也在学习怎么去模拟登录,通过自己码的代码和借鉴别人的项目,调试成功豆瓣的模拟登录,顺便处理了怎么自动化的处理验证码。

一般都是通过打码平台处理的,当然你也可以机器学习的知识去识别验证码。后期我想自己做一个关于机器学习识别验证码的API,训练主流的网站,方便自己调用。(还不知道能不能做出来呢,走一步看一步咯!)

思路

一、想要实现登录豆瓣关键点

  1. 分析真实post地址 ----寻找它的formdata,如下图,按浏览器的F12可以找到。
  2. 模拟post ----构造类似的formdata
  3. 验证码处理 ----打码平台

实战操作

相关代码已经调试成功----2017-4-5

目标网站:豆瓣网

实现:模拟登录豆瓣,验证码处理,登录到个人主页就算是success

数据:没有抓取数据,此实战主要是模拟登录和处理验证码的学习。要是有需求要抓取数据,编写相关的抓取规则即可抓取内容。

登录成功展示如图:

我在这里贴出主要代码,完整代码请移步我的github:https://github.com/pujinxiao/douban_login

spiders文件夹中DouBan.py主要代码如下:

 1 # -*- coding: utf-8 -*-
 2 import scrapy,urllib,re
 3 from scrapy.http import Request,FormRequest
 4 import ruokuai
 5 class DoubanSpider(scrapy.Spider):
 6     name = "DouBan"
 7     allowed_domains = ["douban.com"]
 8     #start_urls = ['http://douban.com/']
 9     header={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"} #供登录模拟使用
10     def start_requests(self):
11         url='https://www.douban.com/accounts/login'
12         return [Request(url=url,meta={"cookiejar":1},callback=self.parse)]#可以传递一个标示符来使用多个。如meta={'cookiejar': 1}这句,后面那个1就是标示符
13
14     def parse(self, response):
15         captcha=response.xpath('//*[@id="captcha_image"]/@src').extract()  #获取验证码图片的链接
16         print captcha
17         if len(captcha)>0:
18             '''此时有验证码'''
19             #人工输入验证码
20             #urllib.urlretrieve(captcha[0],filename="C:/Users/pujinxiao/Desktop/learn/douban20170405/douban/douban/spiders/captcha.png")
21             #captcha_value=raw_input('查看captcha.png,有验证码请输入:')
22
23             #用快若打码平台处理验证码--------验证码是任意长度字母,成功率较低
24             captcha_value=ruokuai.get_captcha(captcha[0])
25             reg=r'<Result>(.*?)</Result>'
26             reg=re.compile(reg)
27             captcha_value=re.findall(reg,captcha_value)[0]
28             print '验证码为:',captcha_value
29
30             data={
31                 "form_email": "weisuen007@163.com",
32                 "form_password": "weijc7789",
33                 "captcha-solution": captcha_value,
34                 #"redir": "https://www.douban.com/people/151968962/",      #设置需要转向的网址,由于我们需要爬取个人中心页,所以转向个人中心页
35             }
36         else:
37             '''此时没有验证码'''
38             print '无验证码'
39             data={
40                 "form_email": "weisuen007@163.com",
41                 "form_password": "weijc7789",
42                 #"redir": "https://www.douban.com/people/151968962/",
43             }
44         print '正在登陆中......'
45         ####FormRequest.from_response()进行登陆
46         return [
47             FormRequest.from_response(
48                 response,
49                 meta={"cookiejar":response.meta["cookiejar"]},
50                 headers=self.header,
51                 formdata=data,
52                 callback=self.get_content,
53             )
54         ]
55     def get_content(self,response):
56         title=response.xpath('//title/text()').extract()[0]
57         if u'登录豆瓣' in title:
58             print '登录失败,请重试!'
59         else:
60             print '登录成功'
61             '''
62             可以继续后续的爬取工作
63             '''

ruokaui.py代码如下:

我所用的是若块打码平台,选择url识别验证码,直接给打码平台验证码图片的链接地址,传回验证码的值。

  1 # -*- coding: utf-8 -*-
  2 import sys, hashlib, os, random, urllib, urllib2
  3 from datetime import *
  4
  5 class APIClient(object):
  6     def http_request(self, url, paramDict):
  7         post_content = ''
  8         for key in paramDict:
  9             post_content = post_content + '%s=%s&'%(key,paramDict[key])
 10         post_content = post_content[0:-1]
 11         #print post_content
 12         req = urllib2.Request(url, data=post_content)
 13         req.add_header('Content-Type', 'application/x-www-form-urlencoded')
 14         opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
 15         response = opener.open(req, post_content)
 16         return response.read()
 17
 18     def http_upload_image(self, url, paramKeys, paramDict, filebytes):
 19         timestr = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
 20         boundary = '------------' + hashlib.md5(timestr).hexdigest().lower()
 21         boundarystr = '\r\n--%s\r\n'%(boundary)
 22
 23         bs = b''
 24         for key in paramKeys:
 25             bs = bs + boundarystr.encode('ascii')
 26             param = "Content-Disposition: form-data; name=\"%s\"\r\n\r\n%s"%(key, paramDict[key])
 27             #print param
 28             bs = bs + param.encode('utf8')
 29         bs = bs + boundarystr.encode('ascii')
 30
 31         header = 'Content-Disposition: form-data; name=\"image\"; filename=\"%s\"\r\nContent-Type: image/gif\r\n\r\n'%('sample')
 32         bs = bs + header.encode('utf8')
 33
 34         bs = bs + filebytes
 35         tailer = '\r\n--%s--\r\n'%(boundary)
 36         bs = bs + tailer.encode('ascii')
 37
 38         import requests
 39         headers = {'Content-Type':'multipart/form-data; boundary=%s'%boundary,
 40                    'Connection':'Keep-Alive',
 41                    'Expect':'100-continue',
 42                    }
 43         response = requests.post(url, params='', data=bs, headers=headers)
 44         return response.text
 45
 46 def arguments_to_dict(args):
 47     argDict = {}
 48     if args is None:
 49         return argDict
 50
 51     count = len(args)
 52     if count <= 1:
 53         print 'exit:need arguments.'
 54         return argDict
 55
 56     for i in [1,count-1]:
 57         pair = args[i].split('=')
 58         if len(pair) < 2:
 59             continue
 60         else:
 61             argDict[pair[0]] = pair[1]
 62
 63     return argDict
 64
 65 def get_captcha(image_url):
 66     client = APIClient()
 67     while 1:
 68         paramDict = {}
 69         result = ''
 70         act = raw_input('请输入打码方式url:')
 71         if cmp(act, 'info') == 0:
 72             paramDict['username'] = raw_input('username:')
 73             paramDict['password'] = raw_input('password:')
 74             result = client.http_request('http://api.ruokuai.com/info.xml', paramDict)
 75         elif cmp(act, 'register') == 0:
 76             paramDict['username'] = raw_input('username:')
 77             paramDict['password'] = raw_input('password:')
 78             paramDict['email'] = raw_input('email:')
 79             result = client.http_request('http://api.ruokuai.com/register.xml', paramDict)
 80         elif cmp(act, 'recharge') == 0:
 81             paramDict['username'] = raw_input('username:')
 82             paramDict['id'] = raw_input('id:')
 83             paramDict['password'] = raw_input('password:')
 84             result = client.http_request('http://api.ruokuai.com/recharge.xml', paramDict)
 85         elif cmp(act, 'url') == 0:
 86             paramDict['username'] = '********'
 87             paramDict['password'] = '********'
 88             paramDict['typeid'] = '2000'
 89             paramDict['timeout'] = '90'
 90             paramDict['softid'] = '76693'
 91             paramDict['softkey'] = 'ec2b5b2a576840619bc885a47a025ef6'
 92             paramDict['imageurl'] = image_url
 93             result = client.http_request('http://api.ruokuai.com/create.xml', paramDict)
 94         elif cmp(act, 'report') == 0:
 95             paramDict['username'] = raw_input('username:')
 96             paramDict['password'] = raw_input('password:')
 97             paramDict['id'] = raw_input('id:')
 98             result = client.http_request('http://api.ruokuai.com/create.xml', paramDict)
 99         elif cmp(act, 'upload') == 0:
100             paramDict['username'] = '********'
101             paramDict['password'] = '********'
102             paramDict['typeid'] = '2000'
103             paramDict['timeout'] = '90'
104             paramDict['softid'] = '76693'
105             paramDict['softkey'] = 'ec2b5b2a576840619bc885a47a025ef6'
106             paramKeys = ['username',
107                  'password',
108                  'typeid',
109                  'timeout',
110                  'softid',
111                  'softkey'
112                 ]
113
114             from PIL import Image
115             imagePath = raw_input('Image Path:')
116             img = Image.open(imagePath)
117             if img is None:
118                 print 'get file error!'
119                 continue
120             img.save("upload.gif", format="gif")
121             filebytes = open("upload.gif", "rb").read()
122             result = client.http_upload_image("http://api.ruokuai.com/create.xml", paramKeys, paramDict, filebytes)
123
124         elif cmp(act, 'help') == 0:
125             print 'info'
126             print 'register'
127             print 'recharge'
128             print 'url'
129             print 'report'
130             print 'upload'
131             print 'help'
132             print 'exit'
133         elif cmp(act, 'exit') == 0:
134             break
135
136         return result

ruokuai.py

笔记

知识点:
  1. return Request的用法
    return [Request(url=url,meta={"cookiejar":1},callback=self.parse)]   #可以传递一个标示符来使用多个。如meta={'cookiejar': 1}这句,后面那个1就是标示符
  2. 打码平台的使用
    直接利用验证码图片的url接口即可
  3. FormRequest的用法
    return [FormRequest.from_response(response,meta={"cookiejar":response.meta["cookiejar"]},headers=self.header,formdata=data,callback=self.get_content,)
    ]

作者:今孝
出处:http://www.cnblogs.com/jinxiao-pu/p/6670672.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

转载于:https://www.cnblogs.com/jinxiao-pu/p/6670672.html

python爬虫实战(四)--------豆瓣网的模拟登录(模拟登录和验证码的处理----scrapy)...相关推荐

  1. Python爬虫实战(四) :下载煎蛋网所有妹子照片

    煎蛋网是一个适合开车的网站,各种妹子福利图片. 网站:http://jandan.net/ooxx 里面有两种格式的图片:gif和jpg,写个程序将所有页面的妹子图全部下载下来. #coding=ut ...

  2. python爬虫实战 获取豆瓣排名前250的电影信息--基于正则表达式

    一.项目目标 爬取豆瓣TOP250电影的评分.评价人数.短评等信息,并在其保存在txt文件中,html解析方式基于正则表达式 二.确定页面内容 爬虫地址:https://movie.douban.co ...

  3. python爬虫实战(一)——豆瓣top250(re)

    文章目录 一 . 原理 二 . 注意点 1 . 返回403 2 . 循环获取页面数据 3 . 正则表达式 三 . 代码 一 . 原理 python实战的第一个项目基本上都是豆瓣的top250吧hhhh ...

  4. Python爬虫实战四 | 盘搜搜1.2-网盘搜索神器开源

    应用说明: 之前<小项目实战|盘搜搜>一文中说好的要开源,就直接免费开源给大家使用了,只需要直接下载,然后上传FTP空间(网站)就可以直接使用了,这次做了界面的升级,算是好看了一丢丢吧~ ...

  5. python爬虫 爬取 豆瓣网 搜索结果 同城活动 数据

    主要使用的库: requests:爬虫请求并获取源码 re:使用正则表达式提取数据 json:使用JSON提取数据 pandas:使用pandans存储数据 bs4:网页代码解析 以下是源代码: #! ...

  6. Python爬虫实战(四) Python鬼灭漫画爬取+简单JS分析

    本次爬取仅供学习,无任何商业用途 猪油骨,拿来卤~今天,来分享一下python图片爬取+简单JS分析 爬取网址:漫画地址 (这个网站只更新到188话,实际上已经有200多话了) 目录 一.获取所有章节 ...

  7. python爬虫实战(三)——猪八戒网(xpath)

    文章目录 1 . 前言 2 . 注意点 3 . 代码 1 . 前言 xpath是实际项目中应用最多的方法,相比于re和bs4来说. 所以xpath学好很重要 2 . 注意点 需要下载lxml库,不然会 ...

  8. Python爬虫实战(四):微博博主信息爬取(粉丝数、关注数、博文数、信用等级、认证信息、个人简介……)

    追风赶月莫停留,平芜尽处是春山. 文章目录 追风赶月莫停留,平芜尽处是春山. 好久没更新了,今天来更新一波. 一.网页分析 二.接口分析 url分析 返回数据分析 三.编写代码 获取数据 保存数据 完 ...

  9. python 爬虫实战

    1. Python爬虫实战一之爬取糗事百科段子 2. Python爬虫实战二之爬取百度贴吧帖子 3. Python爬虫实战三之实现山东大学无线网络掉线自动重连 4. Python爬虫实战四之抓取淘宝M ...

  10. Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(下)

    在Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(上)中,我们最后爬出来的结果不是很完美,这对于"精益求精.追求完美的"程序猿来说怎么能够甘心 所以,今天,用pyth ...

最新文章

  1. 分分钟掌握设计基本原则
  2. MongoDB 条件操作符
  3. myeclispse配置自己的jdk和tomcat
  4. tensorflow tf.global_variables_initializer()(返回一个初始化全局变量的对象)
  5. idea实用技巧完全教程
  6. WPF MVVM实例三
  7. postgresql定义访问ip与用户_PostgreSQL 设置允许访问IP的操作
  8. linux查看 mysql 登陆 失败_Linux安装完mysql后提示错误无法登陆mysql怎么办?
  9. Python程序员之面试必回习题
  10. win10家庭版如何开启组策略
  11. 牛客网--华为机试在线训练1:字符串最后一个单词的长度
  12. 深入理解ES6之《迭代器与生成器》
  13. [0418] 程序设计实训小结(更新1420)
  14. 菲利普·安德森:凝聚态物理的艺术家
  15. 远程访问及控制工具SSH
  16. Mysql 中source命令详解
  17. 画江湖之独门暗器指针
  18. 【vue系列-03】vue的计算属性,列表,监视属性及原理
  19. 银行存管java 对接_Jay su-华正商务旅行社-4年中级java工程师-猿急送
  20. uboot readme

热门文章

  1. 32908字长文理解Large Vision Model:Segment Anything
  2. 【数学建模】2012年全国大学生数学建模-葡萄酒的评价问题全面解析(附R语言实现部分代码)
  3. 卓有成效是可以学会的
  4. 指数复合函数的求导与欧拉方程
  5. winrar自解压模式用来打软件安装包
  6. Python:终端打印字体颜色
  7. Apache SeaTunnel Doris7月联合Meetup,从数据集成到分析实践
  8. 身份证识别、银行卡识别、名片识别,让金融APP更智能
  9. psim电力电子仿真alpha controller(阿尔法控制器)的设置和使用
  10. phpCMS V9 史上最详细环境搭建(windows)