让爬虫看起来更像人类用户
修改请求头
使用requests模块进行处理网站的表单的时候,是可以设置请求头的。
HTTP
定义了十几种请求头类型,被经常使用的有下面几个:
属性 | 描述 | 内容 |
---|---|---|
Host | 初始URL中的主机和端口 | music.163.com |
Connection | 表示是否需要持久连接。如果Servlet 看到这里指为keep-alive ,或者看到请求使用的是HTTP1.1 ,它就可以利用持久连接的优点。 |
keep-alive |
Accept | 浏览器可以接受的MIME 类型 |
*/* |
User-Agent | 浏览器类型,如果Servlet 返回的内容与浏览器类型有关则该值非常有用 |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 |
Referrer | 包含一个URL ,用户从该URL 代表的页面发出访问当前请求的页面 |
http://music.163.com/discover/artist/signed/ |
Accept-Encoding | 浏览器能够进行解码的数据编码方式,比如gzip 。Servlet 能够向支持gzip 的浏览器返回经gzip 编码的HTML 页面。许多情况下这可以减少5到10倍的下载时间 |
gzip, deflate |
Accept-Language | 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到 | zh-CN,zh;q=0.8 |
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
"Accept": "*/*",
"Connection": "keep-alive"
}
处理cookie
大多数新式网站都用
cookie
跟踪用户是否已经登陆的状态信息。一旦网站验证了你的登陆权限,它就会将它们保存在你的浏览器cookie
中,里面通常包含一个服务器生成的令牌、登陆有效时限和状态跟踪信息。网站会把这个cookie
当作信息验证的证据,在你浏览网站的每个页面时出示给服务器。
用Requests
库跟踪cookie
同样很简单:
import requests
params = {'username': 'lucky', 'password': 'password'}
response = requests.post('http://pythonscraping.com/pages/cookies/welcome.php', params)
print('Cookie is set to:')
print(response.cookies.get_dict())
newRes = requests.get('http://pythonscraping.com/pages/cookies/profile.php', cookies=response.cookies)
print(newRes.text)
这里,首先向欢迎页面发送了一个登陆参数,它的作用就像登陆表单的处理器。然后从请求结果中获取cookie
,然后再通过cookies
参数把cookie
发送到简介页面。
对于简单的页面这样处理没有问题,但是如果面对复杂的网站,即经常暗自调用cookie
,或者一开始就不想要用cookie
,Requests
库的session
函数可以完美的解决这些问题:
import requests
session = requests.Session()
params = {'username': 'lucky', 'password': 'password'}
response = session.post('http://pythonscraping.com/pages/cookies/welcome.php', params)
print('Cookie is set to:')
print(response.cookies.get_dict())
newRes = session.get('http://pythonscraping.com/pages/cookies/profile.php')
print(newRes.text)
上面这个示例中session
会话对象会持续跟踪会话信息。
时间就是一切
有一些防护措施比较完备的网站可能会阻止快速的提交表单,或者快速的与网站进行信息交互。即使没有这些安全措施,用一个比普通人快很多的速度从一个网站上下载大量信息也可能让自己被网站封杀。
如果条件允许,尽量为每个页面访问增加一点时间间隔,即使要增加一行代码:
time.sleep(5)