首页 > Python > Python实现自动登录网页后采集信息
2016
09-10

Python实现自动登录网页后采集信息

我的博客中曾经贴过几个爬虫程序的代码,用来批量下载图片非常方便。这样的爬虫实现起来比较简单。而有些网站需要用户登录之后才可以下载文件,之前的方法就办不到了。今天就说说用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()

 

作者:admin
admin
TTF的家园-www.ttfde.top 个人博客以便写写东西,欢迎喜欢互联网的朋友一起交流!

本文》有 0 条评论

留下一个回复