小鹿爬虫系列——静态网站页面爬取

被迫营业系列

每次都在挖坑,CSDN上挖的坑尤其多,哈哈哈哈哈~这是一篇非书面语写就的文章,毕竟枯燥且充实的code需要欢脱的外在来包裹,这样的糖衣?也比较容易服用呢~

最近实习遇到一个小需求,大致是需要根据 英文地址索引具体建筑物,并获取相关信息。做爬虫的动力是,需要手动search的地址数据比较多,经过手动验证,获取到有效信息的source比较固定,且目测目标网站几乎没有反爬策略,故而产生了为何不生成一个小型的库来简化操作的想法。

 

太长不看系列:

一、目标网站分析

  如前所述,我想建一个地区建筑物信息的database,经过筛选确定了hk置业作为目标网站。

 

 

 

 

二、读写模块

三、数据清洗

四、遇到的各种bug

五、下一步的尝试及思考(挖坑真快乐!)

5.1. 提高爬取速度:

5.2.  简单反爬取机制:

  如何应对具有反爬机制的网站,验证码,必须登录,访问限制等。这次做的小爬虫项目里没有遇到这些,因为我选择的目标网站只是一个hk的信息展示类页面,更具体地说是房产中介的网站。由于在实施时人工选择了更易爬取且目标信息更清晰的静态网站(这是一句委婉的承认自己菜的说法哈哈哈),项目绕过了这些障碍。 老实讲, 这些策略在内地的很多网站上是很常见的,因为大量的爬虫会对网站服务器造成大量负担,而且更容易遭受Dos攻击。

5.2.1 关于验证码:

目前的解决方法是连接一个验证码调取网站,直接连接到它们的接口上,当然这个也需要花费一些银子。

这一类的网站或者说,小型众包平台的运行逻辑,我之前大致了解过,他们招募了很多在线赚钱的刷单者(大致是同一批人)(蚂蚁,腾讯和百度都有类似的微任务平台,只不过他们的业务仅限于供自身业务线使用)(还有一种动态的团队,他们负责招募固定的人员给一个basic pay,之后有需求就不断地反馈)(这个跟人工智能火起来前期数据采集和线框数据标注的模式很像,基本上是个产业链了)

突破网站验证码的方法大致是调取这一类接口,在目标网站需要交互的部分打包发回去。这一部分仔细说来又涉及到三次握手四次挥手,在你伪装成浏览器的代码部分加一些改动,具体目标网站请求和相应的方式可能有细微差别,如果用到了我会继续补上笔记的哈哈哈(挖坑挖坑,技术Flag儿童欢乐多)(Ps,这一块的博客和资源写的都还挺好的,有需要请自行google,我主要参考了这篇博客: https://blog.csdn.net/qq_40604853/article/details/83307011

5.2.2 关于模拟登录及虚拟手机号码进行注册及验证

(这一块是另外一个产业链23333)

爬虫用到的模拟注册和突破验证的这一点功能,一般是找一些网络运营商提供者,或者打码平台之类的,我们的目的是收集需要的信息,爬取其实只是最开始的一步,作为数据分析人员(预备的哈哈哈),由于能够使用到的数据脏数据比较多,所以还要首先进行data cleaning工作。这一类的模拟验证平台,当然也是要银子的,同样是依据使用量买服务,有一些还不错的试用套餐,我们小型项目是够用了。 这一类的不想介绍太多,因为它的用法和合法性其实都还存疑。而且顺便说一句,很多虚拟的垃圾推销电话和诈骗电话等,他们除了去非法盗取用于的个人信息外,还会使用到这一类的平台进行拨出。(挖坑挖坑,关于他们拨出电话这一块其实还有基站劫持等技术,如果你学过通信相关的知识可能会比较熟悉,欢迎入坑哈哈哈)

 

5.2.3 关于访问限制;

这就不得不提到IP代理池:

先说结论,IP代理可以选择是否告诉服务器你使用了代理,高级一点的使用是完全随机模拟浏览器访问,让对方服务器认不出来你用了代理,这样就可以跟正常点击浏览进行相同的操作路径。

这一部分在早上的公交上看了一部分,得到的结论是:从成本上讲,有两种选择,分别是自建一个Ip池,爬取并搜集更新免费IP地址(付费IP池的试用部分),使用的时候rand一下就可以,或者直接花个几十元钱买几个小时的代理,基本上小型网站应该够用。 从效率和可用性上讲,由于爬取到的免费池太容易失效,所以不如选择后者(此处没有广告,所以就不推荐好用的ip代理了,可自行谷歌,有一篇专门对比可用性的博客,链接我贴在这里,请自行食用:https://cuiqingcai.com/5094.html)。 还有一种很费力不讨好的方法,租个服务器自己搞代理,如果只是爬虫玩一玩的同学,可以直接跳过,如果有时间而且有兴趣,可以考虑阿里云这种给新开发者的试用服务器,以使用量收费的机制还可以。但是要承担使用之后反复被阿里云售前人员打扰的副作用(是的此处是个吐槽23333)。

关于在工程中使用IP代理的方法,可以参考这篇文章: https://blog.csdn.net/weixin_40372371/article/details/80154707

还有github上的一个项目:https://github.com/jhao104/proxy_pool

5.3. 动态网站爬取

    js+css的样式使得网站很美观,而且动态从服务器里调用使得网站安全性得以提高,所以还是很多网站用js的。

或者至少有一部分组件使用了js,因为这样可以动态更新。这一部分的技术处理在学习教程上有提到过,我这里重新回顾一下:

 

 

 

、、、、、、(此处放 抽取投票数的 笔记)和 byhand里的代码

 

 

 

 

 

5.4. 如何优雅选择目标内容;

   刚开始接触爬虫的时候可能被html繁杂的布局劝退(如果网页设计这类的课程你还是用dream waver学的话,哈哈哈哈)

然而啃一啃HTML还是有好处的,这样你就会觉得xml就也还好,之后用json格式存取数据的时候也会意识到他们一脉相承。 个人觉得学习时这种建立连结,似曾相识的感觉比完全陌生要一些,这样只要在自己的知识体系里建立link和一个差异字典就可以了。使用相关知识的时候在脑海中search一下,并比对一下差异字典,大脑做这项工作时时间复杂度几乎是O(n)的,并且实在想不起来的时候还可以在google吖!(不适用于语言学习>=<,同一个语系下的不同种语言之间不小心讲串了简直GG,西班牙语加德语的风味并不好,掺杂法语发音味道也很诡异,尴尬的是有的时候你只能想起来西班牙语的发音但是你打算讲的是英语23333,所以语言还是先努力熟练一门再在你的大脑中开一块内存来存另外的语言,时常维护大脑里的这块库到语言神经中枢的通路,不然就会变成沉默的语言库,有口难开,跑题了23333)

如果很幸运,你需要的东西在 代码检查之后能够找到,也就是直接以文字出现在某个class的内容里,那么你只需要多搜索几次就可以找到。

 

 

(这里放一张 网页 查看源代码,红圈找到我们要的东西的图)

 

 

如果你找的东西是js里的,那么你需要很仔细的找一找,从文件的编写逻辑和网站建设人员的写作习惯,还有观察network标签的变化。reload之后页面会重新加载,network页面会出现几个峰值,那么变化量较大的很大概率上就是网页中变动的部分,通常也是我们需要的部分。因为静态的框架部分考虑到资源节约,不会被反复刷新,也不会被反复变更,这样这部分对流量占用就没什么贡献,故而通过观察network变化来寻找main document是一种很直接有效的方式。

如果以上方法你仍觉得过于繁琐,那么我要缅怀一个神器(  这里需要加一些这个小工具的资料)

 

5.4.2 关于正则 

曾经它可以快速进行元素分析,这样在各种html标签中你的目标元素就会脱颖而出,而你所要做的就只要写个正则把它取出来就好。

匹配url的时候经常会用到这个:

#HTML 标签:
/^<([a-z]+)([^<]+)(?:>(.)<\/\1>|\s+\/>)$/

#Unicode 编码中的汉字范围:
/^[u4e00-u9fa5],{0,}$/

 

这里提到了正则,有兴趣的话可以看一下我的另一篇常用正则表达式哈哈哈:^ ^  这里继续挖个坑,下一步是否能完成一个 根据input 识别检索出已有库中的信息,并且自动清洗的小工具。 这个需求是一个很可爱很有爱的小姐姐提出来的,所以如果有人实现了也可以联系我啊嘿嘿~

https://blog.csdn.net/zhujialiang18/article/details/102750229

5.5. 关于存储,mangoDB

坑再次出现了哈哈哈。

这次因为项目不大,所以直接存到csv里了,偷个懒偷个懒。 讲个笑话:==>

python爬虫27 | 当Python遇到MongoDB的时候,存储av女优的数据变得如此顺滑爽~

之前学了Mysql和他的一些框架,现在最多用用Sql Server,有兴趣的可以看看这篇对比:

https://blog.csdn.net/SL_World/article/details/86633611

还有这篇

https://blog.csdn.net/qq_21057881/article/details/71079920

感兴趣的事情总会不断去想要深挖或者拓展,算是一种学习上的变相的贪婪算法吧,当前步 做出 当前最有策略,且不影响全局最优,接下来的事情就交给子问题去做吧哈哈哈~

 

以上,算是这次小型项目的笔记和总结,写不动了哈哈哈~

欢迎各位大神光临。

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章