Python爬虫自学之第(①)篇——爬虫伪装和反“反爬”

有些网站是防爬虫的。其实事实是,凡是有一定规模的网站,大公司的网站,或是盈利性质比较强的网站,都是有高级的防爬措施的。总的来说有两种反爬策略,要么验证身份,把虫子踩死在门口;要么在网站植入各种反爬机制,让爬虫知难而退。


本节内容就着这两种反爬策略提出一些对策。

身份伪装

  就算是一些不知名的小网站,多多少少还会检查一下headers验证一下访者的身份,大网站就更不用说了(我一次爬网易云的时候,忘记加headers,直接被红掉)
  所以,为了让虫宝们带着信息凯旋归来,我们要教会爬虫们如何伪装;有时光伪装也不行,我们还要教爬虫具体"如何做人",让自己的举止更像普通人而不是比单身汉手速还快的未知生物。

自定制 Requests Headers

  • “吾是人!”——修改user-agent:里面储存的是系统和浏览器的型号版本,通过修改它来假装自己是人。
  • “我从河北省来”——修改referer:告诉服务器你是通过哪个网址点进来的而不是凭空出现的,有些网站会检查。
  • “饼干!”:——带上cookie,有时带不带饼干得到的结果是不同的,试着带饼干去“贿赂”服务器让她给你完整的信息。
  • 详细数据可以F12捉个包来查看其Requests Headers

身份伪装

  就算是一些不知名的小网站,多多少少还会检查一下headers验证一下访者的身份,大网站就更不用说了(我一次爬网易云的时候,忘记加headers,直接被红掉)
  所以,为了让虫宝们带着信息凯旋归来,我们要教会爬虫们如何伪装;有时光伪装也不行,我们还要教爬虫具体"如何做人",让自己的举止更像普通人而不是比单身汉手速还快的未知生物。

自定制 Requests Headers

  • “吾是人!”——修改user-agent:里面储存的是系统和浏览器的型号版本,通过修改它来假装自己是人。
  • “我从河北省来”——修改referer:告诉服务器你是通过哪个网址点进来的而不是凭空出现的,有些网站会检查。
  • “饼干!”:——带上cookie,有时带不带饼干得到的结果是不同的,试着带饼干去“贿赂”服务器让她给你完整的信息。
  • 详细数据可以F12捉个包来查看其Requests Headers

图片描述

headers = {'Referer':'https://accounts.pixiv.net/loginlang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index',#如某些网站(如p站)要检查referer,就给他加上'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'#每个爬虫必备的伪装}
r = requests.get("https://segmentfault.com/a/1190000014383966",headers=headers)

headers数据通常用这两个即可,而且笔者强烈推荐在爬虫中为每个request都配个user-agent,总比什么都没有好,加了也不会报错。

降低主IP访问频率

注意:这是针对长期的,大范围的爬虫的

有些网站会监视某个ip的访问频率和次数,一但超过某个阈值,就把你当作爬虫嫌犯赶出去了,这时就要想办法降低自己的存在感了。

  • Zzzzz——休眠:爬一段时间后休息一会,不仅是为了自己的成功,也是为服务器着想。
  • 我不去,我派别人去——ip代理:通过proxies参数来使用,前提是你要有ip,好的ip代理是要花钱的。
time.sleep(60)#用python自带time模块的休眠功能
proxies = {'http': 'http://10.10.1.10:3128',#“协议类型:完整ip地址+端号”'https': 'http://10.10.1.10:1080'}#代理ip字典,随机调用
r = requests.get(url,headers=headers,proxies=proxies)

反 反爬(简析)

在系列第零篇中我提到获取网页源码是有坑的,没错,有些时候headers伪装什么的都做足了,可你还是不能如愿以偿的获得正确的网页源码,要么缺,要么给你一堆毫不相关的东西,要么干脆让你红掉。
这说明要点不是伪不伪装的问题了,而是如何去解读网页的防爬机制从而推出解决方法,这就要求比较高的观察和分析能力了

就我目前遇到的主要有:

  • 随机校验码:网页生成随机码,并要求你将其提交才接受你的请求(多用在登录验证中)。——这种校验码通常藏在网页源码中,先取再交是策略。
  • 无序网址:网址后跟着一大串看不出规律的东西。——跟这种东西是没话说的,直接上selenium
  • 加密/杂乱的源码:你知道你要的东西就在那里,但是不知道怎样提取出来。——推理解谜,看脑子好不好使了。
  • 动态加载:需要和页面交互才能获取更多信息,但是爬虫没法和它交互啊。——直接上selenium/手动捉包分析出目标链接
  • ajax技术:异步加载,网页内容分次加载,用爬虫只能得到第一次发出的html,导致信息不全。——上selenium/手动捉包分析出目标连接

补充:
selenium模块,模拟浏览器,强是强但是缺点是慢。
其实动态加载是为了方便用户点哪看哪的,但这也加大了爬虫的难度,因为很多信息因此被隐藏了起来。

最后

伪装有套路,代码直接套,多加headers总没错。

内嵌反爬很灵活,没有什么固定的代码格式,要花时间去分析出来。

本文新出现的方法/模块,后面会有实例,不要方。

下一篇正式进入网页解析主题,之后就可以开始写小爬虫了♪(^∀^●)ノ。

headers = {'Referer':'https://accounts.pixiv.net/loginlang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index',#如某些网站(如p站)要检查referer,就给他加上'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'#每个爬虫必备的伪装}
r = requests.get("https://segmentfault.com/a/1190000014383966",headers=headers)

headers数据通常用这两个即可,而且笔者强烈推荐在爬虫中为每个request都配个user-agent,总比什么都没有好,加了也不会报错。

降低主IP访问频率

注意:这是针对长期的,大范围的爬虫的

有些网站会监视某个ip的访问频率和次数,一但超过某个阈值,就把你当作爬虫嫌犯赶出去了,这时就要想办法降低自己的存在感了。

  • Zzzzz——休眠:爬一段时间后休息一会,不仅是为了自己的成功,也是为服务器着想。
  • 我不去,我派别人去——ip代理:通过proxies参数来使用,前提是你要有ip,好的ip代理是要花钱的。
time.sleep(60)#用python自带time模块的休眠功能
proxies = {'http': 'http://10.10.1.10:3128',#“协议类型:完整ip地址+端号”'https': 'http://10.10.1.10:1080'}#代理ip字典,随机调用
r = requests.get(url,headers=headers,proxies=proxies)

反 反爬(简析)

在系列第零篇中我提到获取网页源码是有坑的,没错,有些时候headers伪装什么的都做足了,可你还是不能如愿以偿的获得正确的网页源码,要么缺,要么给你一堆毫不相关的东西,要么干脆让你红掉。
这说明要点不是伪不伪装的问题了,而是如何去解读网页的防爬机制从而推出解决方法,这就要求比较高的观察和分析能力了

就我目前遇到的主要有:

  • 随机校验码:网页生成随机码,并要求你将其提交才接受你的请求(多用在登录验证中)。——这种校验码通常藏在网页源码中,先取再交是策略。
  • 无序网址:网址后跟着一大串看不出规律的东西。——跟这种东西是没话说的,直接上selenium
  • 加密/杂乱的源码:你知道你要的东西就在那里,但是不知道怎样提取出来。——推理解谜,看脑子好不好使了。
  • 动态加载:需要和页面交互才能获取更多信息,但是爬虫没法和它交互啊。——直接上selenium/手动捉包分析出目标链接
  • ajax技术:异步加载,网页内容分次加载,用爬虫只能得到第一次发出的html,导致信息不全。——上selenium/手动捉包分析出目标连接

补充:
selenium模块,模拟浏览器,强是强但是缺点是慢。
其实动态加载是为了方便用户点哪看哪的,但这也加大了爬虫的难度,因为很多信息因此被隐藏了起来。

最后

伪装有套路,代码直接套,多加headers总没错。

内嵌反爬很灵活,没有什么固定的代码格式,要花时间去分析出来。

本文新出现的方法/模块,后面会有实例,不要方。

下一篇正式进入网页解析主题,之后就可以开始写小爬虫了♪(^∀^●)ノ。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[css] 用CSS实现tab切换

[css] 用CSS实现tab切换 1.用label结合单选按钮radio接受切换tab的单击 2.用zindex层级来显示当前tab页对应的内容 3.用css兄弟选择器选中对应的tab页签和内容页,添加相应的样式个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易&#xff0…

【练习】实现一个parse方法(需要实现的效果见内容),方法总结

【本题来自牛客网,解题方法也借鉴于牛客网上讨论区中的多种答案,在此做一个总结】 parse方法需要实现的效果如下: var object {b: { c: 4 }, d: [{ e: 5 }, { e: 6 }] }; console.log( parse(object, ‘b.c’) 4 ) //true console.log( par…

[css] 移动端1px像素的问题及解决方案是什么?

[css] 移动端1px像素的问题及解决方案是什么&#xff1f; viewport结合rem解决像素比问题 比如在devicePixelRatio2设置meta <meta name"viewport" content"initial-scale0.5, maximum-scale0.5, minimum-scale0.5, user-scalableno">在devicePixel…

处理 JavaScript 异步操作的几种方法总结

引言 js的异步操作&#xff0c;已经是一个老生常谈的话题&#xff0c;关于这个话题的文章随便google一下都可以看到一大堆。处理js的异步操作&#xff0c;都有一些什么方法呢&#xff1f;仁者见仁智者见智 一、回调函数 传说中的“callback hell”就是来自回调函数。而回调函…

Spring 事务相关及@Transactional的使用建议

使用步骤&#xff1a; 步骤一、在spring配置文件中引入<tx:>命名空间<beans xmlns"http://www.springframework.org/schema/beans" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:tx"http://www.springframework.org/schema/…

谷歌浏览器安装Vue Devtools插件(国内的谷歌浏览器如何安装插件)

分享给大家一个谷歌插件网站&#xff0c;适合国内谷歌浏览器无法安装插件的问题&#xff0c;你懂的 点击这里下载Vue.js Devtools插件&#xff0c; 喜欢的可以收藏这个插件资源网站&#xff0c;分享给大家 第一步&#xff1a;下载后解压获得CRX文件&#xff0c;如下图 第二步…

MySQL操作权限整理

用户权限管理主要有以下作用&#xff1a; 1. 可以限制用户访问哪些库、哪些表 2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作 3. 可以限制用户登录的IP或域名 4. 可以限制用户自己的权限是否可以授权给别的用户 一、用户授权 mysql> grant a…

Objective-C学习笔记-使用NSString与NSData读写文件

1.NSString读写文件 NSString *helloText"您好啊&#xff01;";NSError *error;if ([helloText writeToFile:"/tmp/test.txt" atomically:true encoding:NSUTF8StringEncoding error:&error]){NSLog("writeToFile success");}else{NSLog(&qu…

[css] 如何将元素的所有css属性恢复为初始化状态?

[css] 如何将元素的所有css属性恢复为初始化状态&#xff1f; all:upset个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

vue报错 TypeError: merge is not a function

利用ncu -u升级去年的vue项目package.json里的所有依赖&#xff0c;目的是想增删改它去做另一个项目&#xff0c; 却发生了这样一个错误&#xff1a;&#xff08;如下&#xff09; 查找问题原因&#xff1a; 这是webpack配置中区分环境配置文件中的插件webpack-merge的报错&a…

同步和异步有什么区别?

所谓同步&#xff0c;就是发出一个功能调用时&#xff0c;在没有得到结果之前&#xff0c;该调用就不返回或者继续执行后续操作。 异步跟同步相对&#xff0c;当一个异步调用发出后&#xff0c;调用者在没有得到结果之前&#xff0c;就可以继续执行后续操作。当这个调用完成后&…

Invalid options object. Copy Plugin has been initialized using an options object that does not match

报错&#xff1a; 报错文件和代码&#xff1a;查看了官网也没有看出所以然&#xff0c;最后在npm官网上找打了原因 错误配置&#xff1a; 怎么看都没有错误 最后参看一下这个npn官网找打了原因&#xff0c;地址&#xff1a;https://www.npmjs.com/package/copy-webpack-plugin …

[css] css中的baseline,你知道吗?

[css] css中的baseline&#xff0c;你知道吗&#xff1f; baseline是西文字体里面的一种定位&#xff0c;vertical-align:baseline是指行内元素里的文字&#xff0c;在垂直方向上&#xff0c;按字体的基线排列&#xff0c;基线就是可以类似我们小学写英文字母时的带线的格子&a…

Leetcode——300. 最长上升子序列

题目描述&#xff1a;题目链接 给定一个无序的整数数组&#xff0c;找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101]&#xff0c;它的长度是 4。 说明: 可能会有多种最长上升子序列的组合&#xff0c;你只需…

后台返回数据打印是[object object]的,报错:SyntaxError: JSON.parse: expected property name or ‘}‘ at line 1 column

今天基于这个问题纠结了一下午&#xff0c;导致这个问题的坑也是挺深的&#xff0c;查找问题最好是从这条数据的存储开始查找 问题1&#xff1a;先确定后台接收数据后存储到数据库里有没有自动转义特殊字符&#xff0c;比如 原始数据是&#xff1a;[{"user_id":20,…

[css] 你知道什么是动态伪类吗?

[css] 你知道什么是动态伪类吗&#xff1f; 锚点伪类&#xff08;a标签&#xff09; 1、:link 未操作的链接 2、:visited 该链接已被访问&#xff0c;一旦:visited&#xff0c;:link/:active不再起作用。用户行为伪类 1、:hover 鼠标悬停该元素 2、:active 鼠标点击该元素 3、…

vue在多方法执行完后再执行另一个方法(等待请求完数据再执行)async/await使用方法和Promise.all

vue在一个方法执行完后执行另一个方法 用Promise.all来实现。 Promise是ES6的新特性&#xff0c;用于处理异步操作逻辑&#xff0c;用过给Promise添加then和catch函数&#xff0c;处理成功和失败的情况 ES7中新提出async搭配await&#xff0c;建议使用async搭配await。 func…

Java开发框架和中间件面试题(4)

27.如何自定义Spring Boot Starter&#xff1f; 1.实现功能 2.添加Properties 3.添加AutoConfiguration 4.添加spring.factory 在META INF下创建spring.factory文件 6.install 28.为什么需要spring boot maven plugin? spring boot maven plugin 提供了一些像jar一样打包…

第二周每周例行报告

1.本周PSP 类型任务开始时间结束时间间隔时间净时间准备工作复习C#&#xff0c;看书2018.9.19 17&#xff1a;032018.9.19 18&#xff1a;17 0min74min编程编写功能一2018.9.20 18&#xff1a;072018.9.20 22&#xff1a;4323min253min编程完善修改功能一2018.9.21…

[css] 使用css3画一个扇形

[css] 使用css3画一个扇形 四个半圆叠加&#xff0c;过半调整 z-index .container { width: 200px; height: 200px; position: relative; border-radius: 100%; } div { width: 50%; height: 100%; position: absolute; left: 0; top: 0; } .fan-1, .fan-3 { background: #C…