Python爬虫开发的3大难题,别上了贼船才发现,水有多深

2023-05-16

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

写爬虫,是一个非常考验综合实力的活儿。有时候,你轻而易举地就抓取到了想要的数据;有时候,你费尽心思却毫无所获。

好多Python爬虫的入门教程都是一行代码就把你骗上了“贼船”,等上了贼船才发现,水好深~ 比如爬取一个网页可以是很简单的一行代码:

r = requests.get('http://news.baidu.com')

非常的简单,但它的作用也仅仅是爬取一个网页,而一个有用的爬虫远远不止于爬取一个网页

一个有用的爬虫,只需两个词来衡量:

  • 数量:能否抓全所有该类数据
  • 效率:抓完所有数据需要多久一天还是一个月

但要做到这两个词,却是要下很多功夫。自己下功夫是一方面,也很重要的是你要抓全的目标网站给你出了多少难题。综合起来,就写一个爬虫有多少难度。

网络爬虫难度一:只需爬取html网页但要上规模

这里我们举个新闻爬虫的例子。大家都用过百度的新闻搜索吧,我就拿它的爬虫来讲讲实现上的难度。

新闻网站基本上不设防,新闻内容都在网页的html代码里了,抓全一个网页基本上就是一行的事情。似乎听上去很简单,但对于一个搜索引擎级的爬虫,就不那么简单了,要把几千几万家新闻网站的新闻都及时抓取到也不是一件容易的事情。

我们先看看新闻爬虫的简单流程图:

从一些种子网页开始,种子网页往往是一些新闻网站的首页,爬虫抓取网页,从中提取网站URL放到网址池再进行抓取。这样就从几个网页开始,不断扩展到其它网页。爬虫抓取的网页也越来越多,提取出的新网网址也会成几何级数增长。

如何能在最短时间抓取更多网址?

这就是其中一个难度,这不是目标网址带来的,而是对我们自身自愿的考验:

  • 我们的带宽够吗
  • 我们的服务器够吗,单台不够就要分布式

如何能及时抓取到最新的新闻?

这是效率之外的另一个难度,如何保证及时性?几千家新闻网站,时刻都在发布最新新闻,爬虫在织网式抓取“旧”新闻的同时,如何兼顾获取“新”新闻呢?

如何存储抓取到的海量新闻?

爬虫织网式的爬取,会把每个网站几年前几十年前的新闻网页都给翻出来,从而获得海量的网页需要存储。就是存储上的难度。

如何清理提取网内容?

从新闻网页的html里面快速、准确提取想要的信息数据,比如标题、发布时间、正文内容等,这又带来内容提取上的难度。

网络爬虫难度二:需要登录才能抓到想要的数据

人是贪婪的,想要的数据无穷尽,但是很多数据不是你轻易就可以获得的。有一大类数据就是需要账户登录后才能看到,也就是说,爬虫请求时必须是登录状态才能抓取数据。

如何获取登录状态?

前面已经说过了,http协议的性质决定了登录状态就是一些cookies,那么如何获得登录状态就是一个非常有难度的问题。 有些网站登录过程很简单,把账户、密码发给服务器,服务器验证通过返回表示已登录的cookies。这样的网站,比较容易实现自动登录,爬虫运行过程全程无需人工干预,你就有更多时间喝茶、聊天

如何处理验证码?

然而,网站们既然要求你登录了,他们就不会这么轻易放过你,要做的更绝才能让小猿们善罢甘休,那就是上验证码! 没错,就是变态的验证码!!作为见多识广的老猿,我还是经常识别不出验证码,惭愧惭愧。

据说,有人雇了一批大妈,进行人工识别验证码;也有,通过图像处理技术,尤其如今火热的深度学习、人工智能的技术,来自动识别验证码。

那么,当你写爬虫时遇到验证码该怎么办?

网络爬虫难度三:ajax异步加载甚至JavaScript解密

前面的两个难度,都是靠我们研究数据加载过程,然后用Python代码可以重现出来,进行抓取的。

而遇到达第三个难度时,研究数据加载过程会让你十分痛苦、近乎崩溃。异步加载流程和服务器来来回回好多次,最后得到的数据还要通过JavaScript解密才能看到,这都是压垮爬虫者的最后一根稻草。

转载于:https://my.oschina.net/u/4125355/blog/3045626

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫开发的3大难题,别上了贼船才发现,水有多深 的相关文章

随机推荐

  • 服务器对操作系统有什么要求,服务器对操作系统有什么要求

    服务器对操作系统有什么要求 内容精选 换一换 查看用户的镜像类型 xff0c 如果是公共镜像则排除私有镜像的源镜像问题 镜像类型单击 申请服务器 xff0c 查看能否创建出此镜像的弹性云服务器 xff0c 申请完成后未出现此镜像对应的弹性云
  • 解决 martian source

    解决 martian source 第一步 xff1a etc sysctl conf 最后面添加 xff1a net ipv4 conf default log martians 61 0 net ipv4 conf all log ma
  • 如何划分地址段?

    今天一位网友问我该如何划分地址段以便进行网络流量限制 下面我就这个方法简单的说一说希望有所帮助 我们该如何划分地址段呢 xff1f ip地址段常用的有三类 xff1a xff21 类的默认子网掩码 255 0 0 0 xff0c 一个子网最
  • ONOS预热篇之ONOS简介

    为什么80 的码农都做不了架构师 xff1f gt gt gt ONOS问世后引起广泛关注 xff0c 关于 ONOS 与 ODL 的纷争不绝于耳 xff0c 最近小编拜读了一下 ONOS 白皮书 xff0c 并做了一点粗浅总结 xff0c
  • warning LNK4099: PDB 'vc100.pdb' was not found... 解决方案

    使用VS2010在编译得代码工程的时候 xff0c 原本在debug下是没有问题 xff0c 但是在release下编译始终会报 xff1a warning LNK4099 PDB 39 vc100 pdb 39 was not found
  • win7无法识别U盘,驱动信息:该设备的驱动程序未被安装。 (代码 28)

    台式机的win7 64位系统可以识别u盘 xff0c 但笔记本的win7 64位却识别不了 xff0c 说明U盘是可以用的 查看笔记本的设备管理器 xff0c 发现驱动安装失败 xff0c 提示信息为 该设备的驱动程序未被安装 代码 28
  • 微信小程序——navigator无法跳转

    今天在做小程序的时候 xff0c 发现用navigator无法进行跳转 url 路径也是对的 后面发现是因为我需要跳转的页面定义在了tabBar里面的 如下图 xff1a 如果需要跳转到tabBar里面定义的这些页面 xff0c 需要用到w
  • java中调用父类方法之super关键字的疑惑?

    在java中有super和this这2个关键字 xff0c 我有时候对super有一些疑惑 xff0c 我甚至认为我对super和this这2个关键字还没理解 xff01 大家请看下面的代码 xff0c 帮我解惑一些呗 xff01 谢谢 p
  • Docker修改daemon.json后无法启动的问题

    本文的运行环境为Centos 7 3 xff0c Docker与Kubernetes的安装方式见kubeadm安装kubernetes V1 11 1 集群 最近在整理Docker和Kubernetes中的日志与相关配置 xff0c 在尝试
  • android点击全屏预览照片第三方库使用

    android点击全屏预览照片第三方库使用 imgepreviewlibrary 移动端我们经常会遇到放大预览照片 xff0c 如果是一张照片 xff0c 那就全屏展示图片就好了 xff0c 但是如果是一个列表 xff0c 滑动查看 xff
  • R语言绘图-legend()添加图例

    legend x y 61 NULL legend fill 61 NULL col 61 par 34 col 34 border 61 34 black 34 lty lwd pch angle 61 45 density 61 NUL
  • MySQL数据库 资源

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 面试题 xff1a Linux运维必会的MySQL企业面试题大全 推荐 xff1a http blog 51cto com xiaogongju 2068526 mysql
  • LM358 电路 10倍放大

    如何用LM358将0 3V电压放大10倍 放大倍数 61 1 43 R2 R1 xff0c 放大10倍 xff0c 选择R1 61 2K xff0c R2 61 18K 转载于 https blog 51cto com 990487026
  • Java自定义异常处理——最佳实践[译]

    我们几乎已经在我们的每个行业标准应用的代码中处理java自定义异常了 常见的手段是创建一个语义性的继承基础exception类的自定义异常类 1 Java自定义异常处理 新的方法 1 1 传统异常处理 我们的新方法使用静态内部类来处理每个新
  • hdu 1669 Jamie's Contact Groups

    Jamie 39 s Contact Groups Time Limit 15000 7000 MS Java Others Memory Limit 65535 65535 K Java Others Total Submission s
  • C++11中的Lambda表达式构成之——捕获值列表

    摘抄之 xff1a 捕获值列表 xff0c 是允许我们在Lambda表达式的函数体中直接使用这些值 xff0c 捕获值列表能捕获的值是所有在此作用域可以访问的值 xff0c 包括这个作用域里面的临时变量 xff0c 类的可访问成员 xff0
  • matlab练习程序(c/c++调用matlab<dll>)

    这里的环境是windows7 43 vs2010 43 matlabR2010b 上一篇是通过engine来调用matlab中的语句 xff0c 本篇是通过调用m文件编译成的h lib dll文件而实现的 首先写一个函数mysvd m fu
  • CentOS7 命令行安装teamviewer遇到依赖包问题及完美解决

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 公司新到了几台服务器做Docker集群方面的应用 xff0c 将这几台服务器搭建成一个集群 由于要经常同时操作这几台服务器 xff0c 而我又不喜欢待在机房 TeamVie
  • Windows+VScode配置与使用git,超详细教程,赶紧收藏吧

    目录 第一步 xff1a 安装Git命令行工具 第二步 xff1a 配置VScode中的git 第三步 xff1a 使用 VScode 43 git xff0c 提交到仓库 当我们在VScode中编写代码后 xff0c 需要提交到git仓库
  • Python爬虫开发的3大难题,别上了贼船才发现,水有多深

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 写爬虫 xff0c 是一个非常考验综合实力的活儿 有时候 xff0c 你轻而易举地就抓取到了想要的数据 xff1b 有时候 xff0c 你费尽心思却毫无所获 好多Pytho