哈哈哈,模拟登录成功啦啦啦啦啦~~~~~
重要的事本来要说三遍,不过还是算了==
先上效果图:
众所周知,很多网站都设置了登录之后才能获取查看页面的权利,因此模拟登录成了爬取信息的第一步,这一步成功了,嘿嘿,just do it!
好,废话不多说,直接说重点:
首先,你应该要了解网站登录的流程以及你需要post的信息,以豆瓣为例:
source:movie
redir:https://movie.douban.com/mine?status=collect
form_email:username
form_password:password
captcha-solution:dress
captcha-id:6rP40CbJzNgdJuqOgM3Y6wNs:en
login:登录
这就是你需要提交的信息了,包括用户名和密码,以及验证码和验证码的ID,看到这可能有人会想我怎么知道验证码的ID,各位放心,在页面加载时就已经到客户端这边来了,也就是说你可以直接从浏览器中看到,是不是很炫酷!
第二步,需要了解一些requests这个库了,因为requests直接省去了urllib和urllib2的很多很多很多麻烦,省去了很多冗余的代码,正如官网所言,Requests:HTTP for Human,这是给人用的==
官网地址:Requests
如果你之前有了解过RE和bs4,好了,直接coding吧!
不然的话最好去了解一下bs,也省了不少的麻烦,帮助文档地址:BeautifulSoup
Talking is cheap,show me the code. Now is ShowTime!
# -*- encoding:utf-8 -*-
##############################
__author__ = "Andrewseu"
__date__ = "2015/8/3"
###############################
import requests
from bs4 import BeautifulSoup
import urllib
import re
loginUrl = 'http://accounts.douban.com/login'
formData={
"redir":"http://movie.douban.com/mine?status=collect",
"form_email":username,
"form_password":password,
"login":u'登录'
}
headers = {"User-Agent":'Mozilla/5.0 (Windows NT 6.1)\
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36'}
r = requests.post(loginUrl,data=formData,headers=headers)
page = r.text
#print r.url
'''获取验证码图片'''
#利用bs4获取captcha地址
soup = BeautifulSoup(page,"html.parser")
captchaAddr = soup.find('img',id='captcha_image')['src']
#利用正则表达式获取captcha的ID
reCaptchaID = r'<input type="hidden" name="captcha-id" value="(.*?)"/'
captchaID = re.findall(reCaptchaID,page)
#print captchaID
#保存到本地
urllib.urlretrieve(captchaAddr,"captcha.jpg")
captcha = raw_input('please input the captcha:')
formData['captcha-solution'] = captcha
formData['captcha-id'] = captchaID
r = requests.post(loginUrl,data=formData,headers=headers)
page = r.text
if r.url=='http://movie.douban.com/mine?status=collect':
print 'Login successfully!!!'
print '我看过的电影','-'*60
#获取看过的电影
soup = BeautifulSoup(page,"html.parser")
result = soup.findAll('li',attrs={"class":"title"})
#print result
for item in result:
print item.find('a').get_text()
else:
print "failed!"
有任何不懂的地方,欢迎和我交流!
更新:测试发现,有些时候是不需要输入验证码的,因此如果有读者发现在获取验证码时失败,可以在42行加一个判断“if r.url!='http://movie.douban.com/mine?status=collect':”问题解决!