本节课目录:

  • Cookie 的概念:
  • 网站 Cookie 的获取方法 :
  • Cookie 访问登录网站演示:
    • 实战演习:
  • Cookie 安全:
  • 本节课总结:

Cookie 的概念:

Cookie 是储存在用户本地终端上的数据。是由用户使用浏览器请求访问服务器端时,服务端接受到请求后会自动生成一个Cookie数据。并把Cookie 返回给浏览器,允许浏览器访问服务器网站。浏览器收到Cookie后,会把Cookie保存下来。当发送下一个请求的时候,会直接调用保存下来的Cookie 请求访问服务端。

通俗意思:
我要访问某国,首先我要申请一个我能允许通行证申请,当某国收到这个申请后,就开始制作一个通行证,然后发给我,我收到通行证之后,我就可以访问某国了。当要进入某国的时候,我需要把通行证给某国的关卡看。关卡看了后是允许访问的,然后让我进了。

其中的申请,就是发送一个请求。制作通行证就是 服务器生成了一个Cookie ,然后将 Cookie(通行证)发给我,我再一次访问服务器网站,就需要使用这个通行证,也就是这个 Cookie 。

网站 Cookie 的获取方法 :

打开CSDN 网站 https://blog.csdn.net/nav/python ,鼠标右键 查看元素 或者 检查,或者 按键盘的 F12 的快捷键,打开 开发者调试模式,点击Doc,点击 HTML 文档,点击Headers ,找到 Requests Headers ,在 Requests Headers 有一个Cookie 的一些数据。

动态图操作演示如下:

重点:
Cookie 根据网站的不一样,而不一样。有些网站需要登录之后,才能访问网页的内容,有些网站则不需要登录,也能访问。但是他们获取的Cookie 的方式都是一样,注意一点,需要登录的网站,需要您先把账号密码登录后,再去获取Cookie。

Cookie 会根据访问网站的文件不同而不同,并不是一个Cookie ,就可以全站通用。

Cookie 访问登录网站演示:

首先我需要找一个需要登录的网站,比如:QQ空间 https://qzone.qq.com/: ,截图如下:

未登录时,该网页的显示的状态【处于禁止访问状态,需要你给 通行证】:

登录时,该网页的状态【给了通行证后,就可以看到里面的内容了】:

在上述两幅图片对比,我们可以很明显看到,显示的内容都是不一样。所以当我们需要爬取登录的网站的时候,需要登录之后的Cookie 参数,来实现。

我们现在实战爬取一下QQ空间的导航目录文字,如下图红框所示:

实战演习:

在写代码前,我们需要整理自己的思路。思路是最重要的,思路清楚,可以让你走很多弯路。代码并不是很重要。代码不会的都可以网上查。下面跟着我的思路来。

  1. 账户登录QQ空间后,判断需要爬取的内容数据,是否在当前页的 Doc 下的 Html 文档。如果在,就可以直接 bs4 库采集内容。如果不在,那可能要用到是 Json 库爬取了,以后会讲。
  2. 然后复制 该 html 文档的Cookie 参数到 Python代码中
  3. 然后复制 该 html 文档的User-Agent 【浏览器标识参数代码】参数到 Python代码中 【伪装成浏览器】
  4. 如果数据在Doc 的 html 文档中,我们就选择用 bs4 工具来进行标签的赛选爬取数据。

我们思路理清楚后,就需要开始写代码了。

1.判断内容是否在 HTML 的文档中,如下图【步骤在《第9课:利用 Headers 的 Cookie 和 User-agent 伪装自己》】:


发现了内容在 Preview 中,那我们就可以用 bs4 进行爬取。

2.点击 Headers 的 找到需要请求的 URL 地址:https://user.qzone.qq.com/1436099893


3.继续找到 Headers 的 Requests Headers 的 Cookie 和 User-agent 的参数。


4.找到这两个重要参数后,就开始书写代码

#encoding:utf-8
import requests
from bs4 import BeautifulSoupheaders = {'cookie':'因为隐私问题,这里请填写您的COOKIE,我这里就不放我的COOKIE了','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',}
url = 'https://user.qzone.qq.com/1436099893'requ = requests.get(url,headers=headers)
soup = BeautifulSoup(requ.text, 'lxml')
print(soup)

得到结果如下:

D:\pro_py\venv\Scripts\python.exe D:/pro_py/教育学习/7.py
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<title>QQ空间-分享生活,留住感动</title>
<meta content="QQ空间,qzone,腾讯,社交,照片,相册,日志,说说,签到,花藤,qq农场,qq牧场,亲子相册,旅游相册" name="keywords"/>
<meta content="QQ空间(Qzone)是拥有数亿用户的社交网络,是QQ用户的网上家园,是腾讯集团的核心平台之一。您可以玩游戏、玩装扮、上传照片、写说说、写日志,黄钻贵族还可以免费换装并拥有多种特权。QQ空间同时致力于建设腾讯开放平台,和第三方开发商、创业者一起为亿万中国网民提供卓越的、个性化的社交服务。" name="description"/>
<link href="https://qzonestyle.gtimg.cn/qzone/v8/index/touch-icon-ipad-retina.png" rel="apple-touch-icon"/>
<link href="https://qzonestyle.gtimg.cn/qzone/v8/index/touch-icon-ipad.png" rel="apple-touch-icon" sizes="76x76"/>
<link href="https://qzonestyle.gtimg.cn/qzone/v8/index/touch-icon-iphone-retina.png" rel="apple-touch-icon" sizes="120x120"/>
<link href="https://qzonestyle.gtimg.cn/qzone/v8/index/touch-icon-ipad-retina.png" rel="apple-touch-icon" sizes="152x152"/>
<link href="https://qzonestyle.gtimg.cn/qzone/v8/img/Qzone.svg" mask="" rel="icon" sizes="any"/>
<meta content="#FFC028" name="theme-color"/>
<meta content="j44Osr0n9s" name="baidu-site-verification"/>
数据太多 此处省略其他结果
Process finished with exit code 0

我们从结果看到,已经用 bs4 获取到了QQ登录后的全部内容。接下来就需要用 find_all ,进行赛选了。

5.利用 浏览器的开发者调试的选择工具,定位需要赛选的内容【如下图】。

6.从定位中,得到需要爬取内容的 html 代码。

<a href="javascript:;" title="日志" tabindex="1" accesskey="r">日志</a>

我们发现这个html 代码只有这一个内容,并不是所有我们需要抓取的内容。在一次分析看 这个 a 标签是属于什么更大的标签下的。截图如下:

通过截图我们发现这个 a 标签是 li 标签下面的,这个li 标签又是属于 ul 这个标签下的。由此可得,ul 标签包含了所有的我们需要的抓取的内容数据。【点击标签最前面的 三角形 ▲按钮,可以展开下面包含的标签和内容】


把 ul 标签的HTML 代码 全部复制下来:

<ul class="head-nav-menu">
<li class="menu_item_N1"><span class="arr"></span><a href="javascript:;" title="主页" tabindex="1" accesskey="z">主页</a></li>
<li class="menu_item_2"><span class="arr"></span><a href="javascript:;" title="日志" tabindex="1" accesskey="r">日志</a></li>
<li class="menu_item_4"><span class="arr"></span><a href="javascript:;" title="相册" tabindex="1" accesskey="4">相册</a></li>
<li class="menu_item_334"><span class="arr"></span><a href="javascript:;" title="留言板" tabindex="1">留言板</a></li>
<li class="menu_item_311"><span class="arr"></span><a href="javascript:;" title="说说" tabindex="1" accesskey="6">说说</a></li>
<li class="menu_item_1"><span class="arr"></span><a href="javascript:;" title="个人档" tabindex="1" accesskey="1">个人档</a></li>
<li class="menu_item_305"><span class="arr"></span><a href="javascript:;" title="音乐" tabindex="1">音乐</a></li>
<li class="menu_item_more"><span class="arr"></span><a href="javascript:;" title="更多" tabindex="1">更多</a></li>
</ul>

我们需要抓取的就是 ul 标签的 包含的所有内容:bs4 代码如下:【class 属性名,记得写在 python 中需要加下划线 _ 】

content = soup.find_all('ul',class_="head-nav-menu")

data= soup.find_all(“HTML的标签”,HTML的属性名=“HTML的属性值”)
data : 你取的名字
soup:通过bs4筛选出来所有HTML代码
整体代码如下:

#encoding:utf-8
import requests
from bs4 import BeautifulSoupheaders = {'cookie':'Cookie值不适合对外公开,请复制你的COOKIE值','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',}
url = 'https://user.qzone.qq.com/1436099893'requ = requests.get(url,headers=headers)
soup = BeautifulSoup(requ.text, 'lxml')
data = soup.find_all('ul',class_="head-nav-menu")
print(data)

得到结果如下:

[<ul class="head-nav-menu"><li class="menu_item_N1"><span class="arr"></span><a accesskey="z" href="javascript:;" tabindex="1" title="主页">主页</a></li><li class="menu_item_2"><span class="arr"></span><a accesskey="r" href="javascript:;" tabindex="1" title="日志">日志</a></li><li class="menu_item_4"><span class="arr"></span><a accesskey="4" href="javascript:;" tabindex="1" title="相册">相册</a></li><li class="menu_item_334"><span class="arr"></span><a href="javascript:;" tabindex="1" title="留言板">留言板</a></li><li class="menu_item_311"><span class="arr"></span><a accesskey="6" href="javascript:;" tabindex="1" title="说说">说说</a></li><li class="menu_item_1"><span class="arr"></span><a accesskey="1" href="javascript:;" tabindex="1" title="个人档">个人档</a></li><li class="menu_item_305"><span class="arr"></span><a href="javascript:;" tabindex="1" title="音乐">音乐</a></li><li class="menu_item_more"><span class="arr"></span><a href="javascript:;" tabindex="1" title="更多">更多</a></li></ul>]Process finished with exit code 0

在之前的课中,我说到 只要是 find_all 筛选出来都是属于list 列表数据,需要 用 for 遍历出来。所以要加上下面这句代码:

for d in data:print(d)

整体代码如下:

#encoding:utf-8
import requests
from bs4 import BeautifulSoupheaders = {'cookie':'Cookie值不适合对外公开,请复制你的COOKIE值','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',}
url = 'https://user.qzone.qq.com/1436099893'requ = requests.get(url,headers=headers)
soup = BeautifulSoup(requ.text, 'lxml')
data = soup.find_all('ul',class_="head-nav-menu")
for d in data:print(d)

得到结果如下:

D:\pro_py\venv\Scripts\python.exe D:/pro_py/教育学习/7.py
<ul class="head-nav-menu"><li class="menu_item_N1"><span class="arr"></span><a accesskey="z" href="javascript:;" tabindex="1" title="主页">主页</a></li><li class="menu_item_2"><span class="arr"></span><a accesskey="r" href="javascript:;" tabindex="1" title="日志">日志</a></li><li class="menu_item_4"><span class="arr"></span><a accesskey="4" href="javascript:;" tabindex="1" title="相册">相册</a></li><li class="menu_item_334"><span class="arr"></span><a href="javascript:;" tabindex="1" title="留言板">留言板</a></li><li class="menu_item_311"><span class="arr"></span><a accesskey="6" href="javascript:;" tabindex="1" title="说说">说说</a></li><li class="menu_item_1"><span class="arr"></span><a accesskey="1" href="javascript:;" tabindex="1" title="个人档">个人档</a></li><li class="menu_item_305"><span class="arr"></span><a href="javascript:;" tabindex="1" title="音乐">音乐</a></li><li class="menu_item_more"><span class="arr"></span><a href="javascript:;" tabindex="1" title="更多">更多</a></li></ul>Process finished with exit code 0

和上面结果对比区别,就是少了一个 [ ]

我们发现还是没有得到,需要的真正想要的结果,所以需要在for 循环后的结果,再一次进行用 find_all 筛选查找。

因为上一次的结果 保存在 for循环的 变量 d 中 。所以要对 d 进行进步一筛选出 a 标签,代码如下:

for d in data:ahref = d.find_all('a')print(ahref)

ahref :自己取的变量名
d:就是for 循环后的 html 代码的变量名

整体代码如下:

#encoding:utf-8
import requests
from bs4 import BeautifulSoupheaders = {'cookie':'Cookie值不适合对外公开,请复制你的COOKIE值','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',}
url = 'https://user.qzone.qq.com/1436099893'requ = requests.get(url,headers=headers)
soup = BeautifulSoup(requ.text, 'lxml')
data = soup.find_all('ul',class_="head-nav-menu")
for d in data:ahref = d.find_all('a')print(ahref)

得到结果如下:

D:\pro_py\venv\Scripts\python.exe D:/pro_py/教育学习/7.py
[<a accesskey="z" href="javascript:;" tabindex="1" title="主页">主页</a>, <a accesskey="r" href="javascript:;" tabindex="1" title="日志">日志</a>, <a accesskey="4" href="javascript:;" tabindex="1" title="相册">相册</a>, <a href="javascript:;" tabindex="1" title="留言板">留言板</a>, <a accesskey="6" href="javascript:;" tabindex="1" title="说说">说说</a>, <a accesskey="1" href="javascript:;" tabindex="1" title="个人档">个人档</a>, <a href="javascript:;" tabindex="1" title="音乐">音乐</a>, <a href="javascript:;" tabindex="1" title="更多">更多</a>]Process finished with exit code 0

这数据也是一个 list 类型,所以再再一次 用 for 循环 去打印 list 类型的每一个值。代码如下:

for d in data:ahref = d.find_all('a')for a in ahref:print(a)

d :是用for遍历bs4赛选 ul 标签的每一个结果的变量名
ahref:赛选 d 每一个结果的下面的a标签
a:就是 用for 遍历出 ahref 每一个结果的变量名

得到结果如下:

D:\pro_py\venv\Scripts\python.exe D:/pro_py/教育学习/7.py
<a accesskey="z" href="javascript:;" tabindex="1" title="主页">主页</a>
<a accesskey="r" href="javascript:;" tabindex="1" title="日志">日志</a>
<a accesskey="4" href="javascript:;" tabindex="1" title="相册">相册</a>
<a href="javascript:;" tabindex="1" title="留言板">留言板</a>
<a accesskey="6" href="javascript:;" tabindex="1" title="说说">说说</a>
<a accesskey="1" href="javascript:;" tabindex="1" title="个人档">个人档</a>
<a href="javascript:;" tabindex="1" title="音乐">音乐</a>
<a href="javascript:;" tabindex="1" title="更多">更多</a>Process finished with exit code 0

在这里我们需要拿到里面的内容,在 a 后面加上 .text ,就是拿到我们需要内容啦。

整体代码如下:

#encoding:utf-8
import requests
from bs4 import BeautifulSoupheaders = {'cookie':'Cookie值不适合对外公开,请复制你的COOKIE值','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',}
url = 'https://user.qzone.qq.com/1436099893'requ = requests.get(url,headers=headers)
soup = BeautifulSoup(requ.text, 'lxml')
data = soup.find_all('ul',class_="head-nav-menu")
for d in data:ahref = d.find_all('a')for a in ahref:print(a.text)

得到结果如下:

D:\pro_py\venv\Scripts\python.exe D:/pro_py/教育学习/7.py
主页
日志
相册
留言板
说说
个人档
音乐
更多Process finished with exit code 0

本节课,到这里也就结束了。但是我们还需要一个知识点,需要普及。

Cookie 安全:

cookie 是网站服务器发给你的 “通行证” ,那么你就要好好保存自己好的 cookie , 别意外的取分享给别人自己在某网站的Cookie 。如果别人得知你的Cookie值,就等于获取到你在这个网站的账号密码。

再次 网站服务器也做了一些策略 设置了 cookie 有效期,也就是说 发给你的通行证是有效期的,在某个时间内才能够访问。

注意保密的自己的隐私数据,同时也别用自己所学到的知识去做违法犯罪的事情。

当然 你把 cookie 写在你的pycharm 编辑器中是安全的。

本节课总结:

1.在这里可能有人会问,为什么不直接在结果直接 find_all 筛选,为什么还要用 for遍历结果后,在用 find_all 筛选呢?

解释如下:

find_all 只支持 html 代码格式筛选,并不支持 list 类型代码格式,所以我们需要用for 把 list 中存储的每个标签html 代码遍历出来。find_all 的结果如下演示:

[<a accesskey="z" 内容</a> , <a accesskey="z">内容</a> , <a accesskey="z">内容</a>]

这样看着是不是就比较形象。因为find_all 筛选的html代码很多,并不能很工整的显示出来。所以我们只要记住,find_all 筛选出来都是 list 类型数据。

2.每个网站的Cookie 是有有效期的,如果在运行代码的时候显示为 [] 空列表,在 find_all 正确的情况下,就需要再一次重新登录,重新获取Cookie 参数。

本节课作业,试着爬取一个需要登录后才能看到的内容的网站。

第10课:利用Headers 的 cookie,实现爬取需要登录的网站信息相关推荐

  1. Python爬虫模拟浏览器的headers、cookie,爬取淘宝网商品信息

    一. 淘宝商品信息定向爬虫 二. 爬虫基础:正则表达式 三. 淘宝页面查看与分析 四. 爬虫源码 一. 淘宝商品信息定向爬虫 注意淘宝的robots.txt不允许任何爬虫爬取,我们只在技术层面探讨这一 ...

  2. 利用python爬取京东华为旗舰店手机信息(价格、型号、颜色、链接等)

    目 录 第一章.前言 1.1.效果展示 1.2.需要用到的库 1.3.原理分析 第二章.代码分开讲解 2.1.对象的定义及初始化 2.1.1.第一至二行 2.1.2.第三至四行 2.1.3.第五至六行 ...

  3. 利用Python中的BeautifulSoup库爬取安居客第一页信息

    题目: 网址为https://beijing.anjuke.com/sale/, 利用BeautifulSoup库,爬取第1页的信息,具体信息如下:进入每个房源的页面,爬取小区名称.参考预算.发布时间 ...

  4. 利用搜索关键字爬取今日头条新闻评论信息案例

    利用搜索关键字爬取今日头条新闻评论信息案例 爬虫4步骤: 1.分析网页 2.对网页发送请求,获取响应 3.提取解析数据 4.保存数据 本案例所用到的模块 import requests import ...

  5. 利用python的scrapy框架爬取google搜索结果页面内容

    scrapy google search 实验目的 爬虫实习的项目1,利用python的scrapy框架爬取google搜索结果页面内容. https://github.com/1012598167/ ...

  6. 项目三:近10年来中国电影票房数据爬取分析

    近10年来中国电影票房数据爬取分析 前言 数据采集与存储 数据清洗和简单分析 引入库,导入数据 近10年top 年度top5 每年电影数 每年总票房 结论 二八原则 end 点击跳转到总目录 前言 这 ...

  7. 利用自定义函数实现批量爬取多家公司的新闻

    1 需求 利用自定义函数实现批量爬取多家公司的新闻. 2 代码实现 from selenium import webdriver import redef dongfang(company):chro ...

  8. 利用selenuim以及无头浏览器爬取9酷网音乐

    利用selenuim以及无头浏览器爬取9酷网音乐 这里使用selenuim爬取的原因也是因为比较直观并且如网页为动态加载时也可以进行爬取,还可以对网站进行操作.这也是selenium的优点所在 需要的 ...

  9. 自动获取cookie,爬取新浪微博热门评论

    目录 一.前言 二.代码 一.前言 前几天突然想爬一爬微博的热门评论玩,就间断地挤出来了一点时间写了一个简略版. 最大的难点是新浪的访客机制,导致无法直接用requests爬取,需要先在cookie上 ...

最新文章

  1. 放大倍数超5万倍的Memcached DDoS反射攻击,怎么破?
  2. Kinect+OpenNI学习笔记之12(简单手势所表示的数字的识别)
  3. 给linux下网站目录配置SFTP
  4. ZOJ-1654 Place the Robots 拆行拆列构图+二分匹配 Or 最大独立点集+TLE
  5. Java 高并发下的实践
  6. log函数 oracle power_博主营地 | Unity3D 实用技巧 基础数学库函数学习
  7. Shiro自定义realm实现密码验证及登录、密码加密注册、修改密码的验证
  8. Android ThreadPool
  9. Atitit 收入理论大总结 4位一体 4象限理论 财政收入理论 6位一体
  10. 电脑需要u盘启动的解决办法--蓝屏修复
  11. mac上安装linux双系统,怎么在台式一体机上安装双系统?
  12. 2022高教社杯 国赛数学建模 B题思路
  13. RT-Thread柿饼控件(2)-- Button
  14. C语言的s8数据结构
  15. 求职-平安产险科技一二面
  16. 六、v8引擎执行JS文件
  17. 信息安全专业毕业设计选题推荐
  18. C语言用递归调用实现阶乘
  19. 高校计算机教师年度考核,教师年度考核个人总结范文
  20. ①、学习spring cloud之HTML 简介

热门文章

  1. vue 项目修改网页 title 和 图标
  2. 怎样构建一套成熟的CMDB系统?
  3. 线性代数(第六版)同济大学 习题一 (1-4题)个人解答
  4. vue+uniapp疫苗预约接种系统 微信小程序
  5. Uni-app学习过程(1)
  6. 阿里、华为领跑2019中国公有云物联网平台
  7. 机器学习笔记2-Supervised Learning
  8. 小妖拼图APP--项目总结
  9. GLU-Net代码的理解
  10. Mac虚拟机安装Windows server 2003 及安装组件提示插入软盘、Outlook提示无法连接pop3服务器