程序员首页投稿(暂停使用,暂停投稿)

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

2017-10-30  本文已影响55人  lucky9322

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

修改请求头

使用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)
上一篇下一篇

猜你喜欢

热点阅读