User-Agent
为 request 添加 user-agent 后尝试。可以说这是任何爬虫都需要做的伪装。
Proxy
大部分情况下需要上代理池,从而规避 IP ban。
Cookie
有的网站,则会根据你的 cookie 识别你是人还是机器。
步骤(以拉勾网为例)
- 关闭浏览器的 cookie 并删除掉现有 cookie,然后访问页面,如果页面不正常,则可推定网站采用了 cookie 反爬。
贴士:可以点击 chrome 地址栏的小锁,然后删除 cookie,不用全部清除,因为这会导致你需要重新登录各种网站。
- 打开 postman.app,启动 interceptor 并清空 history。初次使用会让你装一个 chrome app。
也可以用 brew 安装:
brew cask install postman
- 接下来清空浏览器上该页面的 cookie。然后刷新页面,此时 postman 会获取到浏览器的各种请求。通过 chrome 的 network 找到其中返回目标数据的那一个请求。
- 在 postman 中“重现”这个访问。通过筛查发现,只需要保留 User-Agent 和 Referer 这两项在 headers 里就能正确返回数据。这是因为启动 interceptor 之后 postman 和 chrome 是连通的,前者能获取后者的 cookie。
- 逐步删除 cookie 并重试,就能最终确定起作用的 cookie 是什么。本例中发现,只需要 user_trace_token 这一项即可拿到数据。
- 可以通过访问页面先拿 cookie。
from urllib import request
from http import cookiejar
if __name__ == '__main__':
# 声明一个CookieJar对象实例来保存cookie
cookie = cookiejar.CookieJar()
# 利用urllib.request库的HTTPCookieProcessor对象来创建cookie处理器,也就CookieHandler
handler=request.HTTPCookieProcessor(cookie)
# 通过CookieHandler创建opener
opener = request.build_opener(handler)
# 此处的open方法打开网页
response = opener.open('https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=')
# 打印cookie信息
for item in cookie:
print('Name = %s' % item.name)
print('Value = %s' % item.value)
# 输出
Name = user_trace_token
Value = 20180527163349-64c256fa-556c-43e8-827e-c016f4b15cda
以上。
参考文献:
https://www.jianshu.com/p/a2f74805e54f
http://www.shenjianshou.cn/blog/?p=289