我的博客中曾经贴过几个爬虫程序的代码,用来批量下载图片非常方便。这样的爬虫实现起来比较简单。而有些网站需要用户登录之后才可以下载文件,之前的方法就办不到了。今天就说说用Python模拟浏览器的登录过程,为之后的登录下载做好准备。登录的情况,需要额外用到的一个模块是cookielib,用来记住登录成功之后保存到本地的cookie,方便在网站的各个页面之间穿越。
先上代码示例:
#encoding=utf8 import urllib import urllib2 import cookielib ###登录页的url lgurl = 'http://mlook.mobi/member/login' ###用cookielib模块创建一个对象,再用urlllib2模块创建一个cookie的handler cookie = cookielib.CookieJar() cookie_handler = urllib2.HTTPCookieProcessor(cookie) ###有些网站反爬虫,这里用headers把程序伪装成浏览器 hds = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36'} ###登录需要提交的表单 pstdata = { 'formhash':'', #填入formhash 'person[login]':'', #填入网站的用户名 'person[password]':'', #填入网站密码 } dt = urllib.urlencode(pstdata) #表单数据编码成url识别的格式 req = urllib2.Request(url = lgurl,data = dt,headers = hds) #伪装成浏览器,访问该页面,并POST表单数据,这里并没有实际访问,只是创建了一个有该功能的对象 opener = urllib2.build_opener(cookie_handler) #绑定handler,创建一个自定义的opener response = opener.open(req) #请求网页,返回句柄 page = response.read() #读取并返回网页内容 print page #打印到终端显示
说明一下:
我这里就不提供用户名密码了。关于需要提交的表单数据,chrome用户可以F12 -> Network -> 填好账号密码并登录 -> 在Network找到POST...,请看截图。
点击「login」进入下图界面。
1、「From Data」里面数据比较多,通常需要用户名、密码,其余的数据是否必要,需要测试一下。对于这个网站,还需要「formhash」。
2、Linux下无编码问题,win下如果出现编码问题应该是终端对编码的支持不到位。
3、登录成功之后,我们创建的cookie_handler会自动管理cookie,程序的后面如果需要访问其他页面,用opener打开其url即可。
4、「User-Agent」同样可以通过F12查看到。
5、这篇博客重点不在介绍原理,重点是记录下这个简单的代码块,其他需要登录的爬虫仿写就可以了。
先大致总结一下登录的几个步骤
1、添加Cookie配置 一般需要账号密码登陆的,直接网址或者模仿浏览器操作是无法进入的,一般的解决方法是用python的一个模块是cookielib,用来记住登录成功之后保存到本地的cookie;
2、添加登录需要提交的表单信息 一般postdata的信息为登陆的用户名,密码什么的,还有许多其他的信息,其余的数据是否必要,需要测试一下; 查看这个就可以用httpfox 或者审查元素的nextwork里面,当你点击登录的时候,在审查元素的network里面可以看到post 、get的数据信息;这里就可以按照我们需要的来拿; 下面是模仿登录人人网的代码;代码注释挺细的。以便以后回忆~~
import urllib2,urllib,cookielib #设置cookie cookiejar= cookielib.CookieJar() cookie=urllib2.HTTPCookieProcessor(cookiejar) opener= urllib2.build_opener(cookie,urllib2.HTTPHandler()) urllib2.install_opener(opener) #账号信息 email=raw_input('输入邮箱') password=raw_input('输入密码') domain='renren.com'#域名 url='http://www.renren.com/PLogin.do'#可以通过审查元素得到 #httpfox抓取数据包信息, 其中headers和domain 可有可无 postdata里面很多元素;最主要的用户名密码 #d对付反爬虫 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0' } data={ 'email' : email, 'password' : password, 'domain': domain } #编码data postdata = urllib.urlencode(data) #发起请求 req=urllib2.Request(url,postdata,headers) #获取源码 print urllib2.urlopen(req).read()
【应用】一个Python爬虫工具类whyspider:
# -*- coding: utf-8 -*- #--------------------------------------- # 程序:whyspider.py # 版本:0.2 # 作者:why # 日期:2014-04-18 # 语言:Python 2.7.5 # # 版本列表: # 0.1:添加GET和POST # 0.2:添加模拟头的功能 #--------------------------------------- import urllib import urllib2 import cookielib import re import string class WhySpider: # 初始化爬虫 def __init__(self): self.cookie_jar = cookielib.CookieJar() self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie_jar)) self.headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'} # 发送GET请求 def send_get(self,get_url): result = "" try: my_request = urllib2.Request(url = get_url, headers = self.headers) result = self.opener.open(my_request).read() except Exception,e: print "Exception : ",e return result # 发送POST请求 def send_post(self,post_url,post_data): result = "" try: my_request = urllib2.Request(url = post_url,data = post_data, headers = self.headers) result = self.opener.open(my_request).read() except Exception,e: print "Exception : ",e return result # 模拟电脑 def set_computer(self): user_agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0' self.headers = { 'User-Agent' : user_agent } # 模拟手机 def set_mobile(self): user_agent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25' self.headers = { 'User-Agent' : user_agent }
调用方法很简单:
# -*- coding: utf-8 -*- import whyspider # 初始化爬虫对象 my_spider = whyspider.WhySpider() # 模拟GET操作 print my_spider.send_get('http://3.apitool.sinaapp.com/?why=GetString2333') # 模拟POST操作 print my_spider.send_post('http://3.apitool.sinaapp.com/','why=PostString2333') # 模拟GET操作 print my_spider.send_get('http://www.baidu.com/') # 切换到手机模式 my_spider.set_mobile() # 模拟GET操作 print my_spider.send_get('http://www.baidu.com/')
python实现自动登录人人网并采集信息的方法:
#!/usr/bin/python # -*- coding: utf-8 -*- import sys import re import urllib2 import urllib import cookielib class Renren(object): def __init__(self): self.name = self.pwd = self.content = self.domain = self.origURL = '' self.operate = ''#登录进去的操作对象 self.cj = cookielib.LWPCookieJar() try: self.cj.revert('./renren.coockie') except Exception,e: print e self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj)) urllib2.install_opener(self.opener) def setinfo(self,username,password,domain,origURL): '''设置用户登录信息''' self.name = username self.pwd = password self.domain = domain self.origURL = origURL def login(self): '''登录人人网''' params = { 'domain':self.domain, 'origURL':self.origURL, 'email':self.name, 'password':self.pwd} print 'login.......' req = urllib2.Request( 'http://www.renren.com/PLogin.do', urllib.urlencode(params) ) self.file=urllib2.urlopen(req).read() newsfeed = open('news.html','w') try: newsfeed.write(self.file) except Exception, e: newsfeed.close() self.operate = self.opener.open(req) print type(self.operate) print self.operate.geturl() if self.operate.geturl(): print 'Logged on successfully!' self.cj.save('./renren.coockie') self.__viewnewinfo() else: print 'Logged on error' def __viewnewinfo(self): '''查看好友的更新状态''' self.__caiinfo() def __caiinfo(self): '''采集信息''' h3patten = re.compile('<article>(.*?)</article>')#匹配范围 apatten = re.compile('<h3.+>(.+)</h3>:')#匹配作者 cpatten = re.compile('</a>(.+)\s')#匹配内容 content = h3patten.findall(self.file) print len(content) infocontent = self.operate.readlines() print type(infocontent) print 'friend newinfo:' for i in infocontent: content = h3patten.findall(i) if len(content) != 0: for m in content: username = apatten.findall(m) info = cpatten.findall(m) if len(username) !=0: print username[0],'说:',info[0] print '----------------------------------------------' else: continue ren = Renren() username = 'username'#你的人人网的帐号 password = 'password'#你的人人网的密码 domain = 'www.renren.com'#人人网的地址 origURL = 'http://www.renren.com/home'#人人网登录以后的地址 ren.setinfo(username,password,domain,origURL) ren.login()
- 本文固定链接: http://ttfde.top/index.php/post/314.html
- 转载请注明: admin 于 TTF的家园 发表
《本文》有 0 条评论