
代理模式
初探爬虫 ||《python 3 网络爬虫开发实践》读书笔记 | 小蒋不素小蒋
采集交流 • 优采云 发表了文章 • 0 个评论 • 376 次浏览 • 2020-06-24 08:02
从 Python3.5 版本开始,Python 中加入了 async/await。
接口抓取的缺点是抓不到 js 渲染后的页面,而下边介绍的模拟抓取能挺好的解决问题。
也就是可见即可爬。
Splash 是一个 javascript 渲染服务。它是一个带有 HTTP API 的轻量级 Web 浏览器。
Selenium 是一个自动化测试工具,利用它我们可以驱动测览器执行特定的动作,如点击、下拉等操作。
Selenium + Chrome Driver,可以驱动 Chrome 浏览器完成相应的操作。
Selenium + Phantoms,这样在运行的时侯就不会再弹出一个浏览器了。而且 Phantoms 的运行效率也很高。
Phantoms 是一个无界面的、可脚本编程的 Webkit 7 浏览器引擎。
Appium 是 App 版的 Selenium。
抓取网页代码以后,下一步就是从网页中提取信息。
正则是最原始的形式,写上去繁杂,可读性差。
lxml 是 Python 的一个解析库,支持 HTML 和 XML 的解析,支持 XPah 解析方法。
Beautiful Soup 的 HTML 和 XML 解析器是依赖于 lxml 库的,所以在此之前请确保早已成功安装好了 lxml。
Beautiful Soup提供好几个解析器:
pyquery 同样是一个强悍的网页解析工具,它提供了和 jquery 类似的句型来解析 HTML 文档。
推荐:
Beautiful Soup(lxml)。lxml 解析器有解析 HTML 和 XML 的功能,而且速度快,容错能力强。
如果本身就熟悉 css 和 jquery 的话,就推荐 pyquery。
NOSQL,全称 Not Only SQL,意为不仅仅是 SQL,泛指非关系型数据库。包括:
口 键值储存数据库:代表有 Redis、Voldemort 和 Oracle BDB 等
口 列存储数据库:代表有 Cassandra、Hbase 和 Riak 等。
口 文档型数据库:代表有 COUCHDB 和 Mongodb 等。
口 图形数据库:代表有 Neo4J、infogrid 和 Infinite Graph 等。
针对一些复杂应用,尤其是 app,请求不象在 chrome 的 console 里这么容易看见,这就须要抓包工具。
mitmproxy(mitmdump) 比 Charles 更强大的是爬虫软件开发,可以支持对接 Python 脚本去处理 resquest / response。
方案:Appium + mitmdump
做法:用 mitmdump 去窃听插口数据,用 Appium 去模拟 App 的操作。
好处:即可绕开复杂的插口参数又能实现自动化提升效率。
缺点:有一些 app,如微信朋友圈的数据又经过了一次加密造成难以解析,这种情况只能纯用 Appium 了。但是对于大多数 App 来说,此种方式是奏效的。
pyspide 框架有一些缺点,比如可配置化程度不高,异常处理能力有限等,它对于一些反爬程度特别强的网站的爬取变得力不从心。
所以这儿不多做介绍。
Scrapy 是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架。
Scrapy 包括:
Scrapy-Splash:一个 Scrapy 中支持 Javascript 渲染的工具。
Scrapy-Redis :Scrap 的分布式扩充模块。
Scrapyd :一个用于布署和运行 Scrapy 项目的工具。
Scrapyrt :为 Scrap 提供了一个调度的 HTTP 接口。
Gerapy :一个 Scrapy 分布式管理模块。
Scrapy 可对接:
Crawlspider : Scrap 提供的一个通用 Spider,我们可以指定一些爬取规则来实现页面的提取,
Splash / Selenium :自动化爬取
Docker
具体使用:待写
URI 的全称为 Uniform Resource Identifier,即统一资源标志符。
URL 的全称为 Universal Resource Locator,即统一资源定位符。
URN 的全称为 Universal Resource Name,即统一资源名称。
URI 可以进一步界定为URL、URN或二者兼具。URL 和 URN 都是 URI 子集。
URN 如同一个人的名称,而 URL 代表一个人的住址。换言之,URN 定义某事物的身分,而 URL 提供查找该事物的技巧。
现在常用的http网址,如 就是URL。
而用于标示惟一书目的 ISBN 系统, 如:isbn:0-486-27557-4 ,就是 URN 。
但是在目前的互联网中,URN 用得十分少,所以几乎所有的 URI 都是 URL。
Robots 协议也叫做爬虫协议、机器人合同,它的全名叫作网路爬虫排除标准(Robots Exclusion Protocol),用来告诉爬虫和搜索引擎什么页面可以抓取,哪些不可以抓取。它一般是一个叫作robots.txt 的文本文件,一般置于网站的根目录下。
当搜索爬虫访问一个站点时,它首先会检测这个站点根目录下是否存在 robots.txt 文件,如果存在搜索爬虫会按照其中定义的爬取范围来爬取。如果没有找到这个文件爬虫软件开发,搜索爬虫便会访问所有可直接访问的页面。
robotx.txt 需要置于网站根目录。
User-agent: *
Disallow: /
Allow: /public/
Disallow表示不容许爬的页面,Allow表示准许爬的页面,User-agent表示针对那个常用搜索引擎。
User-agent 为约定好的值,取值如下表:
1、测试环境
2、管理后台(如 cms)
3、其它
1、Google的 Robots.txt 规范。
2、站长工具的 robots文件生成 工具。
Xpath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中査找信息的语言。它最初是拿来搜救 XML 文档的,但是它同样适用于 HTML 文档的搜索。
Xpath 的选择功能非常强悍,它提供了十分简约明了的路径选择表达式。另外,它还提供了超过 100 个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等。
Xpath 于 1999 年 11 月 16 日成为 W3C 标准。
就好象 css 选择器。
可以使用 Tesseract ,它是 Python 的一个 OCR 识别库。
市面上用的最多的是这家提供的滑动验证码: ,如 bilibili。
可以用自动化库,如 Selenium 模拟滑动(注意人去滑动按键是先快后慢)。
解决思路:模板匹配+模拟拖动
还有一个专门提供点触验证码服务的站点 Touclick,例如 12306 网站。
上面说的第四个:点触验证码,应该是最难辨识的了。
但互联网上有好多验证码服务平台,平台 7×24 小时提供验证码辨识服务,一张图片几秒都会获得辨识结果,准确率可达 90%以上。
个人比较推荐的一个平台是超级鹰,其官网为 。其提供的服务种类十分广泛,可辨识的验证码类型特别多,其中就包括点触验证码。
ロ FTP 代理服务器:主要用于访问 FTP 服务器,一般有上传、下载以及缓存功能,端口通常为 21、2121 等。
ロ HTP 代理服务器:主要用于访问网页,一般有内容过滤和缓存功能,端口通常为 80、8080、3128等。
口 SSL/TLS代理:主要用于访问加密网站,一般有SSL或TLS加密功能(最高支持 128 位加密硬度),端口通常为 443。
口 RTSP 代理:主要用于访问 Real 流媒体服务器,一般有缓存功能,端口通常为 554。
口 Telnet 代理:主要用于 telnet 远程控制(黑客入侵计算机时常用于隐藏身份),端口通常为 23。
口 POP3 SMTP 代理:主要用于 POP3 SMTP 方式收发短信,一般有缓存功能,端口通常为 11025 。
口 SOCKS 代理:只是单纯传递数据包,不关心具体合同和用法,所以速度快好多,一般有缓存功能,端口通常为 1080。SOCKS 代理合同又分为 SOCKS4 和 SOCKS5,前者只支持 TCP,而后者支持 TCP 和 UDP,还支持各类身分验证机制、服务器端域名解析等。简单来说,SOCKS4 能做到的 SOCKS5 都可以做到,但 SOCKS5 能做到的 SOCKS4 不一定能做到。
口 高度匿名代理:会将数据包原封不动地转发,在服务端看来就似乎真的是一个普通客户端在访问,而记录的 IP 是代理服务器的 IP。
ロ 普通匿名代理:会在数据包上做一些改动,服务端上有可能发觉这是个代理服务器,也有一定概率彻查到客户端的真实 IP。代理服务器一般会加入的 HTIP 头有 HTTPVIA 和 HTTPXFORWARDEDFOR。
口 透明代理:不但改动了数据包,还会告诉服务器客户端的真实 IP。这种代理不仅能用缓存技术提升浏览速率,能用内容过滤提升安全性之外,并无其他明显作用,最常见的事例是外网中的硬件防火墙。
口 间谍代理:指组织或个人创建的用于记录用户传输的数据,然后进行研究、监控等目的的代理服务器。
网站上会有很多免费代理,比如南刺: 。但是这种免费代理大多数情况下都是不好用的,所以比较靠谱的方式是订购付费代理。
1、提供插口获取海量代理,按天或则按时收费,如讯代理;
如果信赖讯代理的话,我们也可以不做代理池筛选,直接使用代理。不过我个人还是推荐使用代理池筛选,以提升代理可用机率。自己再做一次筛选,以确保代理可用。
2、搭建了代理隧洞,直接设置固定域名代理,如阿布云代理。云代理在云端维护一个全局 IP 池供代理隧洞使用,池中的 IP 会不间断更新。代理隧洞,配置简单,代理速率快且十分稳定。
等于帮你做了一个云端的代理池,不用自己实现了。
需要注意的是,代理 IP 池中部份 IP 可能会在当日重复出现多次。
3、ADSL 拨号代理
ADSL (Asymmetric Digital Subscriber Line,非对称数字用户支路),它的上行和下行带宽不对称,它采用频分复用技术把普通的电话线分成了电话、上行和下行 3 个相对独立的信道,从而防止了互相之间的干扰。
我们借助了 ADSL 通过拔号的形式上网,需要输入 ADSL 账号和密码,每次拔号就更换一个 IP 这个特点。
所以我们可以先订购一台动态拔号 VPS 主机,这样的主机服务商相当多。在这里使用了云立方,官方网站:
代理不论是免费的还是付费的,都不能保证都是可用的,因为:
1、此 IP 可能被其他人使用来爬取同样的目标站点而被封禁。
2、代理服务器忽然发生故障。
3、网络忙碌。
4、购买的代理到期。
5、等等
所以,我们须要提早做筛选,将不可用的代理剔除掉,保留可用代理。这就须要代理池,来获取随机可用的代理。
代理池分为 4 个模块: 存储模块、获取模块、检测模块、接口模块。
口 存储模块使用 Redis 的有序集合,用来做代理的去重和状态标示,同时它也是中心模块和基础模块,将其他模块串联上去。
口 获取模块定时从代理网站获取代理,将获取的代理传递给储存模块,并保存到数据库。
口 检测模块定时通过储存模块获取所有代理,并对代理进行检查,根据不同的测量结果对代理设置不同的标示。
口 接口模块通过WebAPI 提供服务插口,接口通过联接数据库并通过Web 形式返回可用的代理。
对于这儿的测量模块,建议使用 aiohttp 而不是 requests,原因是:
对于响应速率比较快的网站来说,requests 同步恳求和 aiohttp 异步恳求的疗效差别没这么大。但对于测量代理来说,检测一个代理通常须要十多秒甚至几十秒的时间,这时候使用 aiohttp 异步恳求库的优势就大大彰显下来了,效率可能会提升几十倍不止。
(1)有的数据必须要登陆能够抓取。
(2)有时候,登录帐号也可以减少被封禁的几率。
做大规模抓取,我们就须要拥有好多帐号,每次恳求随机选定一个帐号,这样就减少了单个帐号的访问颍率,被封的机率又会大大增加。
所以,我们可以维护一个登陆用的 Cookies 池。
架构跟代理池一样。可参考上文。
待写
python 的 open() 支持的模式可以是只读/写入/追加,也是可以它们的组合型,具体如下:
模式描述
r
以只读方法打开文件。文件的表针将会放到文件的开头。这是默认模式。
rb
以二进制格式打开一个文件用于只读。文件表针将会放到文件的开头。这是默认模式。
r+
打开一个文件用于读写。文件表针将会放到文件的开头。
rb+
以二进制格式打开一个文件用于读写。文件表针将会放到文件的开头。
w
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a
打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。也就是说,新的内容将会被写入到已有内容然后。如果该文件不存在,创建新文件进行写入。
ab
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。也就是说,新的内容将会被写入到已有内容然后。如果该文件不存在,创建新文件进行写入。
a+
打开一个文件用于读写。如果该文件已存在,文件指针将会放到文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。如果该文件不存在,创建新文件用于读写。
1、r+ 和 w+ 都是读写,有哪些区别?
答:前者是假如没有找到文件则抛错,后者是假如没有找到文件则手动创建文件。
2、a 可以看成是 w 的变种,附加上了”追加内容“的特点。
一般调用 open() 的时侯还须要再调用 close()。 python 提供了一种缩写方式,那就是使用 with as 语法。在 with 控制块结束时,文件会手动关掉,不需要 close() 了。调用写法如下: 查看全部

从 Python3.5 版本开始,Python 中加入了 async/await。
接口抓取的缺点是抓不到 js 渲染后的页面,而下边介绍的模拟抓取能挺好的解决问题。
也就是可见即可爬。
Splash 是一个 javascript 渲染服务。它是一个带有 HTTP API 的轻量级 Web 浏览器。
Selenium 是一个自动化测试工具,利用它我们可以驱动测览器执行特定的动作,如点击、下拉等操作。
Selenium + Chrome Driver,可以驱动 Chrome 浏览器完成相应的操作。
Selenium + Phantoms,这样在运行的时侯就不会再弹出一个浏览器了。而且 Phantoms 的运行效率也很高。
Phantoms 是一个无界面的、可脚本编程的 Webkit 7 浏览器引擎。
Appium 是 App 版的 Selenium。
抓取网页代码以后,下一步就是从网页中提取信息。
正则是最原始的形式,写上去繁杂,可读性差。
lxml 是 Python 的一个解析库,支持 HTML 和 XML 的解析,支持 XPah 解析方法。
Beautiful Soup 的 HTML 和 XML 解析器是依赖于 lxml 库的,所以在此之前请确保早已成功安装好了 lxml。
Beautiful Soup提供好几个解析器:

pyquery 同样是一个强悍的网页解析工具,它提供了和 jquery 类似的句型来解析 HTML 文档。
推荐:
Beautiful Soup(lxml)。lxml 解析器有解析 HTML 和 XML 的功能,而且速度快,容错能力强。
如果本身就熟悉 css 和 jquery 的话,就推荐 pyquery。
NOSQL,全称 Not Only SQL,意为不仅仅是 SQL,泛指非关系型数据库。包括:
口 键值储存数据库:代表有 Redis、Voldemort 和 Oracle BDB 等
口 列存储数据库:代表有 Cassandra、Hbase 和 Riak 等。
口 文档型数据库:代表有 COUCHDB 和 Mongodb 等。
口 图形数据库:代表有 Neo4J、infogrid 和 Infinite Graph 等。
针对一些复杂应用,尤其是 app,请求不象在 chrome 的 console 里这么容易看见,这就须要抓包工具。
mitmproxy(mitmdump) 比 Charles 更强大的是爬虫软件开发,可以支持对接 Python 脚本去处理 resquest / response。
方案:Appium + mitmdump
做法:用 mitmdump 去窃听插口数据,用 Appium 去模拟 App 的操作。
好处:即可绕开复杂的插口参数又能实现自动化提升效率。
缺点:有一些 app,如微信朋友圈的数据又经过了一次加密造成难以解析,这种情况只能纯用 Appium 了。但是对于大多数 App 来说,此种方式是奏效的。
pyspide 框架有一些缺点,比如可配置化程度不高,异常处理能力有限等,它对于一些反爬程度特别强的网站的爬取变得力不从心。
所以这儿不多做介绍。
Scrapy 是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架。
Scrapy 包括:
Scrapy-Splash:一个 Scrapy 中支持 Javascript 渲染的工具。
Scrapy-Redis :Scrap 的分布式扩充模块。
Scrapyd :一个用于布署和运行 Scrapy 项目的工具。
Scrapyrt :为 Scrap 提供了一个调度的 HTTP 接口。
Gerapy :一个 Scrapy 分布式管理模块。
Scrapy 可对接:
Crawlspider : Scrap 提供的一个通用 Spider,我们可以指定一些爬取规则来实现页面的提取,
Splash / Selenium :自动化爬取
Docker
具体使用:待写
URI 的全称为 Uniform Resource Identifier,即统一资源标志符。
URL 的全称为 Universal Resource Locator,即统一资源定位符。
URN 的全称为 Universal Resource Name,即统一资源名称。

URI 可以进一步界定为URL、URN或二者兼具。URL 和 URN 都是 URI 子集。
URN 如同一个人的名称,而 URL 代表一个人的住址。换言之,URN 定义某事物的身分,而 URL 提供查找该事物的技巧。
现在常用的http网址,如 就是URL。
而用于标示惟一书目的 ISBN 系统, 如:isbn:0-486-27557-4 ,就是 URN 。
但是在目前的互联网中,URN 用得十分少,所以几乎所有的 URI 都是 URL。
Robots 协议也叫做爬虫协议、机器人合同,它的全名叫作网路爬虫排除标准(Robots Exclusion Protocol),用来告诉爬虫和搜索引擎什么页面可以抓取,哪些不可以抓取。它一般是一个叫作robots.txt 的文本文件,一般置于网站的根目录下。
当搜索爬虫访问一个站点时,它首先会检测这个站点根目录下是否存在 robots.txt 文件,如果存在搜索爬虫会按照其中定义的爬取范围来爬取。如果没有找到这个文件爬虫软件开发,搜索爬虫便会访问所有可直接访问的页面。
robotx.txt 需要置于网站根目录。
User-agent: *
Disallow: /
Allow: /public/
Disallow表示不容许爬的页面,Allow表示准许爬的页面,User-agent表示针对那个常用搜索引擎。
User-agent 为约定好的值,取值如下表:

1、测试环境
2、管理后台(如 cms)
3、其它
1、Google的 Robots.txt 规范。
2、站长工具的 robots文件生成 工具。
Xpath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中査找信息的语言。它最初是拿来搜救 XML 文档的,但是它同样适用于 HTML 文档的搜索。
Xpath 的选择功能非常强悍,它提供了十分简约明了的路径选择表达式。另外,它还提供了超过 100 个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等。
Xpath 于 1999 年 11 月 16 日成为 W3C 标准。
就好象 css 选择器。
可以使用 Tesseract ,它是 Python 的一个 OCR 识别库。
市面上用的最多的是这家提供的滑动验证码: ,如 bilibili。
可以用自动化库,如 Selenium 模拟滑动(注意人去滑动按键是先快后慢)。
解决思路:模板匹配+模拟拖动
还有一个专门提供点触验证码服务的站点 Touclick,例如 12306 网站。
上面说的第四个:点触验证码,应该是最难辨识的了。
但互联网上有好多验证码服务平台,平台 7×24 小时提供验证码辨识服务,一张图片几秒都会获得辨识结果,准确率可达 90%以上。
个人比较推荐的一个平台是超级鹰,其官网为 。其提供的服务种类十分广泛,可辨识的验证码类型特别多,其中就包括点触验证码。
ロ FTP 代理服务器:主要用于访问 FTP 服务器,一般有上传、下载以及缓存功能,端口通常为 21、2121 等。
ロ HTP 代理服务器:主要用于访问网页,一般有内容过滤和缓存功能,端口通常为 80、8080、3128等。
口 SSL/TLS代理:主要用于访问加密网站,一般有SSL或TLS加密功能(最高支持 128 位加密硬度),端口通常为 443。
口 RTSP 代理:主要用于访问 Real 流媒体服务器,一般有缓存功能,端口通常为 554。
口 Telnet 代理:主要用于 telnet 远程控制(黑客入侵计算机时常用于隐藏身份),端口通常为 23。
口 POP3 SMTP 代理:主要用于 POP3 SMTP 方式收发短信,一般有缓存功能,端口通常为 11025 。
口 SOCKS 代理:只是单纯传递数据包,不关心具体合同和用法,所以速度快好多,一般有缓存功能,端口通常为 1080。SOCKS 代理合同又分为 SOCKS4 和 SOCKS5,前者只支持 TCP,而后者支持 TCP 和 UDP,还支持各类身分验证机制、服务器端域名解析等。简单来说,SOCKS4 能做到的 SOCKS5 都可以做到,但 SOCKS5 能做到的 SOCKS4 不一定能做到。
口 高度匿名代理:会将数据包原封不动地转发,在服务端看来就似乎真的是一个普通客户端在访问,而记录的 IP 是代理服务器的 IP。
ロ 普通匿名代理:会在数据包上做一些改动,服务端上有可能发觉这是个代理服务器,也有一定概率彻查到客户端的真实 IP。代理服务器一般会加入的 HTIP 头有 HTTPVIA 和 HTTPXFORWARDEDFOR。
口 透明代理:不但改动了数据包,还会告诉服务器客户端的真实 IP。这种代理不仅能用缓存技术提升浏览速率,能用内容过滤提升安全性之外,并无其他明显作用,最常见的事例是外网中的硬件防火墙。
口 间谍代理:指组织或个人创建的用于记录用户传输的数据,然后进行研究、监控等目的的代理服务器。
网站上会有很多免费代理,比如南刺: 。但是这种免费代理大多数情况下都是不好用的,所以比较靠谱的方式是订购付费代理。
1、提供插口获取海量代理,按天或则按时收费,如讯代理;
如果信赖讯代理的话,我们也可以不做代理池筛选,直接使用代理。不过我个人还是推荐使用代理池筛选,以提升代理可用机率。自己再做一次筛选,以确保代理可用。
2、搭建了代理隧洞,直接设置固定域名代理,如阿布云代理。云代理在云端维护一个全局 IP 池供代理隧洞使用,池中的 IP 会不间断更新。代理隧洞,配置简单,代理速率快且十分稳定。
等于帮你做了一个云端的代理池,不用自己实现了。
需要注意的是,代理 IP 池中部份 IP 可能会在当日重复出现多次。
3、ADSL 拨号代理
ADSL (Asymmetric Digital Subscriber Line,非对称数字用户支路),它的上行和下行带宽不对称,它采用频分复用技术把普通的电话线分成了电话、上行和下行 3 个相对独立的信道,从而防止了互相之间的干扰。
我们借助了 ADSL 通过拔号的形式上网,需要输入 ADSL 账号和密码,每次拔号就更换一个 IP 这个特点。
所以我们可以先订购一台动态拔号 VPS 主机,这样的主机服务商相当多。在这里使用了云立方,官方网站:
代理不论是免费的还是付费的,都不能保证都是可用的,因为:
1、此 IP 可能被其他人使用来爬取同样的目标站点而被封禁。
2、代理服务器忽然发生故障。
3、网络忙碌。
4、购买的代理到期。
5、等等
所以,我们须要提早做筛选,将不可用的代理剔除掉,保留可用代理。这就须要代理池,来获取随机可用的代理。

代理池分为 4 个模块: 存储模块、获取模块、检测模块、接口模块。
口 存储模块使用 Redis 的有序集合,用来做代理的去重和状态标示,同时它也是中心模块和基础模块,将其他模块串联上去。
口 获取模块定时从代理网站获取代理,将获取的代理传递给储存模块,并保存到数据库。
口 检测模块定时通过储存模块获取所有代理,并对代理进行检查,根据不同的测量结果对代理设置不同的标示。
口 接口模块通过WebAPI 提供服务插口,接口通过联接数据库并通过Web 形式返回可用的代理。
对于这儿的测量模块,建议使用 aiohttp 而不是 requests,原因是:
对于响应速率比较快的网站来说,requests 同步恳求和 aiohttp 异步恳求的疗效差别没这么大。但对于测量代理来说,检测一个代理通常须要十多秒甚至几十秒的时间,这时候使用 aiohttp 异步恳求库的优势就大大彰显下来了,效率可能会提升几十倍不止。
(1)有的数据必须要登陆能够抓取。
(2)有时候,登录帐号也可以减少被封禁的几率。
做大规模抓取,我们就须要拥有好多帐号,每次恳求随机选定一个帐号,这样就减少了单个帐号的访问颍率,被封的机率又会大大增加。
所以,我们可以维护一个登陆用的 Cookies 池。
架构跟代理池一样。可参考上文。
待写
python 的 open() 支持的模式可以是只读/写入/追加,也是可以它们的组合型,具体如下:
模式描述
r
以只读方法打开文件。文件的表针将会放到文件的开头。这是默认模式。
rb
以二进制格式打开一个文件用于只读。文件表针将会放到文件的开头。这是默认模式。
r+
打开一个文件用于读写。文件表针将会放到文件的开头。
rb+
以二进制格式打开一个文件用于读写。文件表针将会放到文件的开头。
w
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a
打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。也就是说,新的内容将会被写入到已有内容然后。如果该文件不存在,创建新文件进行写入。
ab
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。也就是说,新的内容将会被写入到已有内容然后。如果该文件不存在,创建新文件进行写入。
a+
打开一个文件用于读写。如果该文件已存在,文件指针将会放到文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。如果该文件不存在,创建新文件用于读写。
1、r+ 和 w+ 都是读写,有哪些区别?
答:前者是假如没有找到文件则抛错,后者是假如没有找到文件则手动创建文件。
2、a 可以看成是 w 的变种,附加上了”追加内容“的特点。
一般调用 open() 的时侯还须要再调用 close()。 python 提供了一种缩写方式,那就是使用 with as 语法。在 with 控制块结束时,文件会手动关掉,不需要 close() 了。调用写法如下:
Python爬虫代理池
采集交流 • 优采云 发表了文章 • 0 个评论 • 312 次浏览 • 2020-05-09 08:01
在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫领到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源下来。不过呢,闲暇时间手痒,所以就想借助一些免费的资源搞一个简单的代理池服务。
1、问题
代理IP从何而至?
刚自学爬虫的时侯没有代理IP就去西刺、快代理之类有免费代理的网站去爬爬虫代理软件,还是有某些代理能用。当然,如果你有更好的代理插口也可以自己接入。
免费代理的采集也很简单,无非就是:访问页面页面 —> 正则/xpath提取 —> 保存
如何保证代理质量?
可以肯定免费的代理IP大部分都是不能用的,不然他人为何还提供付费的(不过事实是好多代理商的付费IP也不稳定,也有好多是不能用)。所以采集回来的代理IP不能直接使用,可以写检查程序不断的去用这种代理访问一个稳定的网站,看是否可以正常使用。这个过程可以使用多线程或异步的方法,因为测量代理是个太慢的过程。
采集回来的代理怎么储存?
这里不得不推荐一个高性能支持多种数据结构的NoSQL数据库SSDB,用于代理Redis。支持队列、hash、set、k-v对,支持T级别数据。是做分布式爬虫挺好中间储存工具。
如何使爬虫更简单的使用这种代理?
答案肯定是弄成服务咯,python有这么多的web框架,随便拿一个来写个api供爬虫调用。这样有很多用处,比如:当爬虫发现代理不能使用可以主动通过api去delete代理IP,当爬虫发现代理池IP不够用时可以主动去refresh代理池。这样比检查程序愈加靠谱。
2、代理池设计
代理池由四部份组成:
ProxyGetter:
代理获取插口,目前有5个免费代理源,每调用一次都会抓取这个5个网站的最新代理装入DB,可自行添加额外的代理获取插口;
DB:
用于储存代理IP,现在暂时只支持SSDB。至于为何选择SSDB,大家可以参考这篇文章,个人认为SSDB是个不错的Redis取代方案,如果你没有用过SSDB,安装上去也很简单,可以参考这儿;
Schedule:
计划任务用户定时去检查DB中的代理可用性,删除不可用的代理。同时也会主动通过ProxyGetter去获取最新代理装入DB;
ProxyApi:
代理池的外部插口,由于现今如此代理池功能比较简单,花两个小时看了下Flask,愉快的决定用Flask搞定。功能是给爬虫提供get/delete/refresh等插口,方便爬虫直接使用。
3、代码模块
Python中高层次的数据结构,动态类型和动态绑定,使得它特别适合于快速应用开发,也适合于作为胶带语言联接已有的软件部件。用Python来搞这个代理IP池也很简单,代码分为6个模块:
Api:
api插口相关代码,目前api是由Flask实现,代码也十分简单。客户端恳求传给Flask,Flask调用ProxyManager中的实现,包括get/delete/refresh/get_all;
DB:
数据库相关代码,目前数据库是采用SSDB。代码用工厂模式实现,方便日后扩充其他类型数据库;
Manager:
get/delete/refresh/get_all等插口的具体实现类,目前代理池只负责管理proxy,日后可能会有更多功能,比如代理和爬虫的绑定,代理和帐号的绑定等等;
ProxyGetter:
代理获取的相关代码,目前抓取了快代理、代理66、有代理、西刺代理、guobanjia这个五个网站的免费代理,经测试这个5个网站每天更新的可用代理只有六七十个,当然也支持自己扩充代理插口;
Schedule:
定时任务相关代码,现在只是实现定时去刷新代码,并验证可用代理,采用多进程形式;
Util:
存放一些公共的模块方式或函数爬虫代理软件,包含GetConfig:读取配置文件config.ini的类,ConfigParse: 集成重画ConfigParser的类,使其对大小写敏感, Singleton:实现单例,LazyProperty:实现类属性惰性估算。等等;
其他文件:
配置文件:Config.ini,数据库配置和代理获取插口配置,可以在GetFreeProxy中添加新的代理获取方式,并在Config.ini中注册即可使用;
4、安装
下载代码:
安装依赖:
pip install -r requirements.txt
启动:
5、使用
定时任务启动后,会通过代理获取方式fetch所有代理装入数据库并验证。此后默认每20分钟会重复执行一次。定时任务启动大约一两分钟后,便可在SSDB中见到刷新下来的可用的代理:
启动ProxyApi.py后即可在浏览器中使用插口获取代理,一下是浏览器中的截图:
index页面:
get页面:
get_all页面:
爬虫中使用,如果要在爬虫代码中使用的话, 可以将此api封装成函数直接使用,例如:
6、最后 查看全部

在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫领到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源下来。不过呢,闲暇时间手痒,所以就想借助一些免费的资源搞一个简单的代理池服务。

1、问题
代理IP从何而至?
刚自学爬虫的时侯没有代理IP就去西刺、快代理之类有免费代理的网站去爬爬虫代理软件,还是有某些代理能用。当然,如果你有更好的代理插口也可以自己接入。
免费代理的采集也很简单,无非就是:访问页面页面 —> 正则/xpath提取 —> 保存
如何保证代理质量?
可以肯定免费的代理IP大部分都是不能用的,不然他人为何还提供付费的(不过事实是好多代理商的付费IP也不稳定,也有好多是不能用)。所以采集回来的代理IP不能直接使用,可以写检查程序不断的去用这种代理访问一个稳定的网站,看是否可以正常使用。这个过程可以使用多线程或异步的方法,因为测量代理是个太慢的过程。
采集回来的代理怎么储存?
这里不得不推荐一个高性能支持多种数据结构的NoSQL数据库SSDB,用于代理Redis。支持队列、hash、set、k-v对,支持T级别数据。是做分布式爬虫挺好中间储存工具。
如何使爬虫更简单的使用这种代理?
答案肯定是弄成服务咯,python有这么多的web框架,随便拿一个来写个api供爬虫调用。这样有很多用处,比如:当爬虫发现代理不能使用可以主动通过api去delete代理IP,当爬虫发现代理池IP不够用时可以主动去refresh代理池。这样比检查程序愈加靠谱。
2、代理池设计
代理池由四部份组成:
ProxyGetter:
代理获取插口,目前有5个免费代理源,每调用一次都会抓取这个5个网站的最新代理装入DB,可自行添加额外的代理获取插口;
DB:
用于储存代理IP,现在暂时只支持SSDB。至于为何选择SSDB,大家可以参考这篇文章,个人认为SSDB是个不错的Redis取代方案,如果你没有用过SSDB,安装上去也很简单,可以参考这儿;
Schedule:
计划任务用户定时去检查DB中的代理可用性,删除不可用的代理。同时也会主动通过ProxyGetter去获取最新代理装入DB;
ProxyApi:
代理池的外部插口,由于现今如此代理池功能比较简单,花两个小时看了下Flask,愉快的决定用Flask搞定。功能是给爬虫提供get/delete/refresh等插口,方便爬虫直接使用。

3、代码模块
Python中高层次的数据结构,动态类型和动态绑定,使得它特别适合于快速应用开发,也适合于作为胶带语言联接已有的软件部件。用Python来搞这个代理IP池也很简单,代码分为6个模块:
Api:
api插口相关代码,目前api是由Flask实现,代码也十分简单。客户端恳求传给Flask,Flask调用ProxyManager中的实现,包括get/delete/refresh/get_all;
DB:
数据库相关代码,目前数据库是采用SSDB。代码用工厂模式实现,方便日后扩充其他类型数据库;
Manager:
get/delete/refresh/get_all等插口的具体实现类,目前代理池只负责管理proxy,日后可能会有更多功能,比如代理和爬虫的绑定,代理和帐号的绑定等等;
ProxyGetter:
代理获取的相关代码,目前抓取了快代理、代理66、有代理、西刺代理、guobanjia这个五个网站的免费代理,经测试这个5个网站每天更新的可用代理只有六七十个,当然也支持自己扩充代理插口;
Schedule:
定时任务相关代码,现在只是实现定时去刷新代码,并验证可用代理,采用多进程形式;
Util:
存放一些公共的模块方式或函数爬虫代理软件,包含GetConfig:读取配置文件config.ini的类,ConfigParse: 集成重画ConfigParser的类,使其对大小写敏感, Singleton:实现单例,LazyProperty:实现类属性惰性估算。等等;
其他文件:
配置文件:Config.ini,数据库配置和代理获取插口配置,可以在GetFreeProxy中添加新的代理获取方式,并在Config.ini中注册即可使用;
4、安装
下载代码:

安装依赖:
pip install -r requirements.txt
启动:

5、使用
定时任务启动后,会通过代理获取方式fetch所有代理装入数据库并验证。此后默认每20分钟会重复执行一次。定时任务启动大约一两分钟后,便可在SSDB中见到刷新下来的可用的代理:

启动ProxyApi.py后即可在浏览器中使用插口获取代理,一下是浏览器中的截图:
index页面:

get页面:

get_all页面:

爬虫中使用,如果要在爬虫代码中使用的话, 可以将此api封装成函数直接使用,例如:

6、最后
初探爬虫 ||《python 3 网络爬虫开发实践》读书笔记 | 小蒋不素小蒋
采集交流 • 优采云 发表了文章 • 0 个评论 • 376 次浏览 • 2020-06-24 08:02
从 Python3.5 版本开始,Python 中加入了 async/await。
接口抓取的缺点是抓不到 js 渲染后的页面,而下边介绍的模拟抓取能挺好的解决问题。
也就是可见即可爬。
Splash 是一个 javascript 渲染服务。它是一个带有 HTTP API 的轻量级 Web 浏览器。
Selenium 是一个自动化测试工具,利用它我们可以驱动测览器执行特定的动作,如点击、下拉等操作。
Selenium + Chrome Driver,可以驱动 Chrome 浏览器完成相应的操作。
Selenium + Phantoms,这样在运行的时侯就不会再弹出一个浏览器了。而且 Phantoms 的运行效率也很高。
Phantoms 是一个无界面的、可脚本编程的 Webkit 7 浏览器引擎。
Appium 是 App 版的 Selenium。
抓取网页代码以后,下一步就是从网页中提取信息。
正则是最原始的形式,写上去繁杂,可读性差。
lxml 是 Python 的一个解析库,支持 HTML 和 XML 的解析,支持 XPah 解析方法。
Beautiful Soup 的 HTML 和 XML 解析器是依赖于 lxml 库的,所以在此之前请确保早已成功安装好了 lxml。
Beautiful Soup提供好几个解析器:
pyquery 同样是一个强悍的网页解析工具,它提供了和 jquery 类似的句型来解析 HTML 文档。
推荐:
Beautiful Soup(lxml)。lxml 解析器有解析 HTML 和 XML 的功能,而且速度快,容错能力强。
如果本身就熟悉 css 和 jquery 的话,就推荐 pyquery。
NOSQL,全称 Not Only SQL,意为不仅仅是 SQL,泛指非关系型数据库。包括:
口 键值储存数据库:代表有 Redis、Voldemort 和 Oracle BDB 等
口 列存储数据库:代表有 Cassandra、Hbase 和 Riak 等。
口 文档型数据库:代表有 COUCHDB 和 Mongodb 等。
口 图形数据库:代表有 Neo4J、infogrid 和 Infinite Graph 等。
针对一些复杂应用,尤其是 app,请求不象在 chrome 的 console 里这么容易看见,这就须要抓包工具。
mitmproxy(mitmdump) 比 Charles 更强大的是爬虫软件开发,可以支持对接 Python 脚本去处理 resquest / response。
方案:Appium + mitmdump
做法:用 mitmdump 去窃听插口数据,用 Appium 去模拟 App 的操作。
好处:即可绕开复杂的插口参数又能实现自动化提升效率。
缺点:有一些 app,如微信朋友圈的数据又经过了一次加密造成难以解析,这种情况只能纯用 Appium 了。但是对于大多数 App 来说,此种方式是奏效的。
pyspide 框架有一些缺点,比如可配置化程度不高,异常处理能力有限等,它对于一些反爬程度特别强的网站的爬取变得力不从心。
所以这儿不多做介绍。
Scrapy 是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架。
Scrapy 包括:
Scrapy-Splash:一个 Scrapy 中支持 Javascript 渲染的工具。
Scrapy-Redis :Scrap 的分布式扩充模块。
Scrapyd :一个用于布署和运行 Scrapy 项目的工具。
Scrapyrt :为 Scrap 提供了一个调度的 HTTP 接口。
Gerapy :一个 Scrapy 分布式管理模块。
Scrapy 可对接:
Crawlspider : Scrap 提供的一个通用 Spider,我们可以指定一些爬取规则来实现页面的提取,
Splash / Selenium :自动化爬取
Docker
具体使用:待写
URI 的全称为 Uniform Resource Identifier,即统一资源标志符。
URL 的全称为 Universal Resource Locator,即统一资源定位符。
URN 的全称为 Universal Resource Name,即统一资源名称。
URI 可以进一步界定为URL、URN或二者兼具。URL 和 URN 都是 URI 子集。
URN 如同一个人的名称,而 URL 代表一个人的住址。换言之,URN 定义某事物的身分,而 URL 提供查找该事物的技巧。
现在常用的http网址,如 就是URL。
而用于标示惟一书目的 ISBN 系统, 如:isbn:0-486-27557-4 ,就是 URN 。
但是在目前的互联网中,URN 用得十分少,所以几乎所有的 URI 都是 URL。
Robots 协议也叫做爬虫协议、机器人合同,它的全名叫作网路爬虫排除标准(Robots Exclusion Protocol),用来告诉爬虫和搜索引擎什么页面可以抓取,哪些不可以抓取。它一般是一个叫作robots.txt 的文本文件,一般置于网站的根目录下。
当搜索爬虫访问一个站点时,它首先会检测这个站点根目录下是否存在 robots.txt 文件,如果存在搜索爬虫会按照其中定义的爬取范围来爬取。如果没有找到这个文件爬虫软件开发,搜索爬虫便会访问所有可直接访问的页面。
robotx.txt 需要置于网站根目录。
User-agent: *
Disallow: /
Allow: /public/
Disallow表示不容许爬的页面,Allow表示准许爬的页面,User-agent表示针对那个常用搜索引擎。
User-agent 为约定好的值,取值如下表:
1、测试环境
2、管理后台(如 cms)
3、其它
1、Google的 Robots.txt 规范。
2、站长工具的 robots文件生成 工具。
Xpath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中査找信息的语言。它最初是拿来搜救 XML 文档的,但是它同样适用于 HTML 文档的搜索。
Xpath 的选择功能非常强悍,它提供了十分简约明了的路径选择表达式。另外,它还提供了超过 100 个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等。
Xpath 于 1999 年 11 月 16 日成为 W3C 标准。
就好象 css 选择器。
可以使用 Tesseract ,它是 Python 的一个 OCR 识别库。
市面上用的最多的是这家提供的滑动验证码: ,如 bilibili。
可以用自动化库,如 Selenium 模拟滑动(注意人去滑动按键是先快后慢)。
解决思路:模板匹配+模拟拖动
还有一个专门提供点触验证码服务的站点 Touclick,例如 12306 网站。
上面说的第四个:点触验证码,应该是最难辨识的了。
但互联网上有好多验证码服务平台,平台 7×24 小时提供验证码辨识服务,一张图片几秒都会获得辨识结果,准确率可达 90%以上。
个人比较推荐的一个平台是超级鹰,其官网为 。其提供的服务种类十分广泛,可辨识的验证码类型特别多,其中就包括点触验证码。
ロ FTP 代理服务器:主要用于访问 FTP 服务器,一般有上传、下载以及缓存功能,端口通常为 21、2121 等。
ロ HTP 代理服务器:主要用于访问网页,一般有内容过滤和缓存功能,端口通常为 80、8080、3128等。
口 SSL/TLS代理:主要用于访问加密网站,一般有SSL或TLS加密功能(最高支持 128 位加密硬度),端口通常为 443。
口 RTSP 代理:主要用于访问 Real 流媒体服务器,一般有缓存功能,端口通常为 554。
口 Telnet 代理:主要用于 telnet 远程控制(黑客入侵计算机时常用于隐藏身份),端口通常为 23。
口 POP3 SMTP 代理:主要用于 POP3 SMTP 方式收发短信,一般有缓存功能,端口通常为 11025 。
口 SOCKS 代理:只是单纯传递数据包,不关心具体合同和用法,所以速度快好多,一般有缓存功能,端口通常为 1080。SOCKS 代理合同又分为 SOCKS4 和 SOCKS5,前者只支持 TCP,而后者支持 TCP 和 UDP,还支持各类身分验证机制、服务器端域名解析等。简单来说,SOCKS4 能做到的 SOCKS5 都可以做到,但 SOCKS5 能做到的 SOCKS4 不一定能做到。
口 高度匿名代理:会将数据包原封不动地转发,在服务端看来就似乎真的是一个普通客户端在访问,而记录的 IP 是代理服务器的 IP。
ロ 普通匿名代理:会在数据包上做一些改动,服务端上有可能发觉这是个代理服务器,也有一定概率彻查到客户端的真实 IP。代理服务器一般会加入的 HTIP 头有 HTTPVIA 和 HTTPXFORWARDEDFOR。
口 透明代理:不但改动了数据包,还会告诉服务器客户端的真实 IP。这种代理不仅能用缓存技术提升浏览速率,能用内容过滤提升安全性之外,并无其他明显作用,最常见的事例是外网中的硬件防火墙。
口 间谍代理:指组织或个人创建的用于记录用户传输的数据,然后进行研究、监控等目的的代理服务器。
网站上会有很多免费代理,比如南刺: 。但是这种免费代理大多数情况下都是不好用的,所以比较靠谱的方式是订购付费代理。
1、提供插口获取海量代理,按天或则按时收费,如讯代理;
如果信赖讯代理的话,我们也可以不做代理池筛选,直接使用代理。不过我个人还是推荐使用代理池筛选,以提升代理可用机率。自己再做一次筛选,以确保代理可用。
2、搭建了代理隧洞,直接设置固定域名代理,如阿布云代理。云代理在云端维护一个全局 IP 池供代理隧洞使用,池中的 IP 会不间断更新。代理隧洞,配置简单,代理速率快且十分稳定。
等于帮你做了一个云端的代理池,不用自己实现了。
需要注意的是,代理 IP 池中部份 IP 可能会在当日重复出现多次。
3、ADSL 拨号代理
ADSL (Asymmetric Digital Subscriber Line,非对称数字用户支路),它的上行和下行带宽不对称,它采用频分复用技术把普通的电话线分成了电话、上行和下行 3 个相对独立的信道,从而防止了互相之间的干扰。
我们借助了 ADSL 通过拔号的形式上网,需要输入 ADSL 账号和密码,每次拔号就更换一个 IP 这个特点。
所以我们可以先订购一台动态拔号 VPS 主机,这样的主机服务商相当多。在这里使用了云立方,官方网站:
代理不论是免费的还是付费的,都不能保证都是可用的,因为:
1、此 IP 可能被其他人使用来爬取同样的目标站点而被封禁。
2、代理服务器忽然发生故障。
3、网络忙碌。
4、购买的代理到期。
5、等等
所以,我们须要提早做筛选,将不可用的代理剔除掉,保留可用代理。这就须要代理池,来获取随机可用的代理。
代理池分为 4 个模块: 存储模块、获取模块、检测模块、接口模块。
口 存储模块使用 Redis 的有序集合,用来做代理的去重和状态标示,同时它也是中心模块和基础模块,将其他模块串联上去。
口 获取模块定时从代理网站获取代理,将获取的代理传递给储存模块,并保存到数据库。
口 检测模块定时通过储存模块获取所有代理,并对代理进行检查,根据不同的测量结果对代理设置不同的标示。
口 接口模块通过WebAPI 提供服务插口,接口通过联接数据库并通过Web 形式返回可用的代理。
对于这儿的测量模块,建议使用 aiohttp 而不是 requests,原因是:
对于响应速率比较快的网站来说,requests 同步恳求和 aiohttp 异步恳求的疗效差别没这么大。但对于测量代理来说,检测一个代理通常须要十多秒甚至几十秒的时间,这时候使用 aiohttp 异步恳求库的优势就大大彰显下来了,效率可能会提升几十倍不止。
(1)有的数据必须要登陆能够抓取。
(2)有时候,登录帐号也可以减少被封禁的几率。
做大规模抓取,我们就须要拥有好多帐号,每次恳求随机选定一个帐号,这样就减少了单个帐号的访问颍率,被封的机率又会大大增加。
所以,我们可以维护一个登陆用的 Cookies 池。
架构跟代理池一样。可参考上文。
待写
python 的 open() 支持的模式可以是只读/写入/追加,也是可以它们的组合型,具体如下:
模式描述
r
以只读方法打开文件。文件的表针将会放到文件的开头。这是默认模式。
rb
以二进制格式打开一个文件用于只读。文件表针将会放到文件的开头。这是默认模式。
r+
打开一个文件用于读写。文件表针将会放到文件的开头。
rb+
以二进制格式打开一个文件用于读写。文件表针将会放到文件的开头。
w
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a
打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。也就是说,新的内容将会被写入到已有内容然后。如果该文件不存在,创建新文件进行写入。
ab
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。也就是说,新的内容将会被写入到已有内容然后。如果该文件不存在,创建新文件进行写入。
a+
打开一个文件用于读写。如果该文件已存在,文件指针将会放到文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。如果该文件不存在,创建新文件用于读写。
1、r+ 和 w+ 都是读写,有哪些区别?
答:前者是假如没有找到文件则抛错,后者是假如没有找到文件则手动创建文件。
2、a 可以看成是 w 的变种,附加上了”追加内容“的特点。
一般调用 open() 的时侯还须要再调用 close()。 python 提供了一种缩写方式,那就是使用 with as 语法。在 with 控制块结束时,文件会手动关掉,不需要 close() 了。调用写法如下: 查看全部

从 Python3.5 版本开始,Python 中加入了 async/await。
接口抓取的缺点是抓不到 js 渲染后的页面,而下边介绍的模拟抓取能挺好的解决问题。
也就是可见即可爬。
Splash 是一个 javascript 渲染服务。它是一个带有 HTTP API 的轻量级 Web 浏览器。
Selenium 是一个自动化测试工具,利用它我们可以驱动测览器执行特定的动作,如点击、下拉等操作。
Selenium + Chrome Driver,可以驱动 Chrome 浏览器完成相应的操作。
Selenium + Phantoms,这样在运行的时侯就不会再弹出一个浏览器了。而且 Phantoms 的运行效率也很高。
Phantoms 是一个无界面的、可脚本编程的 Webkit 7 浏览器引擎。
Appium 是 App 版的 Selenium。
抓取网页代码以后,下一步就是从网页中提取信息。
正则是最原始的形式,写上去繁杂,可读性差。
lxml 是 Python 的一个解析库,支持 HTML 和 XML 的解析,支持 XPah 解析方法。
Beautiful Soup 的 HTML 和 XML 解析器是依赖于 lxml 库的,所以在此之前请确保早已成功安装好了 lxml。
Beautiful Soup提供好几个解析器:

pyquery 同样是一个强悍的网页解析工具,它提供了和 jquery 类似的句型来解析 HTML 文档。
推荐:
Beautiful Soup(lxml)。lxml 解析器有解析 HTML 和 XML 的功能,而且速度快,容错能力强。
如果本身就熟悉 css 和 jquery 的话,就推荐 pyquery。
NOSQL,全称 Not Only SQL,意为不仅仅是 SQL,泛指非关系型数据库。包括:
口 键值储存数据库:代表有 Redis、Voldemort 和 Oracle BDB 等
口 列存储数据库:代表有 Cassandra、Hbase 和 Riak 等。
口 文档型数据库:代表有 COUCHDB 和 Mongodb 等。
口 图形数据库:代表有 Neo4J、infogrid 和 Infinite Graph 等。
针对一些复杂应用,尤其是 app,请求不象在 chrome 的 console 里这么容易看见,这就须要抓包工具。
mitmproxy(mitmdump) 比 Charles 更强大的是爬虫软件开发,可以支持对接 Python 脚本去处理 resquest / response。
方案:Appium + mitmdump
做法:用 mitmdump 去窃听插口数据,用 Appium 去模拟 App 的操作。
好处:即可绕开复杂的插口参数又能实现自动化提升效率。
缺点:有一些 app,如微信朋友圈的数据又经过了一次加密造成难以解析,这种情况只能纯用 Appium 了。但是对于大多数 App 来说,此种方式是奏效的。
pyspide 框架有一些缺点,比如可配置化程度不高,异常处理能力有限等,它对于一些反爬程度特别强的网站的爬取变得力不从心。
所以这儿不多做介绍。
Scrapy 是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架。
Scrapy 包括:
Scrapy-Splash:一个 Scrapy 中支持 Javascript 渲染的工具。
Scrapy-Redis :Scrap 的分布式扩充模块。
Scrapyd :一个用于布署和运行 Scrapy 项目的工具。
Scrapyrt :为 Scrap 提供了一个调度的 HTTP 接口。
Gerapy :一个 Scrapy 分布式管理模块。
Scrapy 可对接:
Crawlspider : Scrap 提供的一个通用 Spider,我们可以指定一些爬取规则来实现页面的提取,
Splash / Selenium :自动化爬取
Docker
具体使用:待写
URI 的全称为 Uniform Resource Identifier,即统一资源标志符。
URL 的全称为 Universal Resource Locator,即统一资源定位符。
URN 的全称为 Universal Resource Name,即统一资源名称。

URI 可以进一步界定为URL、URN或二者兼具。URL 和 URN 都是 URI 子集。
URN 如同一个人的名称,而 URL 代表一个人的住址。换言之,URN 定义某事物的身分,而 URL 提供查找该事物的技巧。
现在常用的http网址,如 就是URL。
而用于标示惟一书目的 ISBN 系统, 如:isbn:0-486-27557-4 ,就是 URN 。
但是在目前的互联网中,URN 用得十分少,所以几乎所有的 URI 都是 URL。
Robots 协议也叫做爬虫协议、机器人合同,它的全名叫作网路爬虫排除标准(Robots Exclusion Protocol),用来告诉爬虫和搜索引擎什么页面可以抓取,哪些不可以抓取。它一般是一个叫作robots.txt 的文本文件,一般置于网站的根目录下。
当搜索爬虫访问一个站点时,它首先会检测这个站点根目录下是否存在 robots.txt 文件,如果存在搜索爬虫会按照其中定义的爬取范围来爬取。如果没有找到这个文件爬虫软件开发,搜索爬虫便会访问所有可直接访问的页面。
robotx.txt 需要置于网站根目录。
User-agent: *
Disallow: /
Allow: /public/
Disallow表示不容许爬的页面,Allow表示准许爬的页面,User-agent表示针对那个常用搜索引擎。
User-agent 为约定好的值,取值如下表:

1、测试环境
2、管理后台(如 cms)
3、其它
1、Google的 Robots.txt 规范。
2、站长工具的 robots文件生成 工具。
Xpath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中査找信息的语言。它最初是拿来搜救 XML 文档的,但是它同样适用于 HTML 文档的搜索。
Xpath 的选择功能非常强悍,它提供了十分简约明了的路径选择表达式。另外,它还提供了超过 100 个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等。
Xpath 于 1999 年 11 月 16 日成为 W3C 标准。
就好象 css 选择器。
可以使用 Tesseract ,它是 Python 的一个 OCR 识别库。
市面上用的最多的是这家提供的滑动验证码: ,如 bilibili。
可以用自动化库,如 Selenium 模拟滑动(注意人去滑动按键是先快后慢)。
解决思路:模板匹配+模拟拖动
还有一个专门提供点触验证码服务的站点 Touclick,例如 12306 网站。
上面说的第四个:点触验证码,应该是最难辨识的了。
但互联网上有好多验证码服务平台,平台 7×24 小时提供验证码辨识服务,一张图片几秒都会获得辨识结果,准确率可达 90%以上。
个人比较推荐的一个平台是超级鹰,其官网为 。其提供的服务种类十分广泛,可辨识的验证码类型特别多,其中就包括点触验证码。
ロ FTP 代理服务器:主要用于访问 FTP 服务器,一般有上传、下载以及缓存功能,端口通常为 21、2121 等。
ロ HTP 代理服务器:主要用于访问网页,一般有内容过滤和缓存功能,端口通常为 80、8080、3128等。
口 SSL/TLS代理:主要用于访问加密网站,一般有SSL或TLS加密功能(最高支持 128 位加密硬度),端口通常为 443。
口 RTSP 代理:主要用于访问 Real 流媒体服务器,一般有缓存功能,端口通常为 554。
口 Telnet 代理:主要用于 telnet 远程控制(黑客入侵计算机时常用于隐藏身份),端口通常为 23。
口 POP3 SMTP 代理:主要用于 POP3 SMTP 方式收发短信,一般有缓存功能,端口通常为 11025 。
口 SOCKS 代理:只是单纯传递数据包,不关心具体合同和用法,所以速度快好多,一般有缓存功能,端口通常为 1080。SOCKS 代理合同又分为 SOCKS4 和 SOCKS5,前者只支持 TCP,而后者支持 TCP 和 UDP,还支持各类身分验证机制、服务器端域名解析等。简单来说,SOCKS4 能做到的 SOCKS5 都可以做到,但 SOCKS5 能做到的 SOCKS4 不一定能做到。
口 高度匿名代理:会将数据包原封不动地转发,在服务端看来就似乎真的是一个普通客户端在访问,而记录的 IP 是代理服务器的 IP。
ロ 普通匿名代理:会在数据包上做一些改动,服务端上有可能发觉这是个代理服务器,也有一定概率彻查到客户端的真实 IP。代理服务器一般会加入的 HTIP 头有 HTTPVIA 和 HTTPXFORWARDEDFOR。
口 透明代理:不但改动了数据包,还会告诉服务器客户端的真实 IP。这种代理不仅能用缓存技术提升浏览速率,能用内容过滤提升安全性之外,并无其他明显作用,最常见的事例是外网中的硬件防火墙。
口 间谍代理:指组织或个人创建的用于记录用户传输的数据,然后进行研究、监控等目的的代理服务器。
网站上会有很多免费代理,比如南刺: 。但是这种免费代理大多数情况下都是不好用的,所以比较靠谱的方式是订购付费代理。
1、提供插口获取海量代理,按天或则按时收费,如讯代理;
如果信赖讯代理的话,我们也可以不做代理池筛选,直接使用代理。不过我个人还是推荐使用代理池筛选,以提升代理可用机率。自己再做一次筛选,以确保代理可用。
2、搭建了代理隧洞,直接设置固定域名代理,如阿布云代理。云代理在云端维护一个全局 IP 池供代理隧洞使用,池中的 IP 会不间断更新。代理隧洞,配置简单,代理速率快且十分稳定。
等于帮你做了一个云端的代理池,不用自己实现了。
需要注意的是,代理 IP 池中部份 IP 可能会在当日重复出现多次。
3、ADSL 拨号代理
ADSL (Asymmetric Digital Subscriber Line,非对称数字用户支路),它的上行和下行带宽不对称,它采用频分复用技术把普通的电话线分成了电话、上行和下行 3 个相对独立的信道,从而防止了互相之间的干扰。
我们借助了 ADSL 通过拔号的形式上网,需要输入 ADSL 账号和密码,每次拔号就更换一个 IP 这个特点。
所以我们可以先订购一台动态拔号 VPS 主机,这样的主机服务商相当多。在这里使用了云立方,官方网站:
代理不论是免费的还是付费的,都不能保证都是可用的,因为:
1、此 IP 可能被其他人使用来爬取同样的目标站点而被封禁。
2、代理服务器忽然发生故障。
3、网络忙碌。
4、购买的代理到期。
5、等等
所以,我们须要提早做筛选,将不可用的代理剔除掉,保留可用代理。这就须要代理池,来获取随机可用的代理。

代理池分为 4 个模块: 存储模块、获取模块、检测模块、接口模块。
口 存储模块使用 Redis 的有序集合,用来做代理的去重和状态标示,同时它也是中心模块和基础模块,将其他模块串联上去。
口 获取模块定时从代理网站获取代理,将获取的代理传递给储存模块,并保存到数据库。
口 检测模块定时通过储存模块获取所有代理,并对代理进行检查,根据不同的测量结果对代理设置不同的标示。
口 接口模块通过WebAPI 提供服务插口,接口通过联接数据库并通过Web 形式返回可用的代理。
对于这儿的测量模块,建议使用 aiohttp 而不是 requests,原因是:
对于响应速率比较快的网站来说,requests 同步恳求和 aiohttp 异步恳求的疗效差别没这么大。但对于测量代理来说,检测一个代理通常须要十多秒甚至几十秒的时间,这时候使用 aiohttp 异步恳求库的优势就大大彰显下来了,效率可能会提升几十倍不止。
(1)有的数据必须要登陆能够抓取。
(2)有时候,登录帐号也可以减少被封禁的几率。
做大规模抓取,我们就须要拥有好多帐号,每次恳求随机选定一个帐号,这样就减少了单个帐号的访问颍率,被封的机率又会大大增加。
所以,我们可以维护一个登陆用的 Cookies 池。
架构跟代理池一样。可参考上文。
待写
python 的 open() 支持的模式可以是只读/写入/追加,也是可以它们的组合型,具体如下:
模式描述
r
以只读方法打开文件。文件的表针将会放到文件的开头。这是默认模式。
rb
以二进制格式打开一个文件用于只读。文件表针将会放到文件的开头。这是默认模式。
r+
打开一个文件用于读写。文件表针将会放到文件的开头。
rb+
以二进制格式打开一个文件用于读写。文件表针将会放到文件的开头。
w
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a
打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。也就是说,新的内容将会被写入到已有内容然后。如果该文件不存在,创建新文件进行写入。
ab
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。也就是说,新的内容将会被写入到已有内容然后。如果该文件不存在,创建新文件进行写入。
a+
打开一个文件用于读写。如果该文件已存在,文件指针将会放到文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放到文件的结尾。如果该文件不存在,创建新文件用于读写。
1、r+ 和 w+ 都是读写,有哪些区别?
答:前者是假如没有找到文件则抛错,后者是假如没有找到文件则手动创建文件。
2、a 可以看成是 w 的变种,附加上了”追加内容“的特点。
一般调用 open() 的时侯还须要再调用 close()。 python 提供了一种缩写方式,那就是使用 with as 语法。在 with 控制块结束时,文件会手动关掉,不需要 close() 了。调用写法如下:
Python爬虫代理池
采集交流 • 优采云 发表了文章 • 0 个评论 • 312 次浏览 • 2020-05-09 08:01
在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫领到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源下来。不过呢,闲暇时间手痒,所以就想借助一些免费的资源搞一个简单的代理池服务。
1、问题
代理IP从何而至?
刚自学爬虫的时侯没有代理IP就去西刺、快代理之类有免费代理的网站去爬爬虫代理软件,还是有某些代理能用。当然,如果你有更好的代理插口也可以自己接入。
免费代理的采集也很简单,无非就是:访问页面页面 —> 正则/xpath提取 —> 保存
如何保证代理质量?
可以肯定免费的代理IP大部分都是不能用的,不然他人为何还提供付费的(不过事实是好多代理商的付费IP也不稳定,也有好多是不能用)。所以采集回来的代理IP不能直接使用,可以写检查程序不断的去用这种代理访问一个稳定的网站,看是否可以正常使用。这个过程可以使用多线程或异步的方法,因为测量代理是个太慢的过程。
采集回来的代理怎么储存?
这里不得不推荐一个高性能支持多种数据结构的NoSQL数据库SSDB,用于代理Redis。支持队列、hash、set、k-v对,支持T级别数据。是做分布式爬虫挺好中间储存工具。
如何使爬虫更简单的使用这种代理?
答案肯定是弄成服务咯,python有这么多的web框架,随便拿一个来写个api供爬虫调用。这样有很多用处,比如:当爬虫发现代理不能使用可以主动通过api去delete代理IP,当爬虫发现代理池IP不够用时可以主动去refresh代理池。这样比检查程序愈加靠谱。
2、代理池设计
代理池由四部份组成:
ProxyGetter:
代理获取插口,目前有5个免费代理源,每调用一次都会抓取这个5个网站的最新代理装入DB,可自行添加额外的代理获取插口;
DB:
用于储存代理IP,现在暂时只支持SSDB。至于为何选择SSDB,大家可以参考这篇文章,个人认为SSDB是个不错的Redis取代方案,如果你没有用过SSDB,安装上去也很简单,可以参考这儿;
Schedule:
计划任务用户定时去检查DB中的代理可用性,删除不可用的代理。同时也会主动通过ProxyGetter去获取最新代理装入DB;
ProxyApi:
代理池的外部插口,由于现今如此代理池功能比较简单,花两个小时看了下Flask,愉快的决定用Flask搞定。功能是给爬虫提供get/delete/refresh等插口,方便爬虫直接使用。
3、代码模块
Python中高层次的数据结构,动态类型和动态绑定,使得它特别适合于快速应用开发,也适合于作为胶带语言联接已有的软件部件。用Python来搞这个代理IP池也很简单,代码分为6个模块:
Api:
api插口相关代码,目前api是由Flask实现,代码也十分简单。客户端恳求传给Flask,Flask调用ProxyManager中的实现,包括get/delete/refresh/get_all;
DB:
数据库相关代码,目前数据库是采用SSDB。代码用工厂模式实现,方便日后扩充其他类型数据库;
Manager:
get/delete/refresh/get_all等插口的具体实现类,目前代理池只负责管理proxy,日后可能会有更多功能,比如代理和爬虫的绑定,代理和帐号的绑定等等;
ProxyGetter:
代理获取的相关代码,目前抓取了快代理、代理66、有代理、西刺代理、guobanjia这个五个网站的免费代理,经测试这个5个网站每天更新的可用代理只有六七十个,当然也支持自己扩充代理插口;
Schedule:
定时任务相关代码,现在只是实现定时去刷新代码,并验证可用代理,采用多进程形式;
Util:
存放一些公共的模块方式或函数爬虫代理软件,包含GetConfig:读取配置文件config.ini的类,ConfigParse: 集成重画ConfigParser的类,使其对大小写敏感, Singleton:实现单例,LazyProperty:实现类属性惰性估算。等等;
其他文件:
配置文件:Config.ini,数据库配置和代理获取插口配置,可以在GetFreeProxy中添加新的代理获取方式,并在Config.ini中注册即可使用;
4、安装
下载代码:
安装依赖:
pip install -r requirements.txt
启动:
5、使用
定时任务启动后,会通过代理获取方式fetch所有代理装入数据库并验证。此后默认每20分钟会重复执行一次。定时任务启动大约一两分钟后,便可在SSDB中见到刷新下来的可用的代理:
启动ProxyApi.py后即可在浏览器中使用插口获取代理,一下是浏览器中的截图:
index页面:
get页面:
get_all页面:
爬虫中使用,如果要在爬虫代码中使用的话, 可以将此api封装成函数直接使用,例如:
6、最后 查看全部

在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫领到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源下来。不过呢,闲暇时间手痒,所以就想借助一些免费的资源搞一个简单的代理池服务。

1、问题
代理IP从何而至?
刚自学爬虫的时侯没有代理IP就去西刺、快代理之类有免费代理的网站去爬爬虫代理软件,还是有某些代理能用。当然,如果你有更好的代理插口也可以自己接入。
免费代理的采集也很简单,无非就是:访问页面页面 —> 正则/xpath提取 —> 保存
如何保证代理质量?
可以肯定免费的代理IP大部分都是不能用的,不然他人为何还提供付费的(不过事实是好多代理商的付费IP也不稳定,也有好多是不能用)。所以采集回来的代理IP不能直接使用,可以写检查程序不断的去用这种代理访问一个稳定的网站,看是否可以正常使用。这个过程可以使用多线程或异步的方法,因为测量代理是个太慢的过程。
采集回来的代理怎么储存?
这里不得不推荐一个高性能支持多种数据结构的NoSQL数据库SSDB,用于代理Redis。支持队列、hash、set、k-v对,支持T级别数据。是做分布式爬虫挺好中间储存工具。
如何使爬虫更简单的使用这种代理?
答案肯定是弄成服务咯,python有这么多的web框架,随便拿一个来写个api供爬虫调用。这样有很多用处,比如:当爬虫发现代理不能使用可以主动通过api去delete代理IP,当爬虫发现代理池IP不够用时可以主动去refresh代理池。这样比检查程序愈加靠谱。
2、代理池设计
代理池由四部份组成:
ProxyGetter:
代理获取插口,目前有5个免费代理源,每调用一次都会抓取这个5个网站的最新代理装入DB,可自行添加额外的代理获取插口;
DB:
用于储存代理IP,现在暂时只支持SSDB。至于为何选择SSDB,大家可以参考这篇文章,个人认为SSDB是个不错的Redis取代方案,如果你没有用过SSDB,安装上去也很简单,可以参考这儿;
Schedule:
计划任务用户定时去检查DB中的代理可用性,删除不可用的代理。同时也会主动通过ProxyGetter去获取最新代理装入DB;
ProxyApi:
代理池的外部插口,由于现今如此代理池功能比较简单,花两个小时看了下Flask,愉快的决定用Flask搞定。功能是给爬虫提供get/delete/refresh等插口,方便爬虫直接使用。

3、代码模块
Python中高层次的数据结构,动态类型和动态绑定,使得它特别适合于快速应用开发,也适合于作为胶带语言联接已有的软件部件。用Python来搞这个代理IP池也很简单,代码分为6个模块:
Api:
api插口相关代码,目前api是由Flask实现,代码也十分简单。客户端恳求传给Flask,Flask调用ProxyManager中的实现,包括get/delete/refresh/get_all;
DB:
数据库相关代码,目前数据库是采用SSDB。代码用工厂模式实现,方便日后扩充其他类型数据库;
Manager:
get/delete/refresh/get_all等插口的具体实现类,目前代理池只负责管理proxy,日后可能会有更多功能,比如代理和爬虫的绑定,代理和帐号的绑定等等;
ProxyGetter:
代理获取的相关代码,目前抓取了快代理、代理66、有代理、西刺代理、guobanjia这个五个网站的免费代理,经测试这个5个网站每天更新的可用代理只有六七十个,当然也支持自己扩充代理插口;
Schedule:
定时任务相关代码,现在只是实现定时去刷新代码,并验证可用代理,采用多进程形式;
Util:
存放一些公共的模块方式或函数爬虫代理软件,包含GetConfig:读取配置文件config.ini的类,ConfigParse: 集成重画ConfigParser的类,使其对大小写敏感, Singleton:实现单例,LazyProperty:实现类属性惰性估算。等等;
其他文件:
配置文件:Config.ini,数据库配置和代理获取插口配置,可以在GetFreeProxy中添加新的代理获取方式,并在Config.ini中注册即可使用;
4、安装
下载代码:

安装依赖:
pip install -r requirements.txt
启动:

5、使用
定时任务启动后,会通过代理获取方式fetch所有代理装入数据库并验证。此后默认每20分钟会重复执行一次。定时任务启动大约一两分钟后,便可在SSDB中见到刷新下来的可用的代理:

启动ProxyApi.py后即可在浏览器中使用插口获取代理,一下是浏览器中的截图:
index页面:

get页面:

get_all页面:

爬虫中使用,如果要在爬虫代码中使用的话, 可以将此api封装成函数直接使用,例如:

6、最后