让爬虫看起来更像人类用户

让爬虫看起来更像人类用户

修改请求头

使用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 浏览器能够进行解码的数据编码方式,比如gzipServlet能够向支持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,或者一开始就不想要用cookieRequests库的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)

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 121,039评论 16 134
  • HTTP cookie(也称为web cookie,网络cookie,浏览器cookie或者简称cookie)是网...
    留七七阅读 13,587评论 2 71
  • http://www.91ri.org/tag/fuzz-bug 通常情况下,有三种方法被广泛用来防御CSRF攻击...
    jdyzm阅读 2,979评论 0 6
  • 注:本文转载自前端大全 背景 在HTTP协议的定义中,采用了一种机制来记录客户端和服务器端交互的信息,这种机制被称...
    楠小忎阅读 448评论 0 0
  • http协议有http0.9,http1.0,http1.1和http2三个版本,但是现在浏览器使用的是htt...
    一现_阅读 1,308评论 0 3