1.cookies
对于需要登录的网站该如何爬取呢?例如知乎,如果访问https://www.zhihu.com/,是需要我们登录才能进入知乎网的,有时候我们又会发现,由于之前登录过,再次登录的时候便不需要输入密码了这就涉及到cookies
了,cookies在网站开发时,或多或是少一定会用到,以知乎为例,当我们提问,评论,赞别人的时候,后台程序是如何获取我们的用户信息呢?下次登录不需要用户名和密码会自动登录又是为什么呢?
什么是coohkies
Cookie 可以翻译为“小甜品,小饼干” ,Cookie 在网络系统中几乎无处不在,当我们浏览以前访问过的网站时,网页中可能会出现 :你好XXX,这会让我们感觉很亲切,就好像吃了一个小甜品一样。这其实是通过访问主机中的一个文件来实现的,这个文件就是 Cookie。在 Internet 中,Cookie 实际上是指小量信息,是由 Web 服务器创建的,将信息存储在用户计算机上的文件。一般网络用户习惯用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 Session 跟踪而存储在用户本地终端上的数据,而这些数据通常会经过加密处理
——百度百科
爬虫如何人利用cookies
打住不扯了!个人博客写成教程了,我们可以通过chrome开发者工具直接获取登录时的cookies信息,通过在爬虫中的请求头,携带cookies信息从而直接爬取需要登录的网站
picone.pngheaders = {
'cookie': 'q_c1=5dec8a0aca1f4e97ae130fea2e6188e0|1526296809000|1526296809000; '
'_zap=affbbfc8-88a9-4d68-8a7d-f5c30e89b9c2; '
'l_cap_id="OThiOWJiNTcwMDhjNGU0MjhlZTYxMjhiYjIxMzgyMTE=|1526296855|0fffd3ed026805f2a7ca2e514535a5cc094a1d63"; '
'r_cap_id="ZTk1NDYzYmVjZTUxNDBjOWE4YWE2NzdmNTRjYzY0ZWQ=|1526296855|33ffa6e2b3289fbb75be2a9d35480df7336a2814"; '
'cap_id="Yjc0YTI4YzExZTAxNDlhYjg5MTZjZDdjNTI2ZWQ1NTY=|1526296855|f2198b5b502e3011363374bee7eb523e67121bce"; '
'd_c0="ABCjx5U3nw2PTrIxjGEomuotDoNd7P11BtE=|1526803180"; capsion_ticket="2|1:0|10:1526803184|14:capsion_ticket|44:NmMyYzA3MGU4OGEwNGMyZWEyOGFhMmZjYWNiY2Q1OTA=|5ad595e972dbcd1445658595d0b51269d94ebebe57eea42afc9d00886064606a"; z_c0="2|1:0|10:1526803216|4:z_c0|92:Mi4xTEhhdkJBQUFBQUFBRUtQSGxUZWZEU2NBQUFDRUFsVk5FTGdvV3dEd3hQY2l0UjdZaHZzMzNVdUVJOEhUZXBmZTJR|ae1d050370cfa33c6a62d2dc02babcf4fca8ead6baa7c64e8c1b366a96f54f5f"; tgw_l7_route=860ecf76daf7b83f5a2f2dc22dccf049; _xsrf=227b96ac-26aa-4022-92fb-1895fc774d86',
'Host':'www.zhihu.com',
'user-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/66.0.3359.139 Chrome/66.0.3359.139 Safari/537.36'
}
r = requests.get('https://www.zhihu.com',headers=headers)
print(r.text)
<!doctype html>
<html lang="zh" data-hairline="true" data-theme="light"><head><meta charSet="utf-8"/><title data-react-helmet="true">
(5 封私信 / 53 条消息)首页 - 知乎</title><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1"/><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/><meta name="google-site-verification" content="FTeR0c8arOPKh8c5DYh_9uu98_zJbaWw53J-Sch9MTg"/><link rel="shortcut icon" type="image/x-icon" href="https://static.zhihu.com/static/favicon.ico"/><link rel="search" type="application/opensearchdescription+xml" href="https://static.zhihu.com/static/search.xml" title="知乎"/><link rel="dns-prefetch"............
从结果可以看到我们已经获取到了成功登录的网页信息了,显示我有5封私信,53条消息
2.会话对象
有时候我们不会仅仅爬取网站的一个页面,而是爬取多个页面,这就需要我们发送多个post,get请求,由于http是无状态协议,也就是说,前后几次的请求是互不相关的,举个例子,前一个requests请求携带了cookies信息,成功登录了网站,下一个requests请求要爬取,另一个新的页面
这是,我们还是要携带cookies信息的,requests为我们提供了Sessiond对象来维持一个会话
requests.get('http://httpbin.org/cookies/set/number/123456')
r = requests.get('http://httpbin.org/cookies')
print(r.text)
>>>{"cookies":{}}
请求测试网站时设置了cookies值,再次请求,获取cooies值时返回了空值,说明服务服务器并不认为,两次请求是一个对象发起的,事实上两个请求都是我电脑上的同一个程序发起的,再次验证了http是无状态协议
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456')
r = s.get('http://httpbin.org/cookies')
print(r.text)
>>>{"cookies":{"number":"123456"}}
通过Session对象我们维持了这个会话
3.身份认证
身份认证也称为“身份验证”或“身份鉴别”,是指在计算机及计算机网络系统中确认操作者身份的过程,从而确定该用户是否具有对某种资源的访问和使用权限,进而使计算机和网络系统的访问策略能够可靠、有效地执行,防止攻击者假冒合法用户获得资源的访问权限,保证系统和数据的安全,以及授权访问者的合法利益。
有些网站资源需要我们输入身份验证信息才能访问,许多要求身份认证的web服务都接受 HTTP Basic Auth。这是最简单的一种身份认证,并且 Requests 对这种认证方式的支持是直接开箱即可用,可以通过下面这种简单的方式实现
import requests
r = requests.get('https://api.github.com/user',auth=('Yhchdev','mypassword'))
print(r.status_code)
>>> 200
import requests
r = requests.get('https://api.github.com/user',auth=('yanghaocheng','888'))
print(r.status_code)
>>> 401
这里我通过github的用户身份验证API,进行测试,我的帐号是Yhchdev,密码当然不会告诉你了,验证成功了返回200ok,如果我随意输入了一个不存在的帐号和密码,返回的状态码为401错误(一般来说该错误消息表明您首先需要登录(输入有效的用户名和密码)。 如果你刚刚输入这些信息,立刻就看到一个 401 错误,就意味着,无论出于何种原因您的用户名和密码其中之一或两者都无效果),其实就是身份验证失败了
4.SSL证书验证
HTTPS的安全基础是SSL,它所传输的内容都是经过加密的而某些网站虽然使用了HTTPS协议,但还是会被浏览器提示不安全,例如我们在Chrome浏览器里面打开12306,链接为:https://www.12306.cn/,这时浏览器就会提示“您的连接不是私密连接”这样的话,如图下图
pictwo.png这是因为12306的CA证书是中国铁道部自行签发的,而这个证书是不被CA机构信任的,所以这里证书验证就不会通过而提示这样的话,但是实际上它的数据传输依然是经过SSL加密的。如果要爬取这样的站点,就需要设置忽略证书的选项,否则会提示SSL链接错误。
如果我们通过爬虫爬取
r = requests.get('https://www.12306.cn')
print(r.status_code)
print(r.text)
>>>requests.exceptions.SSLError: hostname 'www.12306.cn' doesn't match either of 'webssl.chinanetcenter.com',
SSLEroor,SSL证书错误,这时可以通过设置verify=False来关闭SSL认证
r = requests.get('https://www.12306.cn',verify=False)
print(r.status_code)
print(r.text)
>>>200
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>.......
这样就获得了内容了
小结
关于requests库的高级用法还有很多,requests库是支持代理的, 一些网站,测试的时候没什么问题,一旦开始大规模爬取,对方便会封锁你的IP,这时就需要代理,用到的时候再学习就行了,后期会一直更新爬虫的学习成果和笔记,但估计以后一个月不会再写博客了(逃)
投喂我
写文不易,如果本文对你有帮助,点击Donate,微信和支付宝投喂我
网友评论