HTTP请求可以使用多种请求方法,但是爬虫最主要就两种方法:GET和POST方法。
- 一般情况下,只从服务器获取数据下来,并不会对服务器资源产生任何影响的时候会使用 get 请求。
- 向服务器发送数据(登录)、上传文件等,会对服务器资源产生影响的时候会使用 post 请求。
以上是在网站开发中常用的两种方法。并且一般情况下都会遵循使用的原则。但是有的网站和服务器为了做反爬虫机制,也经常会不按常理出牌,有可能一个应该使用get 方法的请求就一定要改 成post 请求,这个要视情况而定。
- GET是从服务器上获取数据,POST是向服务器传送数据
- GET请求参数都显示在浏览器网址上,即“Get”请求的参数是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese
- POST请求参数在请求体当中,消息长度没有限制而且以隐式的方式进行发送,通常用来向HTTP服务器提交量比较大的数据。请求的参数类型包含在“Content-Type”消息头里,指明发送请求时要提交的数据格式。
注意:
- 网站制作者一般不会使用Get方式提交表单,因为有可能会导致安全问题。 比如说在登陆表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。并且浏览器会记录历史信息,导致账号不安全的因素存在。
首先爬虫要引用 requests 内置库
url的概念
URL(外文名:Uniform Resource Locator,中文名:统一资源定位符),统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息是指出文件的位置以及浏览器应该怎么处理它。它最初是由蒂姆·伯纳斯·李发明用来作为万维网的地址,现在它已经被万维网联盟编制为互联网标准了。
在Internet上所有资源都有一个独一无二的URL地址,我们可以通过在地址栏中输入URL实现对资源的访问。
url的组成部分
URL格式:
协议类型://服务器地址或IP地址[:端口号]/路径/文件名[参数=值]。
案例 - 添加请求头发送
案例 - 某厨房首页数据爬取(UA检测)
网址 :www.json.cn 可以翻译 Json 数据信息
案例 - 请求猫眼
案例 - 获取 Json 信息
案例 - 保存二进制数据
requests 模块允许你使用 params 关键字参数,以一个字典来提供这些参数。
举例来说,如果你想传递 key1=value1 和 key2=value2 到 httpbin.org/get ,那么你可以使用如下代码:
在url地址中默认是不支持中文字符的,所以在请求中会把中文字符转化成url编码形式
- 使用requests模块发送请求之前,我们就要回顾之前学习到的url(统一资源定位符)。
- 在你拿到数据所在的url地址之后,发送网络请求时,请求的url中包含两种地址参数: 和 。
查询参数
URL 的查询字符串(query string)传递某种数据。如果你是手工构建 URL,也就是通过拼接字符串构造的URL。那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。
例如:
案例 - 某厨房的菜谱搜索(多个请求参数)
案例 - 某豆瓣电影(动态加载数据爬取)
经过测试发现,我们爬取到的数据并没有包含电影详情数据,why?
动态加载数据
案例 - 搜某图片采集
案例 - 某德基(post请求)
案例 - 某德基(post请求)爬取多页面
案例 - 图片数据爬取
requests模块中发送POST请求也是比较容易的操作,要实现这个,只需简单地传递一个字典给data参数。你的数据字典在发出请求时会自动编码为表单形式:
当然Requests中的post方法只是相对于get方法多了一个data参数,其他参数都是类似的,例如我们也可以为post中的网址添加查询字符串 params 参数,也可以像get方法一样添加 headers 参数等。
请求参数
- 请求参数和查询参数有本质的区别。请求参数一般是在发送post请求,向服务器提交表单数据请求的时候携带的参数。
- 注意:url地址中不会显示请求参数,只会显示查询参数。
- 请求参数在浏览器抓包工具中,位于Headers栏目下的Form Data中
- 值得注意的是,cookies中所有片段信息,有浏览器自动生成的,也有服务器在响应数据的时候给你生成的。一旦服务给你生成了cookie片段,那么大概率就会针对这些片段进行校验,验证你的用户身份,从而决定是否返回数据给你。相反来说浏览器自动为我们生成的cookie片段对我们代码请求影响不大,因为服务器往往会校验自己生成的cookie片段,对于浏览器自动生成的cookie片段不会校验。
- 在requests模块中发送带cookies字段的请求也是比较容易的操作,要实现这个,只需简单地传递一个字典给cookies关键字即可:
cookie 概述
当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie,它是Internet站点创建的,为了辨别用户身份而储存在用户本地终端上的数据,cookie大部分都是加密的,cookie存在与缓存中或者硬盘中,在硬盘中的是一些文本文件,当你访问该网站时,就会读取对应的网站的cookie信息,cookie有效地提升了用户体验,一般来说,一旦将cookie保存在计算机上,则只有创建该cookie的网站才能读取它
cookie 的由来
大家都知道HTTP协议是无状态的。
- 状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应的相关信息。
- 一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的,及时同一个客户端发起的多个请求间。随着Web的不断发展,因无状态而导致业务处理变得棘手的情况增多,因此我们需要解决这个问题,也就是说要让http可以“保持状态”,那么Cookie就是在这样一个场景下诞生。
什么是 cookie
- cookie的本质就是一组数据(键值对的形式存在)
- 是由服务器创建,返回给客户端,最终会保存在客户端浏览器中。
- 如果客户端保存了cookie,则下次再次访问该服务器,就会携带cookie进行网络访问。
- 首先来讲,cookie是浏览器的技术,Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,可以理解为服务端给客户端的一个小甜点,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
记住:cookie表示的键值对数据是由服务器创建,且存储在客户端浏览器中。
cookie 的原理(重点)
cookie的工作原理是:
- 浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,浏览器收到相应后保存在本地;
- 当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
- cookie的内容是有服务器自主设计的,客户端无法干涉!
cookie的规范
- Cookie大小上限为4KB;
- 一个服务器最多在客户端浏览器上保存20个Cookie;
- 一个浏览器最多保存300个Cookie,因为一个浏览器可以访问多个服务器。
- 上面的数据只是HTTP的Cookie规范,但在浏览器大战的今天,一些浏览器为了打败对手,为了展现自己的能力起见,可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500个Cookie等!但也不会出现把你硬盘占满的可能!
- 注意,不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你在使用FireFox访问服务器时,不可能把IE保存的Cookie发送给服务器。
案例- 某球网中的咨询数据
案例 - 17k图书网
如果对于requests模块发送的网络请求,请求数据的速度太慢,达不到你的要求。那么你可以考虑加上timeout关键字参数对于请求数据的时间做出限制,如下所示:
对于一些重定向的网络请求,比如登陆成功后跳转到用户个人页面。如果对于当前请求你不想要重定向,就需要当前地址数据,那么可以添加allow_redirects=False关键字,阻止当前请求的重定向。如下所示:
-
什么是代理
- 代理服务器
-
造成这种现象的原因是该网站已采取了一些防爬虫措施。 例如,服务器将在一个时间单位内检测IP请求的数量。 如果超过某个阈值,服务器将直接拒绝该服务并返回一些错误信息。 这种情况可以称为封IP,因此该网站成功禁止了我们的抓取工具。
-
想象一下,由于服务器检测到IP单位时间内的请求数量,因此我们使用某种方式来伪装IP,以使服务器无法识别由本地计算机发起的请求,因此我们可以成功地阻止IP被封。
-
对应的在使用requests模块发送网络请求时,可以用proxies关键字参数对本地计算机进行伪装,如下所示:
在爬虫中为何需要使用代理?
- 有些时候,需要对网站服务器发起高频的请求,网站的服务器会检测到这样的异常现象,则会讲请求对应机器的ip地址加入黑名单,则该ip再次发起的请求,网站服务器就不在受理,则我们就无法再次爬取该网站的数据。
- 使用代理后,网站服务器接收到的请求,最终是由代理服务器发起,网站服务器通过请求获取的ip就是代理服务器的ip,并不是我们客户端本身的ip。
代理的匿名度
- 透明:网站的服务器知道你使用了代理,也知道你的真实ip
- 匿名:网站服务器知道你使用了代理,但是无法获知你真实的ip
- 高匿:网站服务器不知道你使用了代理,也不知道你的真实ip(推荐)
代理的类型(重要)
- http:该类型的代理服务器只可以转发http协议的请求
- https:可以转发https协议的请求
如何获取代理?
- 芝麻代理:https://jahttp.zhimaruanjian.com/(推荐,有新人福利)
如何使用代理?
案例- 某勾网(深度测试)
现在很多网站启用了防盗链反爬,防止服务器上的资源被人恶意盗取。什么是防盗链呢?
- 以图片为例,访问图片要从他的网站访问才可以,否则直接访问图片地址得不到图片
图片懒加载
- https://sc.chinaz.com/tupian/meinvtupian.html
- 爬取上述链接中所有的图片数据
- 图片懒加载:
- 主要是应用在展示图片的网页中的一种技术,该技术是指当网页刷新后,先加载局部的几张图片数据即可,随着用户滑动滚轮,当图片被显示在浏览器的可视化区域范围的话,在动态将其图片请求加载出来即可。(图片数据是动态加载出来)。
- 如何实现图片懒加载/动态加载?
- 使用img标签的伪属性(指的是自定义的一种属性)。在网页中,为了防止图片马上加载出来,则在img标签中可以使用一种伪属性来存储图片的链接,而不是使用真正的src属性值来存储图片链接。(图片链接一旦给了src属性,则图片会被立即加载出来)。只有当图片被滑动到浏览器可视化区域范围的时候,在通过js将img的伪属性修改为真正的src属性,则图片就会被加载出来。
- 如何爬取图片懒加载的图片数据?
- 只需要在解析图片的时候,定位伪属性(src2)的属性值即可
案例 - 爬取微博图片
http://blog.sina.com.cn/lm/pic/,将页面中某一组系列详情页的图片进行抓取保存,比如三里屯时尚女郎:http://blog.sina.com.cn/s/blog_01ebcb8a0102zi2o.html?tj=1
- 在解析图片地址的时候,定位src的属性值,返回的内容和开发工具Element中看到的不一样,通过network查看网页源码发现需要解析real_src的值。
- 直接请求real_src请求到的图片不显示,加上Refere请求头即可
- 哪里找Refere:抓包工具定位到某一张图片数据包,在其requests headers中获取
以下是requests模块中文文档和在GitHub上面的地址:
https://requests.readthedocs.io/projects/cn/zh_CN/latest/
github地址:https://github.com/requests/requests