go ip过滤_用Go实现自己的爬虫

4b5ebadcf5cb3341ef8e29beb1441f8f.png

作者:Masamune

在日常生活中,我们时常会遇到一些采集数据相关的需求,比如获取一些官方数据整理到excel表中进行统计,聚合一些网页新闻提高自己的阅读效率等等。

虽然许多爬虫教程都是用python写的,但是我认为Go语言是比python更合适的选择,Go语言有着优秀的并发特性,很容易就可以写出高并发量的爬虫,并且没有python烦人的编码转换混乱的问题。

爬虫预期的爬取规模决定的爬虫程序本身的复杂度,本文将从语言到结构部分简单阐述如何设计一个爬虫程序。

首先我们选用的Go库是github.com/PuerkitoBio/goquery,先上示例:

爬取并列出ve2x首页的文章标题示例

package mainimport ("fmt""github.com/PuerkitoBio/goquery"
)func main() {root, err := goquery.NewDocument("https://www.v2ex.com/")if err != nil {panic(err)}root = goquery.NewDocumentFromNode(root.Find("div#Main").Nodes[0])nodes := root.Find("span.item_title").Nodesfor _, n := range nodes {fmt.Println(goquery.NewDocumentFromNode(goquery.NewDocumentFromNode(n).Find("a").Nodes[0]).Text())}
}

示例结果:

怎么记忆不同发行版的一些差别?
[讨论]当代下,对拿来主义和分享主义取舍的迷惑
macOS Mojave 和 Catalina 哪个更好用
谁能做一个监控社会物资捐赠和 redten 字会收入和发放的页面
macOS 如何更新 Python ?
暂时选择了 magic keyboard,有没其他推荐?
git clone 有没有什么有效的加速方法
谁能提供微软官网上面的 Win10 镜像 sha1 值
阿里云轻量级服务器提速原理是啥呢?
为什么我这段返乡戴笠忽然失效了~~
跨网络队列服务项目更新了~ [wukongqueue]
迫于穷, 300 块钱以内的无线键盘、鼠标,求推荐~
有没有感兴趣一起学习英语的?
微信小程序咨询: 请求私人 API,是否收费问题
  • 该库可以对html文档结构进行解析,并提供了类似DOM的API对html页面内的元素的内容进行提取,十分方便,相较于正则表达式来说更加优雅,具体细节可以参照文档和自己测试。
  • 注意调试页面过程中建议将页面保存成本地文件,每次运行的时候通过文件读取页面,否者抓取频率过高可能会触发网站的反爬规则。
  • 对于分析页面的引用库建议隔离一层接口,方便以后进行替换。

结构设计

对于绝大多数人来说,一个单机单进程的爬虫已经满足需求了,但是一个有点规模的爬虫如何做呢?这里简答阐述一个分布式的爬虫的设计思路。

任务分发

这部分建议使用队列中间件或者队列云服务,将爬取请求拆分成一个一个任务,投递到消息队列,而真实执行爬取任务的程序则从消息队列里获取任务进行爬取和分析,再进行数据落地。

任务处理

真实执行爬取任务的程序应该是无状态的,从队列获取到爬取任务后按业务规则进行处理,这部分程序可以通过多节点部署十分方便的进行扩展,不用担心数据丢失的问题,也方便做并发量的控制。

数据落地

建议通过数据库进行数据落地,并且针对每个URL的每次请求结果都进行存档,方便数据回溯,对于存储空间的消耗可能会相当大,这个需要根据爬虫规模自行评估如何做数据的落地和轮转。

数据处理

可以将已经落地的数据接入全文搜索引擎进行处理,具体则根据业务的复杂度和成本选取合适的方案。

URL去重

在爬取任务执行之前,需要判断URL在之前是否已经爬取过,对于已经爬取过的URL不需要在进行处理。这部分建议使用redis进行处理。对于已经爬取过的URL,作为key存到redis中,每次爬取之前都从redis中尝试获取一次,如果存在则跳过,这部分往深了做还可以使用布隆过滤器进行优化,这里不再阐述。

任务再分发

爬虫任务可能是通过其他程序或者人工生成的,也可能是在爬取任务处理过程中生成的,比如递归的爬取某个界面上的超链接,在这种情况下需要仔细处理再生成的任务,一些爬虫陷阱就埋在里面。比如某个连接正常用户永远无法点击到,但是爬虫在分析html页面的时候没有注意而直接进行请求的话,则会触发反爬规则被屏蔽。

关于反爬虫

爬取与反爬取是一个永恒的对抗,一般来说,只要爬取频率不要太高,就不容易触发网站的反爬规则,思路就是尽量伪装成正常的客户端请求。这里有需要注意的几点:

动态内容处理

有些需要的网页内容并不是html页面直接提供的,而是通过浏览器渲染后动态生成的,对于这部分页面,可以交由PhantomJS进行处理,获得渲染后的页面再进行分析处理。

UserAgent

一般的HTTP客户端有一个默认的UserAgent,比如Go语言官方的httpclient的类似:Go-http-client/1.1,而一般一个普通浏览器的UserAgent类似:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36,有些网站可能会通过UserAgent来识别异常的请求来源从而进行限制,当然这种方式比较低级,但确实有效,我们自己在请求的时候可能需要写入一个比较正常的UserAgent,甚至可以搜集多个常见浏览器的UserAgent值,发起请求的时候随机选取填入。

IP

如果同一个IP存在大量请求,肯定是会进行反爬处理,规避的方案就是需要大量的代理组成代理池,请求的时候随机选取,通过代理请求则可以避免对单一IP的屏蔽。随之而来的就是对代理本身请求成功率的评估,如果某一个代理的请求成功率太低,则需要考虑踢出代理池,以免对爬取效率造成影响。

控制爬取频率

控制爬取频率是非常重要的,如果请求频率太高引起网站管理员的注意就得不偿失了。这里建议将爬取的请求拆分成一个一个的任务,结合消息队列进行爬取频率的控制,可以通过Go本身的channel进行限流,也可以结合外部队列中间件进行限制。

验证码

简单的方案就是选择一个识别简单验证码的库,付费的话可以调用别人的识别验证码的API。

爬虫陷阱

有些超链接埋在html页面里并没有显示,正常用户不可能请求,但是如果爬虫程序识别为普通超链接并且发起请求的话,就会触发反爬规则被屏蔽。

内容

更恶心的反爬手段是,如果触发了网站的反爬规则,并不会直接拒绝请求,而是返回看似正常,但其实是虚假的数据。这种问题不易被发现,而且难以追查反爬策略,只能尽可能的关注爬取内容,做好质量控制。

最后

总的来说,爬虫的规模根据当前需求进行设计,简单的单机单进程就满足需求。复杂的就需要考虑设计成分布式程序跨机运行并且具有良好的扩展性。每个人都可以拥有自己的爬虫,方便自己的生活。

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

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

相关文章

Flume实战采集文件内容存入HDFS

1、flume安装目录下新建文件夹 example 2、在example下新建文件 log-hdfs.conf 内容如下: # Name the components on this agent a1.sources r1 a1.sinks k1 a1.channels c1#exec 指的是命令 # Describe/configure the source a1.sources.r1.type exec #F…

python海龟绘图圆形_python之海龟绘图

1. 基本功能介绍 在海龟作图中,我们可以编写指令让一个虚拟的(想象中的)海龟在屏幕上来回移动。这个海龟带着一只钢笔,我们可以让海龟无论移动到哪都使用这只钢笔来绘制线条。通过编写代码,以各种很酷的模式移动海龟&a…

PLSQL Developer导入csv文件到oracle

csv文件内容: 要导入的表结构 create table RPT_MONILUCE_2_P01 ( imsi NUMBER, road_line NUMBER, ci NUMBER, diff NUMBER, rn NUMBER, sdate DATE, report_id NUMBER(20) ) 步骤: 1、在csv第一行上增加…

erwin 不能输入中文_国产开源建模软件PDMan与国外商业建模软件ERwin的主要功能比较...

在数据库建模的过程中,我们经常会使用到ERwin或者Power Designer之类的建模软件,来构建我们的逻辑模型和物理模型。但是这类软件都属于商业软件,需要企业购买相应的许可证授权。有些时候,我们会在没有购买这类商业建模软件的环境下…

已知一点经纬度,方位角,距离,求另一点经纬度

参考了博文:http://blog.csdn.net/pyx6119822/article/details/52298037 ------------------------------------------------ package hellotest;public class LonLatTest3 {/** 大地坐标系资料WGS-84 长半径a6378137 短半径b6356752.3142 扁率f1/298.2572236*//**…

python的基本语术_一起学python-彻底掌握专业术语“变量”的概念

昨天分享了笨方法学习编程,今天就让我们通过实战来接触python,掌握专业术语“变量”的概念吧 python 中的变量的基本概念和初中代数的方程式X的概念是一样的,只是在计算机程序当中这个X不仅仅可以代表一个数字,还可以代表一段文字…

lamp自动部署工具_Linux一键配置工具ezhttp介绍

简介: ezhttp是一个Linux一键配置工具,采用bash脚本语言编写。支持自动配置LAMP,LNMP,LNAMP环境,以前提供各种其它的配置工具,如自动配置swap,配置iptables等。项目托管在github,地址为https://github.com/centos-bz/e…

git设置全局账号密码_jenkins2.222使用之二、总体设置

构建前提:由于构建的时候是基于maven、git(码云)以及jdk1.8来的,所以这些都需要和jenkins安装在同一台服务器上面。全局工具配置:1、配置jdk系统管理-全局工具配置-jdk,配置如下:jdk版本可以配置多个,构建的时候&#…

Mybatis源码之(TypeAliasRegistry)TypeAlias别名实现机制

原文链接:http://blog.csdn.net/qq924862077/article/details/52612589 ---------------------------------- 在Mybatis编程中我们经常会用到将某个bean作为参数类型parameterType或者结果返回值类型ResultType,所以很多时候我们需要把完成的Bean的包名…

Java中Synchronized的用法

2019独角兽企业重金招聘Python工程师标准>>> 《编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程》一文详细讲述了线程、进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础。本文将接着讲一下Java线程同步中的一个重要的概念…

concat特征融合_MSFNet:多重空间融合网络进行实时语义分割(北航和旷视联合提出)...

作者:Tom HardyDate:2020-02-01来源:MSFNet:多重空间融合网络进行实时语义分割(北航和旷视联合提出)原文链接:https://arxiv.org/abs/1911.07217主要内容实时语义分割是一项具有挑战性的任务,因…

wifi信号手机测试软件,专业的WiFi检测工具有哪些?如何解决wifi信号不好?

原标题:专业的WiFi检测工具有哪些?如何解决wifi信号不好?有朋友wifi测试软件有哪些?WiFi信号和声音一样,强弱都是可以测量的,检测WiFi的方法有很多,作为普通的家庭用户,我们有时需要…

python创建数组与列表_python基础(三):数组和列表

下面是小凰凰的简介,看下吧! 💗人生态度:珍惜时间,渴望学习,热爱音乐,把握命运,享受生活 💗学习技能:网络 -> 云计算运维 -> python全栈( 当前正在学习…

Mybatis之typeAlias配置的3种方法

原文链接&#xff1a;http://www.cnblogs.com/lxcmyf/p/6444120.html ------------------------------- 扩展阅读&#xff1a;http://blog.csdn.net/zengmingen/article/details/70163420 ------------------------------------ 1.定义别名&#xff1a; <typeAliases>…

计算机函数两个表格找相同,wps筛选出两个表格中的重复项(countif 函数简单使用)【已解决】...

假设&#xff0c;有以下两个表格文件。为了掩饰&#xff0c;数据就几个。AB两个表格&#xff0c;现在要做的是从A表格中&#xff0c;去除跟B表格重复的内容&#xff0c;只保留剩余的数据。第一步&#xff0c;先把B表格中的 蔬菜名称 那一列&#xff0c;复制到A表格中。(如果数据…

python常用正则表达式_Python3常用正则表达式

正则表达式速查表 字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如&#xff0c;“n“匹配字符”n“。”\n“匹配一个换行符。串行”\\“匹配”\“而”\(“则匹配”(“。 ^ 匹配输入字符串的开始位置。如果设置了RegExp…

Spring Cloud 学习笔记(一) 之服务治理模块Spring Cloud Eureka 搭建注册中心

2019独角兽企业重金招聘Python工程师标准>>> 关于springboot的学习请参考前面的文章 接下来我们会开启一系列关于springcloud的学习文章。 一、概念 首先我们看下官方的解释 Service Discovery is one of the key tenets of a microservice-based architecture. Try…

java分治法求数列的最大子段和_同事为进大厂天天刷Java面试题,面试却履败!究其原因竟是它在捣鬼。...

写在前面疫情过后&#xff0c;招聘与求职受影响到底有多大&#xff1f;我不知道&#xff0c;但我的真实感受是&#xff0c;即使有疫情的影响&#xff0c;最近还是持续有朋友来跟我说他们今年工作的新动向。有人跳槽去了大厂&#xff0c;有人下定决心出来创业&#xff0c;也有人…

中国移动wlan优化app-截图

Nokia的wlan优化项目得到了中国移动省公司的认同&#xff0c;成为了重点项目&#xff0c;转移了其他项目组开发。 我单独负责开发Android端app。还没开发完&#xff0c;源码也移交了&#xff0c;不再继续参与开发。 新任务是负责现有平台从Oracle转为大数据。截图纪念下近半个…

linux软件安装管理

Linux软件安装管理 TonyLinux系统工程师难度初级 时长 3小时 6分 学习人数64016 综合评分9.8收藏上面是linux 的源代码安装包 linux有两种类型的软件安装方式&#xff1a; 1、源代码安装 这种方式的软件安装&#xff0c;可以指定软件的安装目录&#xff0c;软件的运行效率高&am…