python爬虫实战(四)--------豆瓣网的模拟登录(模拟登录和验证码的处理----scrapy)
在利用scrapy框架爬各种网站时,一定会碰到某些网站是需要登录才能获取信息。
这两天也在学习怎么去模拟登录,通过自己码的代码和借鉴别人的项目,调试成功豆瓣的模拟登录,顺便处理了怎么自动化的处理验证码。
一般都是通过打码平台处理的,当然你也可以机器学习的知识去识别验证码。后期我想自己做一个关于机器学习识别验证码的API,训练主流的网站,方便自己调用。(还不知道能不能做出来呢,走一步看一步咯!)
思路
一、想要实现登录豆瓣关键点
- 分析真实post地址 ----寻找它的formdata,如下图,按浏览器的F12可以找到。

- 模拟post ----构造类似的formdata
- 验证码处理 ----打码平台
实战操作
相关代码已经调试成功----2017-4-5
目标网站:豆瓣网
实现:模拟登录豆瓣,验证码处理,登录到个人主页就算是success
数据:没有抓取数据,此实战主要是模拟登录和处理验证码的学习。要是有需求要抓取数据,编写相关的抓取规则即可抓取内容。
登录成功展示如图:

我在这里贴出主要代码,完整代码请移步我的github:https://github.com/pujinxiao/douban_login
spiders文件夹中DouBan.py主要代码如下:
# -*- coding: utf-8 -*-
import scrapy,urllib,re
from scrapy.http import Request,FormRequest
import ruokuai
class DoubanSpider(scrapy.Spider):
name = "DouBan"
allowed_domains = ["douban.com"]
#start_urls = ['http://douban.com/']
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"} #供登录模拟使用
def start_requests(self):
url='https://www.douban.com/accounts/login'
return [Request(url=url,meta={"cookiejar":1},callback=self.parse)]#可以传递一个标示符来使用多个。如meta={'cookiejar': 1}这句,后面那个1就是标示符 def parse(self, response):
captcha=response.xpath('//*[@id="captcha_image"]/@src').extract() #获取验证码图片的链接
print captcha
if len(captcha)>0:
'''此时有验证码'''
#人工输入验证码
#urllib.urlretrieve(captcha[0],filename="C:/Users/pujinxiao/Desktop/learn/douban20170405/douban/douban/spiders/captcha.png")
#captcha_value=raw_input('查看captcha.png,有验证码请输入:') #用快若打码平台处理验证码--------验证码是任意长度字母,成功率较低
captcha_value=ruokuai.get_captcha(captcha[0])
reg=r'<Result>(.*?)</Result>'
reg=re.compile(reg)
captcha_value=re.findall(reg,captcha_value)[0]
print '验证码为:',captcha_value data={
"form_email": "weisuen007@163.com",
"form_password": "weijc7789",
"captcha-solution": captcha_value,
#"redir": "https://www.douban.com/people/151968962/", #设置需要转向的网址,由于我们需要爬取个人中心页,所以转向个人中心页
}
else:
'''此时没有验证码'''
print '无验证码'
data={
"form_email": "weisuen007@163.com",
"form_password": "weijc7789",
#"redir": "https://www.douban.com/people/151968962/",
}
print '正在登陆中......'
####FormRequest.from_response()进行登陆
return [
FormRequest.from_response(
response,
meta={"cookiejar":response.meta["cookiejar"]},
headers=self.header,
formdata=data,
callback=self.get_content,
)
]
def get_content(self,response):
title=response.xpath('//title/text()').extract()[0]
if u'登录豆瓣' in title:
print '登录失败,请重试!'
else:
print '登录成功'
'''
可以继续后续的爬取工作
'''
ruokaui.py代码如下:
我所用的是若块打码平台,选择url识别验证码,直接给打码平台验证码图片的链接地址,传回验证码的值。
# -*- coding: utf-8 -*-
import sys, hashlib, os, random, urllib, urllib2
from datetime import * class APIClient(object):
def http_request(self, url, paramDict):
post_content = ''
for key in paramDict:
post_content = post_content + '%s=%s&'%(key,paramDict[key])
post_content = post_content[0:-1]
#print post_content
req = urllib2.Request(url, data=post_content)
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
response = opener.open(req, post_content)
return response.read() def http_upload_image(self, url, paramKeys, paramDict, filebytes):
timestr = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
boundary = '------------' + hashlib.md5(timestr).hexdigest().lower()
boundarystr = '\r\n--%s\r\n'%(boundary) bs = b''
for key in paramKeys:
bs = bs + boundarystr.encode('ascii')
param = "Content-Disposition: form-data; name=\"%s\"\r\n\r\n%s"%(key, paramDict[key])
#print param
bs = bs + param.encode('utf8')
bs = bs + boundarystr.encode('ascii') header = 'Content-Disposition: form-data; name=\"image\"; filename=\"%s\"\r\nContent-Type: image/gif\r\n\r\n'%('sample')
bs = bs + header.encode('utf8') bs = bs + filebytes
tailer = '\r\n--%s--\r\n'%(boundary)
bs = bs + tailer.encode('ascii') import requests
headers = {'Content-Type':'multipart/form-data; boundary=%s'%boundary,
'Connection':'Keep-Alive',
'Expect':'100-continue',
}
response = requests.post(url, params='', data=bs, headers=headers)
return response.text def arguments_to_dict(args):
argDict = {}
if args is None:
return argDict count = len(args)
if count <= 1:
print 'exit:need arguments.'
return argDict for i in [1,count-1]:
pair = args[i].split('=')
if len(pair) < 2:
continue
else:
argDict[pair[0]] = pair[1] return argDict def get_captcha(image_url):
client = APIClient()
while 1:
paramDict = {}
result = ''
act = raw_input('请输入打码方式url:')
if cmp(act, 'info') == 0:
paramDict['username'] = raw_input('username:')
paramDict['password'] = raw_input('password:')
result = client.http_request('http://api.ruokuai.com/info.xml', paramDict)
elif cmp(act, 'register') == 0:
paramDict['username'] = raw_input('username:')
paramDict['password'] = raw_input('password:')
paramDict['email'] = raw_input('email:')
result = client.http_request('http://api.ruokuai.com/register.xml', paramDict)
elif cmp(act, 'recharge') == 0:
paramDict['username'] = raw_input('username:')
paramDict['id'] = raw_input('id:')
paramDict['password'] = raw_input('password:')
result = client.http_request('http://api.ruokuai.com/recharge.xml', paramDict)
elif cmp(act, 'url') == 0:
paramDict['username'] = '********'
paramDict['password'] = '********'
paramDict['typeid'] = ''
paramDict['timeout'] = ''
paramDict['softid'] = ''
paramDict['softkey'] = 'ec2b5b2a576840619bc885a47a025ef6'
paramDict['imageurl'] = image_url
result = client.http_request('http://api.ruokuai.com/create.xml', paramDict)
elif cmp(act, 'report') == 0:
paramDict['username'] = raw_input('username:')
paramDict['password'] = raw_input('password:')
paramDict['id'] = raw_input('id:')
result = client.http_request('http://api.ruokuai.com/create.xml', paramDict)
elif cmp(act, 'upload') == 0:
paramDict['username'] = '********'
paramDict['password'] = '********'
paramDict['typeid'] = ''
paramDict['timeout'] = ''
paramDict['softid'] = ''
paramDict['softkey'] = 'ec2b5b2a576840619bc885a47a025ef6'
paramKeys = ['username',
'password',
'typeid',
'timeout',
'softid',
'softkey'
] from PIL import Image
imagePath = raw_input('Image Path:')
img = Image.open(imagePath)
if img is None:
print 'get file error!'
continue
img.save("upload.gif", format="gif")
filebytes = open("upload.gif", "rb").read()
result = client.http_upload_image("http://api.ruokuai.com/create.xml", paramKeys, paramDict, filebytes) elif cmp(act, 'help') == 0:
print 'info'
print 'register'
print 'recharge'
print 'url'
print 'report'
print 'upload'
print 'help'
print 'exit'
elif cmp(act, 'exit') == 0:
break return result
ruokuai.py
笔记
- return Request的用法
return [Request(url=url,meta={"cookiejar":1},callback=self.parse)] #可以传递一个标示符来使用多个。如meta={'cookiejar': 1}这句,后面那个1就是标示符 - 打码平台的使用
直接利用验证码图片的url接口即可 - 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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
python爬虫实战(四)--------豆瓣网的模拟登录(模拟登录和验证码的处理----scrapy)的更多相关文章
- Python爬虫实战四之抓取淘宝MM照片
原文:Python爬虫实战四之抓取淘宝MM照片其实还有好多,大家可以看 Python爬虫学习系列教程 福利啊福利,本次为大家带来的项目是抓取淘宝MM照片并保存起来,大家有没有很激动呢? 本篇目标 1. ...
- python爬虫实战 获取豆瓣排名前250的电影信息--基于正则表达式
一.项目目标 爬取豆瓣TOP250电影的评分.评价人数.短评等信息,并在其保存在txt文件中,html解析方式基于正则表达式 二.确定页面内容 爬虫地址:https://movie.douban.co ...
- 记一次python爬虫实战,豆瓣电影Top250爬虫
import requests from bs4 import BeautifulSoup import re import traceback def GetHtmlText(url): for i ...
- Python爬虫实战(4):豆瓣小组话题数据采集—动态网页
1, 引言 注释:上一篇<Python爬虫实战(3):安居客房产经纪人信息采集>,访问的网页是静态网页,有朋友模仿那个实战来采集动态加载豆瓣小组的网页,结果不成功.本篇是针对动态网页的数据 ...
- 《精通Python网络爬虫》|百度网盘免费下载|Python爬虫实战
<精通Python网络爬虫>|百度网盘免费下载|Python爬虫实战 提取码:7wr5 内容简介 为什么写这本书 网络爬虫其实很早就出现了,最开始网络爬虫主要应用在各种搜索引擎中.在搜索引 ...
- Python爬虫实战五之模拟登录淘宝并获取所有订单
经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 温馨提示 更新时间,2016-02-01,现在淘宝换成了滑块验证了 ...
- Python爬虫实战——反爬策略之模拟登录【CSDN】
在<Python爬虫实战-- Request对象之header伪装策略>中,我们就已经讲到:=="在header当中,我们经常会添加两个参数--cookie 和 User-Age ...
- Python爬虫实战七之计算大学本学期绩点
大家好,本次为大家带来的项目是计算大学本学期绩点.首先说明的是,博主来自山东大学,有属于个人的学生成绩管理系统,需要学号密码才可以登录,不过可能广大读者没有这个学号密码,不能实际进行操作,所以最主要的 ...
- Python爬虫实战三之实现山东大学无线网络掉线自动重连
综述 最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! ...
- Python爬虫实战---抓取图书馆借阅信息
Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...
随机推荐
- 前端PHP入门-022-重点日期函数之获取本地化时间戳函数.md
在实际的工作中我们还需要经常用到指定某个时间生成 例如:需要找到昨天到今天此时此刻的注册用户. 我们需要做两件事情: 得到当前的时间unix时间戳.用time()函数就可以直接搞定 那么昨天指定时 ...
- DLL基本知识
一.生成方式: 使用DEF文件定义导出接口或使用__declspec(dllexport)描述接口,编译链接后生成dll+lib,其中lib是导入库,里面只有对导出接口的描述,而没有具体实现. 二.链 ...
- javascript 实现 A-star 寻路算法
在游戏开发中,又一个很常见的需求,就是让一角色从A点走到B点,而我们期望所走的路是最短的,最容易想到的就是两点之间直线最短,我们可以通过勾股定理来求出两点之间的距离,但这个情况只能用于两点之间没有障碍 ...
- Spring整合JMS(三)——MessageConverter介绍(转)
*注:别人那复制来的 1.4 消息转换器MessageConverter MessageConverter的作用主要有两方面,一方面它可以把我们的非标准化Message对象转换成我们的目标Me ...
- uva 1639 Candy (对数处理精度)
https://vjudge.net/problem/UVA-1639 有两个盒子各有n(n≤2*10 5 )个糖,每天随机选一个(概率分别为p,1-p),然后吃一颗糖. 直到有一天,打开盒子一看,没 ...
- JavaScript入门笔记(一)
JavaScipt 2.1 javascript的组成部分 ECMAScript: 它是整个 javascript 的核心,包含(基本语法.变量.关键字.保留字.数据类型.语句.函数等等)DOM:文档 ...
- MySql 快速去重方法
1.复制需要去重的表 CREATE TABLE 新表 LIKE 旧表 ; 2.将需要去重的字段 设置为唯一union 索引 ALTER TABLE 表名 ADD UNIQUE(`字段`); 3.复制旧 ...
- 天梯赛 L2-20 功夫传人 (深搜)
一门武功能否传承久远并被发扬光大,是要看缘分的.一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱-- 直到某一支的某一代突然出现一个天分特别高的弟子(或者是吃到了灵丹.挖到 ...
- Sublime删除项目删不掉?
最近用sublime进行项目的开发,感觉懵逼的像个小白菜~~ 今天遇到的问题可是一个超级白痴的问题,sublime的空白项目文件夹怎么都删不掉,我的傻逼操作是:选中文件--->Delete--- ...
- kendo method:destroy 解决有些在kendo.all.js 的js 库里报错问题
首先,不得不承认,kendo UI 是个不错的东西,特别对于一个前端开发到行不足的程序猿来说.而在我们使用过程中貌似还是会遇到各种奇怪的问题.比如我们会经常用到对一些控件进行重赋值. destroy ...