一日一技:Selenium如何接管已经运行的Chrome浏览器?
在昨天的文章一日一技:爬虫模拟浏览器如何避免重复登录?中,我讲到了如何使用Puppeteer接管已经运行的Chrome。今天我们来讲讲使用Selenium如何实现这个功能。
在昨天的文章一日一技:爬虫模拟浏览器如何避免重复登录?中,我讲到了如何使用Puppeteer接管已经运行的Chrome。今天我们来讲讲使用Selenium如何实现这个功能。
之前有一位爬虫大佬写了一篇文章,说 HTTP/2协议天然就能防大部分的爬虫。Python 无论是 requests 还是 Scrapy 都不支持 HTTP/2协议。
Go + HTTP/2这个网站可以检测你是否使用 HTTP/2协议进行请求。当我们直接使用浏览器访问的时候,页面长这样:
但如果我们直接使用 Scrapy 访问这个页面,并打印源代码,返回的 HTML 长这样:
这样看起来,似乎Scrapy 确实不支持HTTP/2协议?
有同学在知识星球上问我,什么情况下使用静态方法,什么情况下使用类方法。今天我们就来捋一下这两个方法的应用场景。
GNE 是一个通用的新闻正文抽取器,自从开源以来,已经被很多人用来作为新闻正文通用爬虫的重要组件。
GNE 的 Github 地址:https://github.com/GeneralNewsExtractor/GeneralNewsExtractor。算法来自于《基于文本及符号密度的网页正文提取方法》,这个算法是完全基于 HTML 里面的信息来寻找正文。因此,它有一些先天性缺陷:
但如果让人来看网页,就不会搞错。因为正文的位置和评论的位置肯定不一样,版权信息一般在最下面……这些可视化信号,是通过 CSS 来确定的,单纯从 HTML 中是看不到的。
GNE 输入的HTML,原本就是使用模拟浏览器输出的 HTML,并不是真正的网页源代码。既然如此,在使用模拟浏览器的时候,为什么不直接把每个节点的坐标信息都记录下来呢?在使用模拟浏览器的时候,只需要执行一段 JavaScript 代码,就可以把每个节点是否可见,每个可见节点的长宽高、左上角、右下角的坐标记录下来。这样,GNE 在解析正文的时候,可以参考这些信息,直接移除不可见的节点,并移除尺寸显然不合理、位置显然不正确的节点。从而大大提高正文识别的准确率。
什么是隧道代理?我们来看下面这张截图:
所谓隧道代理,就是一个能帮你自动更换代理 IP 的代理服务。在你的代码里面,你只需要把一个入口代理地址写死,然后正常发起请求,而目标服务器接收到的请求,每一次都是不同的代理地址。
在某代理网站上,隧道代理50并发每秒的价格是4000元/月:
而常规的,先请求接口拿到一批代理 IP,再选一个发起请求的原始代理服务器,一个月价格才600多元:
所以,如果我们能自己做一个隧道代理,将会省下很多钱!
大家有时候可能需要在 Linux 上面生成 zip 文件或者对一个 zip 文件进行解压。如果你在网上搜索怎么在 Linux 解压 zip 文件,你一般会看到下面这样的回答:
但如果你手边刚好有一台 Linux 服务器的话,你可以试一试,一般你会得到这样的返回:
有一类面试官特别讨厌,面试的时候,会问一些偏、难、怪的题目。假设你今天去面试,遇到面试官问你:“什么是鸭子类型?”。你怎么回答?
熟读维基百科的你,脑海中闪过了下面这张截图:
图中的红框像闪电一样从你的脑子里划过。你用中指扶了扶黑框眼镜,自信地说道:
鸭子类型就是说,一个函数不会关心它传入参数的类型,只关心这个参数对应的对象有没有自己想要的方法和属性。如果有,就能运行。如果没有,就不能运行。这就像是我看到了一只鸟,只要它能像鸭子一样叫,像鸭子一样走路,有鸭子一样的白色羽毛,那么,无论它实际上是什么东西,我都认为它是鸭子。
说完这段话,一道光从你的镜片上一闪而过。你心里想,这下稳了。
我们知道,在使用 Git 的时候,应该要正确使用它的分支(Branch)功能。不同的功能使用不同的分支开发,最后合并进入主分支。但有时候会出现这样一种情况——我代码都已经写完了,才发现我写错分支了。这个时候,怎么把我的修改迁移到目标分支上,并且不修改现在正在使用的分支?
今天在粉丝交流群里面,有个同学说他发现了Requests
的一个 bug,并修复了它:
聊天记录中对应的图片为:
看到这个同学的截图,我大概知道他遇到了什么问题,以及为什么会误认为这是 Requests 的 bug。