Python网页抓取、模拟登录

POST参数可以使用chorm或fireforx+httpfox来获取


本文主要用python实现了对网站的模拟登录。通过自己构造post数据来用Python实现登录过程。

当你要模拟登录一个网站时,首先要搞清楚网站的登录处理细节(发了什么样的数据,给谁发等...)。

我是通过HTTPfox来抓取http数据包来分析该网站的登录流程。

同时,我们还要分析抓到的post包的数据结构和header,要根据提交的数据结构和heander来构造自己的post数据和header。

分析结束后,我们要构造自己的HTTP数据包,并发送给指定url。

我们通过urllib2等几个模块提供的API来实现request请求的发送和相应的接收。

大部分网站登录时需要携带cookie,所以我们还必须设置cookie处理器来保证cookie。

具体代码和讲解如下

#!/usr/bin/python  

import HTMLParser 
import urlparse 
import urllib 
import urllib2 
import cookielib 
import string 
import re 
 
#登录的主页面 
hosturl = '******' //自己填写 
#post数据接收和处理的页面(我们要向这个页面发送我们构造的Post数据) 
posturl = '******' //从数据包中分析出,处理post请求的url 
 
#设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie 
cj = cookielib.LWPCookieJar() 
cookie_support = urllib2.HTTPCookieProcessor(cj) 
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) 
urllib2.install_opener(opener) 
 
#打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功) 
h = urllib2.urlopen(hosturl) 
 
#构造header,一般header至少要包含一下两项。这两项是从抓到的包里分析得出的。 
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1', 
           'Referer' : '******'} 
#构造Post数据,他也是从抓大的包里分析得出的。 
postData = {'op' : 'dmlogin', 
            'f' : 'st', 
            'user' : '******', //你的用户名 
            'pass' : '******', //你的密码,密码可能是明文传输也可能是密文,如果是密文需要调用相应的加密算法加密 
            'rmbr' : 'true',   //特有数据,不同网站可能不同 
            'tmp' : '0.7306424454308195'  //特有数据,不同网站可能不同 
 
            } 
 
#需要给Post数据编码 
postData = urllib.urlencode(postData) 
 
#通过urllib2提供的request方法来向指定Url发送我们构造的数据,并完成登录过程 
request = urllib2.Request(posturl, postData, headers) 
print request 
response = urllib2.urlopen(request) 
text = response.read() 
print text    



#-------------------------------------------------------------------------------
# Name:        模拟登录web
# Purpose:
#
# Author:      huwei
#
# Created:     26/10/2010
# Copyright:   (c) huwei 2010
# Licence:     <your licence>
#-------------------------------------------------------------------------------
#!/usr/bin/env python

import time,urllib2,urllib

def main():
    
    #登录博客园
    loginCNblogs()
    pass



#登录博客园
def loginCNblogs():
    try:
        #设置 cookie
        cookies = urllib2.HTTPCookieProcessor()
        opener = urllib2.build_opener(cookies)
        urllib2.install_opener(opener)

        parms = {"tbUserName":"用户名","tbPassword":"密码","__EVENTTARGET":"btnLogin","__EVENTARGUMENT":"",
        "__VIEWSTATE":"/wEPDwULLTExMDE0MzIzNDRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQtjaGtSZW1lbWJlcmcJekJlt5rFwfnjeMMnX9V58Xhg",
        "__EVENTVALIDATION":"/wEWBQKit6iCDALyj/OQAgK3jsrkBALR55GJDgKC3IeGDK6TQlRlirS2Zja1Lmeh02u4XMwV",
        "txtReturnUrl":"http://bboy.cnblogs.com"}

        loginUrl = "http://passport.cnblogs.com/login.aspx"
        login = urllib2.urlopen(loginUrl,urllib.urlencode(parms))
        
        
        #print(unicode(login.read(),"utf8"))

        #显示配置页面
        avatar = urllib2.urlopen("http://home.cnblogs.com/set/avatar/")
        #print(avatar.read().decode("utf8"))
    except Exception,e:
        print(e)
    pass


if __name__ == '__main__':
    main()

获取 网页很简单 直接 urllib2.urlopen(url).read() 就可以得到网页源码

这里是抓取登录后的页面,所有开头需要设置cookie

cookies  =  urllib2.HTTPCookieProcessor()
opener 
=  urllib2.build_opener(cookies)
urllib2.install_opener(opener)

 

设置完 cookie以后 再使用 urllib2.urlopen()方法就可以带上你登录成功的cookie了


# -*- coding: utf-8 -*-  
import re  
import urllib  
import urllib2  
import cookielib  
  
#获取CSDN博客标题和正文  
url = "http://blog.csdn.net/[username]/archive/2010/07/05/5712850.aspx"  
sock = urllib.urlopen(url)  
html = sock.read()  
sock.close()  
content = re.findall('(?<=blogstory">).*(?=<p class="right artical)', html, re.S)  
content = re.findall('<script.*>.*</script>(.*)', content[0], re.S)  
title = re.findall('(?<=<title>)(.*)-.* - CSDN.*(?=</title>)', html, re.S)  
#根据上文获取内容新建表单值  
blog = {'spBlogTitle': title[0].decode('utf-8').encode('gbk'), #百度博客标题  
        'spBlogText': content[0].decode('utf-8').encode('gbk'),#百度博客内容  
        'ct': "1",  
        'cm': "1"}  
del content  
del title  
  
#模拟登录  
cj = cookielib.CookieJar()  
#用户名和密码  
post_data = urllib.urlencode({'username': '[username]', 'password': '[password]', 'pwd': '1'})  
#登录路径  
path = 'https://passport.baidu.com/?login'  
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))  
opener.addheaders = [('User-agent', 'Opera/9.23')]  
urllib2.install_opener(opener)  
req = urllib2.Request(path, post_data)  
conn = urllib2.urlopen(req)  
  
#获取百度发布博客的认证令牌  
bd = urllib2.urlopen(urllib2.Request('http://hi.baidu.com/[username]/creat/blog')).read()  
bd = re.findall('(?<=bdstoken\" value=\").*(?=ct)', bd, re.S)  
blog['bdstoken'] = bd[0][:32]  
#设置分类名  
blog['spBlogCatName'] = 'php'  
#比较表单发布博客  
req2 = urllib2.Request('http://hi.baidu.com/[username]/commit', urllib.urlencode(blog))  
  
#查看表单提交后返回内容  
print urllib2.urlopen(req2).read()  
  
#请将[username]/[password]替换为您的真实用户名和密码



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值