首页 > python re和urllib的使用问题。

python re和urllib的使用问题。

模拟登陆豆瓣的程序。

#-*- coding:utf-8-*-
import urllib
import urllib2
import re
import cookielib
import sys
reload (sys)
sys.setdefaultencoding("utf-8")

username = ''
password = ''

cookie = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)

url = 'http://www.douban.com/'
req = urllib2.Request(url)
res = urllib2.urlopen(req)


loginurl = 'https://accounts.douban.com/login'
headers = {"User-Agent":'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}

data = {
    "ck":'93rI',
    "source":'None',
    "redir":'http://www.douban.com',
    "form_email":'username',
    "form_password":'password',
    "remember":'on'
    "login":'登陆'
}
dt = urllib.urlencode(data)
request = urllib2.Request(loginurl,dt,headers)
response = opener.open(request)
page = response.read()
print page

data里面那个中文 “登陆” 我怎么表示。这个程序运行之后显示的是 登陆那个地方无效的语法。
2.在正则中如果我要匹配中文要怎么匹配,把中文转换成utf-8码?中文和这个怎么转换。
3.chrome 开发者工具的问题,我登陆豆瓣的时候能够看到
URL和post表单,但是登陆直呼的时候却找不到,准确来说我就是没在name里找到login这个所以自然找不到post表单。我用火狐可以找到。
再来一个吧,这个是登陆知乎的程序。都大同小异,别人给我改过一次。我自己写的结果是验证码写不要出来。改完之后i是这样的:

 # -*- coding: utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

import urllib
import urllib2
import cookielib
import re

#设置账号(Email类型)
username = ''
password = ''


#Cookie
cookie = cookielib.CookieJar()
cookie_handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(cookie_handler)
urllib2.install_opener(opener)


#请求首页
url = 'http://www.zhihu.com/'
request = urllib2.Request(url)
res = urllib2.urlopen(request)
contents = res.read().decode('utf-8')

#得到 token
pattern = re.compile(r'<input type="hidden" name="_xsrf" value="(.*?)"/>',re.S)
result = re.findall(pattern,contents)
xsrf = result[0]

#请求验证码
Captcha_URL= 'http://www.zhihu.com/captcha.gif?r=11111111'
r = urllib2.urlopen(urllib2.Request(Captcha_URL))

#写入文件
with open('code.gif','wb') as f:
    f.write(r.read())

#输入 4位的 验证码
captcha =raw_input('captcha: ')


#构造登陆时的数据
lgurl = 'http://www.zhihu.com/login/email'
hdr = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:43.0) Gecko/20100101 Firefox/43.0'}
post_data = {
  '_xsrf':xsrf,
  'email':username,
  'password':password,
  'rememberme':'true',
  'captcha':captcha
}

#提交登陆
dt = urllib.urlencode(post_data)
req = urllib2.Request(lgurl, dt, hdr)

response = opener.open(req)
page = response.read()
print page

这个代码,有两个不明白的地方一个是获取验证之后那三行

r = urllib2.urlopen(urllib2.Request(Captcha_URL))

写入文件

with open('code.gif','wb') as f:
f.write(r.read())

为什么要打开这个r 还有为什么要写入文件。

其次是,运行之后要输入验证码,我就点开验证码的url每次输入之后显示的结果还是验证码错误。

请大家赐教。感激不尽。把这几个程序弄完之后就开始学习requests和beautiful soup了。还有那些常用的库要学习还请大家跟我说一下。如果大家有好的资源能分享一下就更好了。真的非常谢谢!


我不知道你为什么会选择用Python来做, 我想你既然用Python了,至少得懂一点Python脚本吧.

#请求验证码图片
r = urllib2.urlopen(urllib2.Request(Captcha_URL))

#将得到的数据(r.read()), 写入 `code.gif` 文件中
with open('code.gif','wb') as f:
  f.write(r.read())

故你要输入的验证码字符是来自于 code.gif 这个文件中的, 不是你自己通过浏览器单独打开 验证码图片的URL 里的那个.

你在浏览器中打开验证码图片的URL地址, 看到的验证码与你程序中的不是同一个会话(Session), 所以不管你怎么输入都是不会正确的.


你第一段的程序里会出错,是因为你少写了一个 , 号.

虽然 python 的报错信息中, 行号的位置不是标的 登陆 这一行, 但这个错误是因为上面那行没写,号引起的.
所以仔细观察一下, 就能看出来, 是因为少写了 , 号造成的.


再次更新:

运行结果:

下面的代码保存的时候文件编码为 utf-8


# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import cookielib
import sys
reload (sys)
sys.setdefaultencoding("utf-8")

from HttpClient import HttpClient


#这里填写自己的账号和密码
username = 'xxxx'
password = 'yyyyy'





http = HttpClient()

DOUBAN_URL = 'http://www.douban.com/'

#请求首页
res = http.Get(DOUBAN_URL)


loginurl = 'https://accounts.douban.com/login'


data = {
    "source":'index_nav',
    "form_email":username,
    "form_password":password,
    "remember":'on'
}


result = http.Post(loginurl, data, DOUBAN_URL)

#检测是否需要验证码
if '输入上图中的单' in result:
  cap = re.compile(r'<img id="captcha_image" src="(.*?)"',re.S)
  img = re.findall(cap, result)
  #得到验证码图片的URL地址
  url = img[0].replace('&amp;', '&')
  #输出验证码图片URL
  print url

  #下载验证码, 保存为 code.jpg
  http.Download(url, 'code.jpg')

  #请输入验证码
  code = raw_input("captcha: ")

  #从验证码的URL中匹配出来, 验证码ID
  cid = re.compile(r'id=(.*?)&', re.S)
  cid = re.findall(cid, url)

  cid = cid[0]

  result = http.Post(loginurl, {
      "source":'index_nav',
      "form_email":username,
      "form_password":password,
      'captcha-solution': code,
      'captcha-id': cid
  }, DOUBAN_URL)


if 'accounts/logout' not in result:
  print "Login Failed ..."
else:
  print "login Success ..."

print result[:100]

上面代码中有使用到一个自定义的类, 代码如下(保存的文件名为 HttpClient.py, 保存位置与上面代码同一个文件夹下)

import cookielib, urllib, urllib2, socket

class HttpClient:
  __cookie = cookielib.CookieJar()
  __req = urllib2.build_opener(urllib2.HTTPCookieProcessor(__cookie))
  __req.addheaders = [
    ('Accept', 'application/javascript, */*;q=0.8'),
    ('User-Agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)')
  ]
  urllib2.install_opener(__req)

  def Get(self, url, refer=None):
    try:
      req = urllib2.Request(url)
      if not (refer is None):
        req.add_header('Referer', refer)
      return urllib2.urlopen(req, timeout=120).read()
    except urllib2.HTTPError, e:
      print e.read()
      return e.read()
    except socket.timeout, e:
      return ''
    except socket.error, e:
      return ''

  def Post(self, url, data, refer=None):
    try:
      req = urllib2.Request(url, urllib.urlencode(data))
      if not (refer is None):
        req.add_header('Referer', refer)
      return urllib2.urlopen(req, timeout=120).read()
    except urllib2.HTTPError, e:
      print e.read()
      return e.read()
    except socket.timeout, e:
      return ''
    except socket.error, e:
      return ''

  def Download(self, url, file):
    output = open(file, 'wb')
    output.write(urllib2.urlopen(url).read())
    output.close()

  def getCookie(self, key):
    for c in self.__cookie:
      if c.name == key:
        return c.value
    return ''
【热门文章】
【热门文章】