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,一经查实,立即删除!

相关文章

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…

vue报错 TypeError: merge is not a function

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

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 …

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

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

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…

poj 1083 Moving Tables

题目 两种做法&#xff0c;开始用贪心做的&#xff0c;有种情况没考虑到&#xff0c;结果排序错了。 这个例子&#xff0c;感觉上有三个交点&#xff0c;以为是30&#xff0c;其实是20. 贪心代码&#xff1a; #include <iostream> #include <cstdio> #include <…

oracle parallel_index hint在非分区表的生效

之前没特别注意&#xff0c;在有些场景下希望使用并行索引扫描的时候&#xff0c;发现parallel_index hint并没有生效&#xff0c;于是抽空看了下文档&#xff1a;The PARALLEL_INDEX hint instructs the optimizer to use the specified number of concurrent servers to para…

eclipse 界面设置与字体更改

目录 eclipse 界面设置与字体更改更改界面颜色&#xff08;Windows&#xff09;windows下全设置窗口颜色eclipse下设置Console窗口颜色设置字体与字号安装Courier New字体设置字体eclipse 界面设置与字体更改 每天换一个新的环境总是要重新设置eclipse的各种配置&#xff0c;最…

HTTP和HTTPS协议及工作原理分析

HTTP协议概念 HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff0c;属于应用层&#xff09;是用于从服务器传输超内容到本地浏览器的传送协议。是一个无状态的协议 想了解http&#xff0c;就需要了解TCP&#xff0c;IP协议。因为http是基…

前端兼容性问题

一、CSS 1、浏览器的兼容性问题-CSS 盒子模型(Box Model) 一旦为页面设置了恰当的 DTD&#xff0c;大多数浏览器都会按照上面的图示来呈现内容。然而 IE 5 和 6 的呈现却是不正确的。根据 W3C 的规范&#xff0c;元素内容占据的空间是由 width 属性设置的&#xff0c;而内容周…

索引原理及几种索引类型区别

在关系数据库中&#xff0c;索引是一种单独的、物理的对数据库表中的一列或多列的值进行排序的一种存储结构&#xff0c; 它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录&#xff0c;可以根据目录中的页码…

Android Studio Intent使用(显式、隐式)

https://blog.csdn.net/u012005313/article/details/47006689 使用Intent能够使程序在不同活动中跳转&#xff0c;意及能够使用不同界面。Intent用法分为显示和隐式 Intent概念&#xff1a;Intent是Android程序中各组件之间进行交互的一种重要方式&#xff0c;不仅可以指明当前…

淘宝首页的HTML以及CSS技术点

1、 一个网页的开发流程 内容结构&#xff0c;比如js、css页面结构。自上而下&#xff0c;从左往右。&#xff08;内容、颜色块、间距、边框&#xff09; 2、 line-height的5种设置方式及区别 normal || 1.5 || 150% || 50px || 5em 初始化元素的时候&#xff0c;一般使用 l…

Windows+Python 3.6环境下安装PyQt4

第一步&#xff1a;下载.whl&#xff0c;地址&#xff1a;https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyqt4&#xff0c;这里可以下载不同的python版本对应的包。 第二步&#xff1a;选择一个目录&#xff0c;将下载好的文件放到该目录下&#xff0c;然后cmd下&#xff0c;c…

0065-数方块

题目 数方块难度级别&#xff1a;A&#xff1b; 运行时间限制&#xff1a;1000ms&#xff1b; 运行空间限制&#xff1a;51200KB&#xff1b; 代码长度限制&#xff1a;2000000B 试题描述在墙角堆放着一堆完全相同的正方体小木块&#xff0c;如下图所示&#xff1a; 因为木块堆…

【HNOI2006】鬼谷子的钱袋

本题在洛谷上的链接&#xff1a;https://www.luogu.org/problemnew/solution/P2320 做法和二进制划分很像&#xff0c;&#xff0c;&#xff0c;原来我的二进制划分一直有点问题&#xff08;之前我是枚举2的n次方然后减&#xff0c;逃&#xff09;。。。 我们举20这个例子&…

小米5安卓使用微信X5 Blink内核调试

1.打开微信开发模式&#xff0c;连续点击MIUI版本 2.在其他高级设置、开发者选项打开调试 3.打开微信调试工具&#xff0c;选择移动调试&#xff0c;安卓设备调试&#xff0c;选择X5 BINK, 4.手机用数据线连接电脑&#xff0c;并用微信扫描二维码,打开TBS调试 5.退出微信&…