当前位置: 首页 > news >正文

爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!

1 前言
近期,有些朋友问我一些关于如何应对反爬虫的问题。由于好多朋友都在问,因此决定写一篇此类的博客。把我知道的一些方法,分享给大家。博主属于小菜级别,玩爬虫也完全是处于兴趣爱好,如有不足之处,还望指正。

在互联网上进行自动数据采集(抓取)这件事和互联网存在的时间差不多一样长。今天大众好像更倾向于用“网络数据采集”,有时会把网络数据采集程序称为网络机器人(bots)。最常用的方法是写一个自动化程序向网络服务器请求数据(通常是用 HTML 表单或其他网页文件),然后对数据进行解析,提取需要的信息。

说句实在话,如果我的网站总是让人爬来爬取的,经常被虚拟访问者骚扰,我也是蛮烦的,而且如果遇到“霸道”一点的爬虫,都能直接把服务器卡死。因此,我们在爬取别人网站的时候,也多为对方考虑考虑。不过话说回来,我却没有这个烦恼,为什么呢?因为我根本就没有自己的网站。=.=

2 黑科技
网站防采集的前提就是要正确地区分人类访问用户和网络机器人。现在网站有很多技术来防止爬虫,比如验证码,对于一些简单的数字验证码,可以使用训练好的caffemodel诸如此类的模型去识别,准确率还是可以的。当然,也可以在Github搜一搜关于验证码识别的东西,看一看大牛们是怎么玩的。除了这些高大上的,还有一些十分简单的方法可以让你的网络机器人看起来更像人类访问用户。

2.1 构造合理的HTTP请求头
除了处理网站表单,requests 模块还是一个设置请求头的利器。HTTP 的请求头是在你每次向网络服务器发送请求时,传递的一组属性和配置信息。HTTP 定义了十几种古怪的请求头类型,不过大多数都不常用。

每个网站都有不同的请求头,如何获取这个请求头呢?可以用我从前提到过的Fiddler或者审查元素的方法,我们可以根据实际情况进行配置。例如,GET百度根目录的时候,需要添加的请求头信息如下:

相关文章:

  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • HTTP 简介
  • 学习正则表达式
  • Go test 命令工作原理
  • 监控Linux系统状态、手动增加swap空间
  • React16时代,该用什么姿势写 React ?
  • 今年的LC3大会没了?
  • 戴姆勒与宝马抱团开发自动驾驶 新旧车企大战在即
  • TableStore多元索路由探微
  • JPress v2.0-rc.4 发布,修复插件安装卸载的若干问题
  • 002_python基础语录
  • redis事务和脚本
  • Spring源码分析(六)SpringAOP实例及标签的解析
  • Nodejs教程11:assert(断言)
  • use Google search engine
  • $translatePartialLoader加载失败及解决方式
  • 《Java编程思想》读书笔记-对象导论
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • DOM的那些事
  • Netty 4.1 源代码学习:线程模型
  • orm2 中文文档 3.1 模型属性
  • 阿里云应用高可用服务公测发布
  • 离散点最小(凸)包围边界查找
  • 聊一聊前端的监控
  • 前嗅ForeSpider采集配置界面介绍
  • 最近的计划
  • raise 与 raise ... from 的区别
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​queue --- 一个同步的队列类​
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (九十四)函数和二维数组
  • .NET : 在VS2008中计算代码度量值
  • .net core 连接数据库,通过数据库生成Modell
  • .net 设置默认首页
  • .net 提取注释生成API文档 帮助文档
  • .net 无限分类
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • @ConditionalOnProperty注解使用说明
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [AIGC 大数据基础]hive浅谈
  • [Android Pro] AndroidX重构和映射
  • [Android]Tool-Systrace
  • [Android]一个简单使用Handler做Timer的例子
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [Git].gitignore失效的原因
  • [Golang]K-V存储引擎的学习 从零实现 (RoseDB mini版本)
  • [IM] [Webhook] Webhook实现IM平台机器人
  • [iphone-cocos2d]关于Loading的若干处理和讨论
  • [Kubernetes]4. 借助腾讯云TKE快速创建Pod、Deployment、Service部署k8s项目
  • [LeeCode]-Divide Two Integers 不用乘除的除法运算
  • [LeetCode]-Integer to Roman 阿拉伯数字转罗马数字