哈哈哈,模拟登录成功啦啦啦啦啦~~~~~
重要的事本来要说三遍,不过还是算了==
先上效果图:
众所周知,很多网站都设置了登录之后才能获取查看页面的权利,因此模拟登录成了爬取信息的第一步,这一步成功了,嘿嘿,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:登录
第二步,需要了解一些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':”问题解决!