天天看点

form提交后刷新网页_【VSRC唯科普】穿越网页表单与登录窗口的采集(第9/14篇)...

鸣 谢

form提交后刷新网页_【VSRC唯科普】穿越网页表单与登录窗口的采集(第9/14篇)...

VSRC感谢业界小伙伴——Mils 投稿精品科普类文章。VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相送,我们已为您准备好了丰富的奖品!

(活动最终解释权归VSRC所有)

到目前为止,唯科普所有示例中的代码,在和大多数网站服务器进行数据交互时,都是采用了HTTP协议的GET方式去请求信息。今天的唯科普,将重点介绍POST方法,即把信息推送到服务器进行存储和分析。在页面进行表单提交的方式可以被认为是一种用户提交POST请求的方式,且这种请求方式是服务器能够理解和使用的,就像点击网站的URL链接后可以发送一条GET请求一样,HTML表单则可触发POST请求,这些都可以通过Python代码来模拟实现。希望本文能对你的python学习有用。

1.让HTTP服务人类的Requests库

Python有很多标准库可以控制网页表单,其中的Request库则较为擅长处理复杂的HTTP请求、cookie、header(响应和请求头)等内容,Requests是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的设计是以 PEP 20 为原则,这使得其似乎显得更加 Pythoner。

Python之禅:PEP20--The Zen of Python

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren't special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one-- and preferably only one --obvious way to do it.

Although that way may not be obvious at first unless you're Dutch.

Now is better than never.

Although never is often better than *right* now.

If the implementation is hard to explain, it's a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea -- let's do more of those!

在Windows里面通过命令行pip install requests便可完成安装,并且在Python里面直接通过import requests直接导入该模块便可使用,我们可以通过requests模拟发送一条使用GET方式访问VSRC主站:https://sec.vip.com的请求并获得返回值:200。

import requests
r = requests.get("https://sec.vip.com")
print r.status_code
           

2.提交一个基本表单

下面我们来看如何使用Requests库提交一个基本的表单,通常最基本的网页表单通常由一些HTML字段、提交按钮、在表单处理完成之后的action值即“执行结果”页面构成。表单源码如下:

html>
<html >
<head>
    <meta charset="UTF-8">
    <title>form1title>
head>
<form method="post" action="processing.php">
<br> First Name: <input type="text" name="firstname"> br>
<br> Last Name:  <input type="text" name="lastname"> br>
<br> <input type="submit" value="submit">
form>
body>
html>
           

注意这里的输入字段名称是First Name和Last Name,字段的名称决定了表单被确认后要传送到服务器上的变量名称,在模拟数据传递的过程中,我们需要确保变量名称与字段名称相一致。该表单的真实行为实际发生的页面为processing.php,我们提交的POST请求其实都发生在这个页面上,并非表单本身。这里值得注意的是HTML表单的目的,只是帮助网站的访问者发送格式合理的请求。使用Requests库提交表单只需要四行代码即可,包括导入库文件和打印内容的语句:

import requests
params = {'firstname':'Mils','lastname':'Huang'}
r = requests.post ('http://pythonscraping.com/pages/files/processing.php', data=params)
print (r.text)
           

表单被提交之后,程序会返回以下内容:

Hello there, Mils Huang!
           

3.单选按钮、复选框和其他输入

除了文字字段和提交按钮,HTML标准里提供了大量可用的表单字段:单选按钮、复选框和下拉选框等。无论表单的字段多么复杂,仍然需要着重关注两件事情:字段名称和值。如果不确定一个输入的字段值的数据格式,有些工具可以跟踪浏览器的输入和输出,最好也是最直观的办法就是查看GET请求,就像之前提到的查看网站URL。如果网站的URL格式类似如下所示:

http://testdomain.com?thing1=param1&thing2=param2
           

那么应该就能知道这个请求对应的表单如下:

html>
<html >
<head>
    <meta charset="UTF-8">
    <title>form2title>
head>
<body>
<form method="GET" action="someProcessor.php">
<input type="input1" name="thing1" value="param1" />
<input type="input2" name="thing2" value="param2" />
<input type="submit" value="Submit" />
form>
body>
html>
           

对应的python参数则为:

{'thing1':'param1','thing2':'param2'}
           

小贴士:可以使用Chrome浏览器的审查元素(inspector)或开发者工具都能帮助我们查看浏览器向服务器所传递的数据内容。

以VSRC的注册页面为例,我们在注册的时候通过inspector查看便能发现其注册地址为:

Request URL:https://sec.vip.com/doregister
           

通过inspector查看其实际需要提交的表单元素如图所示:

form提交后刷新网页_【VSRC唯科普】穿越网页表单与登录窗口的采集(第9/14篇)...

注册成功则会返回以下提示:

form提交后刷新网页_【VSRC唯科普】穿越网页表单与登录窗口的采集(第9/14篇)...

4.提交文件和图像

接下来我们来看上传文件及图像的功能,以下示例用于文件上传,源码如下:

html>
<html >
<head>
    <meta charset="UTF-8">
    <title>form3fileuploadtitle>
head>
<body>
<form action="processing2.php" method="post" enctype="multipart/form-data">
    Pls submit a jpg, png, or gif:
    <input type="file" name="image">
    <input type="submit" value="Upload File">
form>
body>
html>
           

可以看到在标签内有一个type属性,使用Python处理方式如下:

import requests
files = {'uploadFile':open('anonymous.png','rb')}
r=requests.post("http://pythonscraping.com/pages/processing2.php",files=files)
print (r.text)
           

这里提交给表单字段fileupload的值是一个用open函数打开的python文件对象,在这个例子中我提交了一个保存在与该脚本处于相同路径下的anonymous.png图片文件。

5.处理登陆和Cookie

大多数网站都会使用cookie来记录用户是否已登录的状态,一旦网站验证了你的登录,网站就会将他们保存在你的浏览器的cookie中,里面通常包含一个网站生成的令牌、登录有效时限和状态跟踪信息。网站会把这个cookie当作信息验证的证据,在浏览每个页面时出示给到服务器。

#登陆界面:我们以一个简单的登陆表单为例:用户名可以是任意值,但是密码必须是"password"
http://pythonscraping.com/pages/cookies/login.html
#欢迎界面:这个表单在欢迎页面进行登陆数据的处理:
http://pythonscraping.com/pages/cookies/welcome.php
#简介界面:并且内部包含一个简介页面:
http://pythonscraping.com/pages/cookies/profile.php
           

如果在登录网站之前你想先进入“欢迎页面”或“简介界面”,会看到一个错误信息和访问前请先登录的指令,在简介页面中,网站会检测浏览器的cookie,检查他是否存在页面已登录的设置信息。

下面我们来使用Request库跟踪cookie信息:

import requests
params = {'username':'Mils','password':'password'}
r = requests.post("http://pythonscraping.com/pages/cookies/welcome.php",params)
print ("Cookie is set to:",r.cookies.get_dict())
r = requests.get("http://pythonscraping.com/pages/cookies/profile.php",cookies=r.cookies)
print (r.text)
           

这段代码演示的是一个较为简单的登录页面,我们能看到它首先向欢迎页面发送了一个登录参数,然后从请求结果中获取cookie并打印登录状态的验证结果,再通过cookies参数把cookie发送到简介页面。

对于较为复杂的网站及并不想使用cookie的页面该如何处理?这里我们可以使用Requests库的session函数来解决这个问题:

import requests
session = requests.Session()
params = {'username':'username','password':'password'}
s = session.post('http://pythonscraping.com/pages/cookies/welcome.php',params)
print ("Cookie is set to:", s.cookies.get_dict())
s = session.get('http://pythonscraping.com/pages/cookies/profile.php')
print (s.text)
           

在这个例子中,会话(session)对象调用requests.Session() 获取会持续跟踪会话的信息,像cookie、header,甚至包括运行HTTP协议的信息,比如HTTPAdapter为HTTP和HTTPS的链接会话提供统一接口。 

6.参考资料

1、http://cn.python-requests.org/zh_CN/latest/

2、https://www.python.org/dev/peps/

3、《Web Scraping with Python》

唯科普 | 《数据采集》目录

A.K.A "小白终结者"系列

第1篇、初识网络通信

第2篇、来点更精彩的正则表达式吧

第3篇、多种数据采集方式

第4篇、让我们加入点API

第5篇、数据的存储

第6篇、文档读取

第7篇、数据清洗

第8篇、自然语言处理之概括数据(上篇)

第8篇、自然语言处理之马尔可夫模型(中篇)

第8篇、自然语言处理之六度分割终极篇(下篇)

第9篇、穿越网页表单与登录窗口的采集

第10篇、关于数据的采集姿势

第11篇、图像识别与文字处理

第12篇、避开采集的陷阱

第13篇、开始来点正经的吧

第14篇、一点总结与心得

精彩原创文章投稿有惊喜!

form提交后刷新网页_【VSRC唯科普】穿越网页表单与登录窗口的采集(第9/14篇)...

欢迎投稿!

VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将为您准备的丰富奖金税后1000元现金或等值礼品,上不封顶!如若是安全文章连载,奖金更加丰厚,税后10000元或等值礼品,上不封顶!还可领取精美礼品!

我们聆听您宝贵建议

不知道,大家都喜欢阅读哪些类型的信息安全文章?

不知道,大家都希望我们更新关于哪些主题的干货?

现在起,只要您有任何想法或建议,欢迎直接回复本公众号留言!

精彩留言互动的热心用户,将有机会获得VSRC赠送的精美奖品一份!

同时,我们也会根据大家反馈的建议,选取热门话题,进行原创发布!

继续阅读