发布时间:2019-09-22 07:41:01编辑:auto阅读(1935)
下图是某个网站的登陆界面,接下来就让我们通过命令行模拟浏览器实现登陆操作,看看一个简单的登陆操作,具体是如何实现的。
首先,我们先来明确登陆该网站的所有步骤:
import requests
import time
from io import BytesIO
from PIL import Image
import re
from lxml import etree
python-requests
字样,使服务器一眼就能识别我们是爬虫程序。为了更加完美的模拟浏览器,我们不妨多写几行代码。# http请求头
header = {
"accept":"*/*",
"accept-encoding":"gzip, deflate",
"accept-language":"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"cache-control":"no-cache",
"connection":"keep-alive",
"host":"dxxxxxxxxxx.cn",
"pragma":"no-cache",
"referer":"http://xxxxxxxxxx.cn/login.htm",
"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
# 登陆时需要提交的验证信息
data = {
"username":"wangxxxxxxxxxx.cn",
"keyp":"xxxxxxxxxxxxxxxxxxxxxxxxx",
"submitBtn":"登录"
}
# 初始化cookie信息
cookie = requests.cookies.RequestsCookieJar()
cookie.set("u", "5", domain="xxxxxxxxxx.cn", path="/")
# 网络地址
capt_url = "http://xxxxxxxxxx.cn/servlet/ImageServlet"
login_url = "http://xxxxxxxxxx.cn/login.htm?m=login"
subsite_url = "http://xxxxxxxxxx.cn/favorite.htm"
logout_url = "http://xxxxxxxxxx.cn/login.htm?m=cancel"
HTTP header
更新cookie信息,所以之后就不需要我们手动更新cookie了。s = requests.Session()
s.headers = header
s.cookies = cookie
long类型
的时间戳。当然我们也可以在python中直接调用Java的currentTimeMillis
方法,不过这里我们就直接用python的time函数做了一下简单的处理。d = int(time.time() * 1000)
capt_raw = s.get(capt_url, params = {"d":d})
这里我们从网站获取的capt_raw
响应对象是以raw的数据形式存储的,而且存储的是整张图片的信息,而不是二进制的图像像素数据,所以不能直接用Image.frombytes
转换为Image对象。查看Image.frombytes
方法的帮助文档:
Note that this function decodes pixel data only, not entire images.
If you have an entire image in a string, wrap it in a :py:class:~io.BytesIO
object, and use :py:func:~PIL.Image.open
to load it.
得到解决方案:先将raw数据写入IO流,再通过Image.open
方法打开。不能一行代码搞定,还是有点气的。而且Image.open
方法有一个参数flag
,只能传递“r”
(从文件中读取),就不能换个参数,跳过读取文件这一步,直接从内存中读入数据吗?
# 将二进制的图片写入IO流
f = BytesIO()
f.write(capt_raw.content)
# 查看验证码
capt = Image.open(f)
capt.show()
# 关闭IO流
f.close()
输入验证码:
,等待我们输入刚才得到的验证码,然后将接收到的输入作为表单的一部分提交给服务器。data["verifyCode"] = input("输入验证码:")
login_result_html = s.post(login_url, data = data, allow_redirects=True)
login_result_html
,我们怎么知道自己是否登陆成功了呢?这里我们使用xpath语句查询返还的页面,看看自己的账户名是否在返回值列表中出现了!doc = etree.HTML(login_result_html.text)
doc.xpath("//li/a//*/text()")
myCollection**
都是我自己取的。subsite_html = s.get(subsite_url)
re.compile("myCollection\\d+").findall(subsite_html.text)
logout_url
网址就可以了。此时我们再去请求子网站就不能获得收藏的信息了,而是被跳转到登陆页面。最后,不要忘记关闭hui’hsession。s.get(logout_url)
s.close()
本帖仅供学习交流,请勿用于其它用途。
上一篇: python 常用包总结
下一篇: python读取leveldb数据
47834
46376
37259
34721
29304
25964
24883
19942
19531
18013
5782°
6406°
5919°
5957°
7058°
5903°
5935°
6431°
6399°
7769°