模拟登陆豆瓣的程序。
#-*- 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('&', '&')
#输出验证码图片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 ''