当你在数据采集做爬虫的时候,我们都要用到HTTP协议的GET方法和POST方法。今天我们暂且介绍一下POST方法。也就是把信息推送到网络服务器进行存储和分析。
页面表单基本可以看成一种用户提交POST请求的方式,且这种请求方式是服务器能够理解的,而POST方法一般都被用来认证。正如网站的URL链接可以帮助用户提交GET请求一样,HTML表单可以帮助用户提交POST请求。在python中,我们可以利用一些强大的库来实现我们的目的。
虽然python的标准库也可以控制网页表单,但是还是比较喜欢python的第三方库Requests库。这是极其强大的库,今天我们介绍的也只是其中一部分,它擅长处理那些复杂的HTTP请求,cookie,header(响应头和请求头)等。
Requests的创建者Kenneth Reitz创造的初衷就是要避免我们在工作耗费过多的体力在POST请求方面。可见Requests库的诞生正如python诞生的缘由一样,为了简单!
首先体验下最简单的POST提交,仅仅需要4行代码实现!
import requests
params={'firstname':'cck','lastname':'Mi'}
r=requests.post("http://pythonscraping.com/files/processing.php",data=params)
print(r.text)
这个POST仅仅提交了两个简单的字段,一个是firstname,一个是lastname。虽然极其简单,但是我们通过这几行代码,我们见识了Requests的强大,简单几行代码就搞定了表单的提交!
我们在进行POST提交时通常要注意两点:
1.你想提交数据的字段名称(firstname,lastname)
2.表单的action属性,也就是表单提交后网站会显示的页面(这里是上面代码中第三行中的链接)
如果我们需要提交文件和图片时应该怎么办呢?利用Requests库也只是几行简单的代码。
import requests
files={'uploadFile':open('D:\博客相关资料\资料\博客图片\h1.png','rb')}
r=requests.post("http://pythonscraping.com/pages/processing2.php",files=files)
print(r.text)
无论是名字提交,还是上传图片和文件。我们都还没接触到涉及Requests库是怎么处理cookie的。大多数网站都用cookie跟踪用户的登陆状态,一旦网站验证了你的登陆权证,它就会将它们保存在你的浏览器cookie中,里面通常包含一个服务器生成的令牌,登陆有效时限和状态跟踪信息。网站会把这个cookie当作信息验证的证据,在你浏览网站的每个页面时出示给服务器。
用Requests库跟踪cookie也同样简单:
import requests
params={'username':'cck','password':'password'}
r=requests.post("http://pythonscraping.com/pages/cookies/welcome.php",params)
print("Cookie 为:")
print(r.cookies.get_dict())
print("............")
print("被传递cookie的页面是....")
#把cookie传递给下面的页面以保持登陆
r=requests.get("http://pythonscraping.com/pages/cookies/profile.php",cookies=r.cookies)
print(r.text)
请求头在网络请求中也扮演着十分重要的角色,根据请求头的参数响应网站不同的语言版本。因此,你只要简单地把请求头属性从Accept-Language:en-US 修改成Accept-Language:en-fr ,就可以获得网站的法语版本!HTTP协议定义了十几种请求头,但常用的也就7,8个,如果不设置请求头,Python会自动设置User-Agent字段为 Python-urllib/3.4 ,这样你设计的爬虫很容易被拒绝访问网站。所以通常我们需要自己来设置请求头。
import requests
from bs4 import BeautifulSoup
session=requests.Session()
headers={"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML,like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*,q=0.8"}
r=session.get("https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending",headers=headers)
cck=BeautifulSoup(r.text,"lxml")
print(cck.find("table",{"class":"table-striped"}).get_text)
这样处理对于简单的网页没有问题,但对于复杂的网站,它会自己调整cookie,这时候我们利用session函数来解决这些问题。
import requests
session=requests.Session()
params={'username':'cck','password':'password'}
r=requests.post("http://pythonscraping.com/pages/cookies/welcome.php",params)
print("Cookie is to:")
print(r.cookies.get_dict())
print("............")
print("被传递cookie的页面是....")
r=session.get("http://pythonscraping.com/pages/cookies/profile.php")
print(r.text)
在发明cookie之前,处理网站登陆最常用的方法是HTTP基本接入认证。现在已经凤毛菱角,但在一些安全性较高的网站或者是些API使用上还可能会见到,基本接入认证必须通过用户名和密码才能登陆。
Requests库有一个auth模块专门处理HTTP基本接入认证:
import requests
from requests.auth import AuthBase
from requests.auth import HTTPBasicAuth
auth=HTTPBasicAuth('cck','password')
r=requests.post(url="http://pythonscraping.com/pages/auth/login.php",auth=auth)
print(r.text)
如果在提交表单时遇到一个莫名的错误,或者是被拒绝接入,这就可能涉及到了蜜罐,隐藏字段以及其它保护网站的措施,如果你是开发者,你也不想自己服务器资源都被大量的网络爬虫给占用,但是攻守相辅相成,在以后的文章里我们会慢慢探讨这个问题。