早听说用python做网络爬虫非常方便,正好这几天单位也有这样的需求,需要登陆XX网站下载部分文档,于是自己亲身试验了一番,效果还不错。

 
本例所登录的某网站需要提供用户名,密码和验证码,在此使用了python的urllib2直接登录网站并处理网站的Cookie。
 

Cookie的工作原理:

Cookie由服务端生成,然后发送给浏览器,浏览器会将Cookie保存在某个目录下的文本文件中。在下次请求同一网站时,会发送该Cookie给服务器,这样服务器就知道该用户是否合法以及是否需要重新登录。
 

Python提供了基本的cookielib库,在首次访问某页面时,cookie便会自动保存下来,之后访问其它页面便都会带有正常登录的Cookie了。

 
原理:
(1)激活cookie功能
(2)反“反盗链”,伪装成浏览器访问
(3)访问验证码链接,并将验证码图片下载到本地
(4)验证码的识别方案网上较多,python也有图像处理库,此例调用了火车头采集器的OCR识别接口。
(5)表单的处理,可用fiddler等抓包工具获取需要提交的参数
(6)生成需要提交的数据,生成http请求并发送
(7)根据返回的js页面判断是否登陆成功
(8)登陆成功后下载其它页面
 

此例中使用多个账号轮询登陆,每个账号下载指定数目页面。

 

以下是部分代码:

#!usr/bin/env python
 
#-*- coding: utf-8 -*-
 
import os
import urllib2
import urllib
import cookielib
import xml.etree.ElementTree as ET
 
#-----------------------------------------------------------------------------
# Login in www.***.com.cn
def ChinaBiddingLogin(url, username, password):
     
  # Enable cookie support for urllib2
     
  cookiejar=cookielib.CookieJar()
     
 
urlopener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
     
  urllib2.install_opener(urlopener)
     
  
     
  urlopener.addheaders.append(('Referer',
'http://www.chinabidding.com.cn/zbw/login/login.jsp'))
     
  urlopener.addheaders.append(('Accept-Language',
'zh-CN'))
     
  urlopener.addheaders.append(('Host',
'www.chinabidding.com.cn'))
     
  urlopener.addheaders.append(('User-Agent',
'Mozilla/5.0 (compatible; MISE 9.0; Windows NT 6.1);
Trident/5.0'))
     
  urlopener.addheaders.append(('Connection',
'Keep-Alive'))
 
     
  print 'XXX Login......'
 
     
 
imgurl=r'http://www.*****.com.cn/zbw/login/image.jsp'
     
  DownloadFile(imgurl, urlopener)
     
  authcode=raw_input('Please enter the
authcode:')
     
 
#authcode=VerifyingCodeRecognization(r"http://192.168.0.106/images/code.jpg")
 
     
  # Send login/password to the site and get the
session cookie
     
  values={'login_id':username, 'opl':'op_login',
'login_passwd':password, 'login_check':authcode}
     
  urlcontent=urlopener.open(urllib2.Request(url,
urllib.urlencode(values)))
     
  page=urlcontent.read(500000)
 
     
  # Make sure we are logged in, check the returned
page content
     
  if page.find('login.jsp')!=-1:
     
     
    print 'Login failed with
username=%s, password=%s and authcode=%s' \
     
     
     
     
     
  % (username, password, authcode)
     
     
    return False
     
  else:
     
     
    print 'Login
succeeded!'
     
     
    return True
 
#-----------------------------------------------------------------------------
# Download from fileUrl then save to fileToSave
# Note: the fileUrl must be a valid file
def DownloadFile(fileUrl, urlopener):
     
  isDownOk=False
 
     
  try:
     
     
    if fileUrl:
     
     
     
     
outfile=open(r'/var/www/images/code.jpg', 'w')
     
     
     
     
outfile.write(urlopener.open(urllib2.Request(fileUrl)).read())
     
     
     
     
outfile.close()
 
     
     
     
     
isDownOK=True
     
     
    else:
     
     
     
      print
'ERROR: fileUrl is NULL!'
     
  except:
     
     
    isDownOK=False
 
     
  return isDownOK
 
#------------------------------------------------------------------------------
# Verifying code recoginization
def VerifyingCodeRecognization(imgurl):
     
  url=r'http://192.168.0.119:800/api?'
     
  user='admin'
     
  pwd='admin'
     
  model='ocr'
     
  ocrfile='cbi'
 
     
  values={'user':user, 'pwd':pwd, 'model':model,
'ocrfile':ocrfile, 'imgurl':imgurl}
     
  data=urllib.urlencode(values)
 
     
  try:
     
     
    url+=data
     
     
   
urlcontent=urllib2.urlopen(url)
     
  except IOError:
     
     
    print '***ERROR: invalid URL
(%s)' % url
 
     
  page=urlcontent.read(500000)
 
     
  # Parse the xml data and get the verifying
code
     
  root=ET.fromstring(page)
     
  node_find=root.find('AddField')
     
  authcode=node_find.attrib['data']
 
     
  return authcode
 
#------------------------------------------------------------------------------
# Read users from configure file
def ReadUsersFromFile(filename):
     
  users={}
     
  for eachLine in open(filename, 'r'):
     
     
    info=[w for w in
eachLine.strip().split()]
     
     
    if len(info)==2:
     
     
     
     
users[info[0]]=info[1]
 
     
  return users
 
#------------------------------------------------------------------------------
def main():
     
 
login_page=r'http://www.***.com.cnlogin/login.jsp'
     
 
download_page=r'http://www.***.com.cn***/***?record_id='
 
     
  start_id=8593330
     
  end_id=8595000
 
     
  now_id=start_id
     
  Users=ReadUsersFromFile('users.conf')
     
  while True:
     
     
    for key in Users:
     
     
     
      if
ChinaBiddingLogin(login_page, key, Users[key]):
     
     
     
     
     
  for i in range(3):
     
     
     
     
     
     
    pageUrl=download_page+'%d' %
now_id
     
     
     
     
     
     
   
urlcontent=urllib2.urlopen(pageUrl)
 
     
     
     
     
     
     
    filepath='./download/%s.html'
% now_id
     
     
     
     
     
     
    f=open(filepath, 'w')
     
     
     
     
     
     
   
f.write(urlcontent.read(500000))
     
     
     
     
     
     
    f.close()
 
     
     
     
     
     
     
    now_id+=1
     
     
     
     
else:
     
     
     
     
     
  continue
#------------------------------------------------------------------------------
 
if __name__=='__main__':
     
  main()

[转载]python实现带验证码网站的自动登陆的更多相关文章

  1. Python爬虫模拟登录带验证码网站

    问题分析: 1.爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 2.首先得明白 ...

  2. python 简单图像识别--验证码

    python  简单图像识别--验证码 记录下,准备工作安装过程很是麻烦. 首先库:pytesseract,image,tesseract,PIL windows安装PIL,直接exe进行安装更方便( ...

  3. php使用curl模拟登录带验证码的网站[开发篇]

    需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...

  4. php使用curl模拟登录带验证码的网站

    需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...

  5. python+splinter实现12306网站刷票并自动购票流程

    python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...

  6. Python验证码6位自动生成器

    Python验证码6位自动生成器

  7. 用HttpWebRequest提交带验证码的网站

    using System; using System.Drawing; using System.IO; using System.Net; using System.Text; using Syst ...

  8. 利用htmlunit登陆带验证码图片的网站

    http://htsoft.org/html/y2011/822_using-htmlunit-landing-site-with-captcha-image.html 利用htmlunit登陆带验证 ...

  9. 使用C#登录带验证码的网站

    我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法.验证码的由来几年前,大部分网站.论坛之类的是没有验证码 ...

随机推荐

  1. python学习笔记十一:操作mysql

    一.安装MySQL-python # yum install -y MySQL-python 二.打开数据库连接 #!/usr/bin/python import MySQLdb conn = MyS ...

  2. 超链接标签的CSS伪类link,visited,hover,active

    CSS伪类,是一种特殊的类,它针对到CSS选择器起作用,使选中的标签或元素产生特定的效果. CSS伪类的语法就是: 选择器 : 伪类名 { 属性 : 属性值 } 用的最多的伪类就是超链接a的伪类,有: ...

  3. CV限制符--C++

    C/C++提供多种声明变量和函数存储持续性.作用域和链接性的关键字,有些被称为存储说明符(store class specifier)或 cv 限定符(cv-qualifier),这里就一起学习一下c ...

  4. [Leetcode/Javascript] 461.Hamming Distance

    [Leetcode/Javascript] 461.Hamming Distance 题目 The Hamming distance between two integers is the numbe ...

  5. Linux 文本对比 diff 命令详解(整理)

    diff 命令详解 1.概述 windows系统下面就有不错的文本对比工具可以使用,例如常用的Beyond Compare,WinMerge都是图形界面的比较工具而且使用非常方便,如果你仅仅是在win ...

  6. abp ef codefirst 设置默认值

    public partial class tableIsWaringfiled : DbMigration { public override void Up() { //设置默认值为true Add ...

  7. ci重写 配置文件

    server { listen 80; #listen [::]:80; server_name wangyongshun.xyz www.wangyongshun.xyz; index index. ...

  8. Win10 WSL Ubuntu18.04 编译安装MySQL5.7

    ---恢复内容开始--- 在win10 商店中选择 ubuntu18.04 下载地址 http://dev.mysql.com/downloads/mysql/ wget https://cdn.my ...

  9. windows系统设备管理器显示全部硬件

    下面的小命令能让隐藏的未卸载掉的硬件设备彻底现身:开始-运行-CMD C:\> C:\>start devmgmt.msc 之后再在Windows 的设备管理器中,单击菜单“显示”-“显示 ...

  10. [THUWC2017][bzoj5020] 在美妙的数学王国中畅游 [LCT+泰勒展开]

    题面 LOJ传送门 思路 这里很重要 它提示我们,把给定的三个函数泰勒展开,并用LCT维护每一项泰勒展开式的值,维护十几项就满足了题目的精度要求 我们考虑一个函数在0位置的泰勒展开 $f(x)=\su ...