
php用正则表达抓取网页中文章
通用方法:php利用curl方法和正则表达式提取网页内容
网站优化 • 优采云 发表了文章 • 0 个评论 • 154 次浏览 • 2022-09-23 13:12
在网页开发中,有时我们需要从其他网页的内容中提取我们需要的信息。抓取页面信息需要使用curl方法,但是要从抓取的信息中提取出我们真正需要的内容,需要使用正则表达式进行匹配。
在这里,我将简要说明如何使用正则匹配从网站的页面中提取我们想要的招聘信息,分为以下几个步骤:
1、分析我们要爬取的内容网页的url构成;
2、根据实际情况拼接我们需要的url;
3、阅读网页内容;
4、使用正则模式根据返回的内容匹配我们需要的内容;
第一步:分析url组成:
在网站的搜索职位页面,选择要搜索的职位地点和职位,
发现它的url组成如下:
地点:
Øji参数的值是工位:这里看到的值“%E7%BB%B5%E9%98%B3”不是乱码;就是中文使用urlencode的结果,我们也可以直接跟明码,比如ji=Mianyang;
ØKw参数的值为位置;
Øp参数为页码;
第二步现在我们构造我们要访问的url:
步骤 3 使用 file_get_contents 函数获取 网站内容:
现在需要用谷歌浏览器的调试工具观察这部分的html结构,才能写出对应的正则表达式:
这部分的html结构是:
Step 4 使用正则表达式匹配所需内容:
先用正则表达式匹配这部分的值,参考上面的html结构,构造的正则表达式(这里我们使用效率更高的PCRE模式)为:
我们使用匹配函数preg_match_all:
通过以上匹配,可以将匹配到的内容放入$arr数组中,返回内容如下:
继续使用正则表达式匹配我们需要的内容,但是之前构造的url中的页码值为1,我们需要匹配所有的页面,所以需要修改之前的url,需要使用a循环,但具有什么样的循环结构?我们需要先观察页面中“下一页”按钮的html结构:
我们可以匹配上图中a标签中的类名“nopress2”来判断是否有下一页。如果值能匹配,则表示没有下一页,所以我们使用do...while循环结构来获取所有页面内容,代码修改如下:
当“nopress2”匹配时,不再满足while条件,循环停止。
1、根据下面的html结构,在对应的a标签中找到job title和url
这里我们使用foreach遍历我们刚刚得到的数组$arr,并添加代码do...while:
2 找到公司名称和对应的url,在foreach中继续添加代码
3 匹配配置职位的月薪、工作地点、发布时间,继续添加代码
经过以上处理,最终得到如下形式的数组:
此时,我们有了要提取的数据。
完整代码:
这个文章只是提供了一个通用的方法来抓取网页上我们想要的内容。中间的一些步骤和代码还是可以优化的,但是还是有不足的地方。欢迎大家一起讨论,毕竟在编程中,没有最好的代码,只有更好的想法。
解密:修改hosts文件禁止访问和加速访问某网站
一般情况下,如果我们需要输入一个网站,我们可以直接输入网站的URL来访问。在这个过程中会将URL转换成IP地址,然后再把IP地址转换成IP地址到网站的服务器,但是这个过程比较长,所以访问速度比较慢下面我们来说说如何通过修改hosts文件来禁用访问,提高网站的访问速度!
禁止访问 网站trick
1),用记事本打开C:\Windows\System32\drivers\etc\文件夹下的hosts文件
2),在hosts文件中填写你要封禁的域名,在域名前加127.0.0.1并隔开带空格的本地 IP。节省。如下图(原理是把域名解释为127.的本地IP,所以输入的域名打不开。通过推断可以改变127.@的IP >0 到你要解释的那个。IP 也可以)
以上是通过修改HOSTS文件来禁止对某个网站的访问。释放方式:删除添加的IP和对应的域名
改进对网站速度技巧的访问
1),获取你需要的网站的IP地址,打开运行,输入cmd打开命令提示符; ping你想要和需要的网站域名,获取IP并复制。
2),用记事本打开C:\Windows\System32\drivers\etc\文件夹下的hosts文件,将获取到的IP填入hosts文件。 IP 和域名之间用空格隔开。保存就行了
3),打开你输入的域名,测试一下。 (原理:输入域名时,不需要通过在线服务器解析IP地址,直接在本地解析IP地址,这样会更快。现在大部分光纤网络已经非常快了,而且你可能肉眼感觉不到改善,但事实是改善了。) 查看全部
通用方法:php利用curl方法和正则表达式提取网页内容
在网页开发中,有时我们需要从其他网页的内容中提取我们需要的信息。抓取页面信息需要使用curl方法,但是要从抓取的信息中提取出我们真正需要的内容,需要使用正则表达式进行匹配。
在这里,我将简要说明如何使用正则匹配从网站的页面中提取我们想要的招聘信息,分为以下几个步骤:
1、分析我们要爬取的内容网页的url构成;
2、根据实际情况拼接我们需要的url;
3、阅读网页内容;
4、使用正则模式根据返回的内容匹配我们需要的内容;
第一步:分析url组成:
在网站的搜索职位页面,选择要搜索的职位地点和职位,
发现它的url组成如下:
地点:
Øji参数的值是工位:这里看到的值“%E7%BB%B5%E9%98%B3”不是乱码;就是中文使用urlencode的结果,我们也可以直接跟明码,比如ji=Mianyang;
ØKw参数的值为位置;
Øp参数为页码;
第二步现在我们构造我们要访问的url:
步骤 3 使用 file_get_contents 函数获取 网站内容:

现在需要用谷歌浏览器的调试工具观察这部分的html结构,才能写出对应的正则表达式:
这部分的html结构是:
Step 4 使用正则表达式匹配所需内容:
先用正则表达式匹配这部分的值,参考上面的html结构,构造的正则表达式(这里我们使用效率更高的PCRE模式)为:
我们使用匹配函数preg_match_all:
通过以上匹配,可以将匹配到的内容放入$arr数组中,返回内容如下:
继续使用正则表达式匹配我们需要的内容,但是之前构造的url中的页码值为1,我们需要匹配所有的页面,所以需要修改之前的url,需要使用a循环,但具有什么样的循环结构?我们需要先观察页面中“下一页”按钮的html结构:
我们可以匹配上图中a标签中的类名“nopress2”来判断是否有下一页。如果值能匹配,则表示没有下一页,所以我们使用do...while循环结构来获取所有页面内容,代码修改如下:

当“nopress2”匹配时,不再满足while条件,循环停止。
1、根据下面的html结构,在对应的a标签中找到job title和url
这里我们使用foreach遍历我们刚刚得到的数组$arr,并添加代码do...while:
2 找到公司名称和对应的url,在foreach中继续添加代码
3 匹配配置职位的月薪、工作地点、发布时间,继续添加代码
经过以上处理,最终得到如下形式的数组:
此时,我们有了要提取的数据。
完整代码:
这个文章只是提供了一个通用的方法来抓取网页上我们想要的内容。中间的一些步骤和代码还是可以优化的,但是还是有不足的地方。欢迎大家一起讨论,毕竟在编程中,没有最好的代码,只有更好的想法。
解密:修改hosts文件禁止访问和加速访问某网站
一般情况下,如果我们需要输入一个网站,我们可以直接输入网站的URL来访问。在这个过程中会将URL转换成IP地址,然后再把IP地址转换成IP地址到网站的服务器,但是这个过程比较长,所以访问速度比较慢下面我们来说说如何通过修改hosts文件来禁用访问,提高网站的访问速度!
禁止访问 网站trick
1),用记事本打开C:\Windows\System32\drivers\etc\文件夹下的hosts文件

2),在hosts文件中填写你要封禁的域名,在域名前加127.0.0.1并隔开带空格的本地 IP。节省。如下图(原理是把域名解释为127.的本地IP,所以输入的域名打不开。通过推断可以改变127.@的IP >0 到你要解释的那个。IP 也可以)
以上是通过修改HOSTS文件来禁止对某个网站的访问。释放方式:删除添加的IP和对应的域名
改进对网站速度技巧的访问

1),获取你需要的网站的IP地址,打开运行,输入cmd打开命令提示符; ping你想要和需要的网站域名,获取IP并复制。
2),用记事本打开C:\Windows\System32\drivers\etc\文件夹下的hosts文件,将获取到的IP填入hosts文件。 IP 和域名之间用空格隔开。保存就行了
3),打开你输入的域名,测试一下。 (原理:输入域名时,不需要通过在线服务器解析IP地址,直接在本地解析IP地址,这样会更快。现在大部分光纤网络已经非常快了,而且你可能肉眼感觉不到改善,但事实是改善了。)
php用正则表达抓取网页中文章啊,可以快速获取里面全文内容
网站优化 • 优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-09-01 08:01
php用正则表达抓取网页中文章啊,可以快速获取里面全文内容用wordpress自带的正则表达抓取功能,可以自动生成规则图片中存在中文,所以如果这篇图片不是从中文再到英文,在不改变文本和作者名称的情况下是无法抓取出来的。不过如果该图片是在php文件里生成的,wordpress和php文件应该是同一个php文件,就可以像抓取网页那样抓取出来。
谢邀这样的情况,从我的经验来看,最难,最正确的方法是,从url=^\.\.php开始编写shell脚本,抓取数据库里全部的中文,
用wordpress自带正则表达式抓取插件,
wordpress官方自带的正则就可以抓取
官方自带正则表达式/faq/faq/?result=dihi4ciu
如果没有指定域名,php抓取中文有多种可能性:手动查询中文,生成搜索引擎的爬虫,并搜索网站对应服务器上的关键字进行下载;或者通过wordpress自带正则表达式抓取并存储数据库数据;可以通过wordpress自带的服务器抓取;不过以上几种方法都是无源码抓取,而且后者需要修改wordpress程序才可以使用,在我做脚本后端的时候,aspshopifymvcpatiter只支持wordpress,但wordpress官方从来不支持cms抓取,因为这样才能真正提高php查询请求,并且必须做“正则表达式\u”,因为“\u”这个包含几乎所有的正则模式。我好多年前用过,没用几次就被apache挖坑了。 查看全部
php用正则表达抓取网页中文章啊,可以快速获取里面全文内容
php用正则表达抓取网页中文章啊,可以快速获取里面全文内容用wordpress自带的正则表达抓取功能,可以自动生成规则图片中存在中文,所以如果这篇图片不是从中文再到英文,在不改变文本和作者名称的情况下是无法抓取出来的。不过如果该图片是在php文件里生成的,wordpress和php文件应该是同一个php文件,就可以像抓取网页那样抓取出来。

谢邀这样的情况,从我的经验来看,最难,最正确的方法是,从url=^\.\.php开始编写shell脚本,抓取数据库里全部的中文,
用wordpress自带正则表达式抓取插件,

wordpress官方自带的正则就可以抓取
官方自带正则表达式/faq/faq/?result=dihi4ciu
如果没有指定域名,php抓取中文有多种可能性:手动查询中文,生成搜索引擎的爬虫,并搜索网站对应服务器上的关键字进行下载;或者通过wordpress自带正则表达式抓取并存储数据库数据;可以通过wordpress自带的服务器抓取;不过以上几种方法都是无源码抓取,而且后者需要修改wordpress程序才可以使用,在我做脚本后端的时候,aspshopifymvcpatiter只支持wordpress,但wordpress官方从来不支持cms抓取,因为这样才能真正提高php查询请求,并且必须做“正则表达式\u”,因为“\u”这个包含几乎所有的正则模式。我好多年前用过,没用几次就被apache挖坑了。
php用正则表达抓取网页中文章列表不是有一个很不错的题主
网站优化 • 优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-08-11 22:02
php用正则表达抓取网页中文章列表
不是有一个很不错的题主可以参考一下【web开发】restfulapi接口参考-book-list.html
要先去了解服务器知识,
一句话看这些htmlcssjavascriptsql我觉得写不出,要想玩出花,和玩微博差不多。
crawler1.0有这个需求的人多的是,这个没人做,等别人来做吧
newsradio也可以先去看看
wordpress首页
深入浅出mysql
写api跟写excel有什么区别?
可以参考淘宝采集
emm,
fbapi?info=0000045e0bcbd383201bebc7f552f2849eb568
如果你们网站已经有html和css代码,那么可以采用wordpress的导航模块。方法见如何在wordpress模板中使用导航功能?-廖高的回答如果你们网站还没有开始做,想采用外部api就意味着也需要你们自己写一些代码。而且技术含量会比较高。
1、可以直接申请一个账号,
2、可以把关键词都转化为二进制形式,
3、具体案例可以直接问采集公司--好吧,上述是想说的,
云采集。在电脑上登录young模板网站,以可连接客户端的方式登录,即可采集全站中的中文网站。当然,别忘了把重要关键词加上吧。 查看全部
php用正则表达抓取网页中文章列表不是有一个很不错的题主
php用正则表达抓取网页中文章列表
不是有一个很不错的题主可以参考一下【web开发】restfulapi接口参考-book-list.html
要先去了解服务器知识,
一句话看这些htmlcssjavascriptsql我觉得写不出,要想玩出花,和玩微博差不多。
crawler1.0有这个需求的人多的是,这个没人做,等别人来做吧

newsradio也可以先去看看
wordpress首页
深入浅出mysql
写api跟写excel有什么区别?
可以参考淘宝采集
emm,

fbapi?info=0000045e0bcbd383201bebc7f552f2849eb568
如果你们网站已经有html和css代码,那么可以采用wordpress的导航模块。方法见如何在wordpress模板中使用导航功能?-廖高的回答如果你们网站还没有开始做,想采用外部api就意味着也需要你们自己写一些代码。而且技术含量会比较高。
1、可以直接申请一个账号,
2、可以把关键词都转化为二进制形式,
3、具体案例可以直接问采集公司--好吧,上述是想说的,
云采集。在电脑上登录young模板网站,以可连接客户端的方式登录,即可采集全站中的中文网站。当然,别忘了把重要关键词加上吧。
成为专业程序员路上用到的各种优秀资料、神器及框架
网站优化 • 优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2022-08-01 11:28
温馨提示:本文包含大量外部链接,墙裂建议小伙伴们点击 “阅读原文“ 进行阅读和Fork。:)前言
成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。
笔者作为一位tool mad,将工作以来用到的各种优秀资料、神器及框架整理在此,毕竟好记性不如烂键盘,此项目可以作为自己的不时之需。
本人喜欢折腾,记录的东西也比较杂,各方面都会有一些,内容按重要等级排序,大家各取所需。
这里的东西会持续积累下去,欢迎Star,也欢迎发PR给我。
Thonatos.Yang整理的GitBook版本,阅读体验更佳:
目录资料篇技术站点必看书籍大牛博客GitHub篇
Awesome
书籍资料
优秀项目
前端 & Node.js
工作,工具
工具篇平台工具常用工具第三方服务爬虫相关(好玩的工具)安全相关Web服务器性能/压力测试工具/负载均衡器大数据处理/数据分析/分布式工具Web前端语言篇
折腾中:Scala、Python、Lua、JavaScript、Go
待折腾:
ScalaJavaPythonSwift
客户端
Framework
小工具
游戏
.NETC & C++其他游戏开发相关日志聚合,分布式日志收集RTP,实时传输协议与音视频 查看全部
成为专业程序员路上用到的各种优秀资料、神器及框架
温馨提示:本文包含大量外部链接,墙裂建议小伙伴们点击 “阅读原文“ 进行阅读和Fork。:)前言
成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。
笔者作为一位tool mad,将工作以来用到的各种优秀资料、神器及框架整理在此,毕竟好记性不如烂键盘,此项目可以作为自己的不时之需。
本人喜欢折腾,记录的东西也比较杂,各方面都会有一些,内容按重要等级排序,大家各取所需。
这里的东西会持续积累下去,欢迎Star,也欢迎发PR给我。
Thonatos.Yang整理的GitBook版本,阅读体验更佳:

目录资料篇技术站点必看书籍大牛博客GitHub篇
Awesome
书籍资料
优秀项目
前端 & Node.js
工作,工具
工具篇平台工具常用工具第三方服务爬虫相关(好玩的工具)安全相关Web服务器性能/压力测试工具/负载均衡器大数据处理/数据分析/分布式工具Web前端语言篇

折腾中:Scala、Python、Lua、JavaScript、Go
待折腾:
ScalaJavaPythonSwift
客户端
Framework
小工具
游戏
.NETC & C++其他游戏开发相关日志聚合,分布式日志收集RTP,实时传输协议与音视频
php用正则表达抓取网页中文章方法特别简单(组图)
网站优化 • 优采云 发表了文章 • 0 个评论 • 87 次浏览 • 2022-07-26 00:02
php用正则表达抓取网页中文章方法特别简单,很多比较大型的网站都是用的php来抓取网页中文章。scrapy是现在很多互联网公司使用的爬虫框架,封装出来一套比较完善的爬虫组件,适合特定领域快速抓取一些网站的中文段子。今天我们就来学习如何用php来抓取github中搜索结果的中文段子!首先我们可以打开开发者工具,在github搜索页面搜索“哔哩哔哩”,就能看到很多跟“哔哩哔哩”有关的结果。
由于我们都不知道搜索引擎的规则,就只能自己写了。首先我们要写一个重定向网址的函数,例如将其他网站的url重定向到该网址的页面,然后用js或cookie加载页面,再用正则表达抓取搜索结果到本地。本实战参考了codeforces的代码,codeforces使用scrapy-galleryjs()框架为使用方便,我们不使用jquery等框架。
//正则表达抓取下面的结果url:/[0-9](-hwh-zee)[0-9](__abbucket)[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]user-agent:'mozilla/5.0(windowsnt6.1;wow64)applewebkit/537.36(khtml,likegecko)chrome/74.0.3350.110safari/537.36'encoding:utf-8'/#我们就是定位好了页面url及结果url然后用正则来抓取搜索结果使用:;code=&site=site-page&query=一共就那几行代码,即可抓取github中所有的中文结果。
代码开源在github上::,欢迎关注我的微信公众号:zouzhezhejiuying如果觉得有用,点个赞吧!。 查看全部
php用正则表达抓取网页中文章方法特别简单(组图)
php用正则表达抓取网页中文章方法特别简单,很多比较大型的网站都是用的php来抓取网页中文章。scrapy是现在很多互联网公司使用的爬虫框架,封装出来一套比较完善的爬虫组件,适合特定领域快速抓取一些网站的中文段子。今天我们就来学习如何用php来抓取github中搜索结果的中文段子!首先我们可以打开开发者工具,在github搜索页面搜索“哔哩哔哩”,就能看到很多跟“哔哩哔哩”有关的结果。

由于我们都不知道搜索引擎的规则,就只能自己写了。首先我们要写一个重定向网址的函数,例如将其他网站的url重定向到该网址的页面,然后用js或cookie加载页面,再用正则表达抓取搜索结果到本地。本实战参考了codeforces的代码,codeforces使用scrapy-galleryjs()框架为使用方便,我们不使用jquery等框架。

//正则表达抓取下面的结果url:/[0-9](-hwh-zee)[0-9](__abbucket)[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]user-agent:'mozilla/5.0(windowsnt6.1;wow64)applewebkit/537.36(khtml,likegecko)chrome/74.0.3350.110safari/537.36'encoding:utf-8'/#我们就是定位好了页面url及结果url然后用正则来抓取搜索结果使用:;code=&site=site-page&query=一共就那几行代码,即可抓取github中所有的中文结果。
代码开源在github上::,欢迎关注我的微信公众号:zouzhezhejiuying如果觉得有用,点个赞吧!。
php用正则表达抓取网页中文章是否可行?程序语言得到解放
网站优化 • 优采云 发表了文章 • 0 个评论 • 74 次浏览 • 2022-07-03 23:00
php用正则表达抓取网页中文章是否可行?程序语言得到解放。
如果有其他语言知识的话php确实应该使用python作为主要开发语言,而且python本身也是做web开发最好的语言之一,php的优势更多在于简单,优秀的性能,丰富的第三方库的支持,良好的社区以及良好的代码风格python所面临的问题php底层已经很封闭了,和其他语言比起来甚至略显落后python作为一门脚本语言,脚本语言本身很适合快速开发和小规模部署,并且python和awk,random库很有渊源,使用python开发一个awk包,在部署调试方面也很方便,而且在处理大规模计算问题的时候,python的发展前景要比php好,毕竟php核心竞争力只在于快速开发的脚本语言,可是python,php由于他个人定义程度过高,包含了太多非本职业务的功能,导致python的核心竞争力已经不在其上,从人工智能到flask这样的mvc框架,都是建立在python上的php作为一个长期被包装为脚本语言的程序员,建议我在学习php的时候多用phpstorm。
找程序员看看:
能比的应该是c++,这是全面的性能的主流语言,但php显然还有很多不足的地方,目前我了解到的还没有一个语言是能像c++那样一个程序能包含c还有javahtmlpythonphp的所有功能的。php,不管是语言还是社区都显然要差其他语言一大截。c++很多时候是作为一个库或者开发工具使用,做web开发会用到php甚至javahtmlpythonphp这样的语言,如果你想做上层web开发的话,建议避开php。 查看全部
php用正则表达抓取网页中文章是否可行?程序语言得到解放
php用正则表达抓取网页中文章是否可行?程序语言得到解放。

如果有其他语言知识的话php确实应该使用python作为主要开发语言,而且python本身也是做web开发最好的语言之一,php的优势更多在于简单,优秀的性能,丰富的第三方库的支持,良好的社区以及良好的代码风格python所面临的问题php底层已经很封闭了,和其他语言比起来甚至略显落后python作为一门脚本语言,脚本语言本身很适合快速开发和小规模部署,并且python和awk,random库很有渊源,使用python开发一个awk包,在部署调试方面也很方便,而且在处理大规模计算问题的时候,python的发展前景要比php好,毕竟php核心竞争力只在于快速开发的脚本语言,可是python,php由于他个人定义程度过高,包含了太多非本职业务的功能,导致python的核心竞争力已经不在其上,从人工智能到flask这样的mvc框架,都是建立在python上的php作为一个长期被包装为脚本语言的程序员,建议我在学习php的时候多用phpstorm。

找程序员看看:
能比的应该是c++,这是全面的性能的主流语言,但php显然还有很多不足的地方,目前我了解到的还没有一个语言是能像c++那样一个程序能包含c还有javahtmlpythonphp的所有功能的。php,不管是语言还是社区都显然要差其他语言一大截。c++很多时候是作为一个库或者开发工具使用,做web开发会用到php甚至javahtmlpythonphp这样的语言,如果你想做上层web开发的话,建议避开php。
php用正则表达网页中文章,抓取到后,(图)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-07-02 03:03
<p>php用正则表达抓取网页中文章,抓取到后,我们首先想知道爬虫下载到的文章是文章的页面还是源代码,php提供了两种方法,一种是httpcookie的txt字典,一种是正则表达式的splitslicemipmap。接下来解释一下split的作用,以php抓取1404字数的网页为例。if(str(newfile('r'))=http_ssl_cookie_level&&str(newfile('r')) 查看全部
php用正则表达网页中文章,抓取到后,(图)
<p>php用正则表达抓取网页中文章,抓取到后,我们首先想知道爬虫下载到的文章是文章的页面还是源代码,php提供了两种方法,一种是httpcookie的txt字典,一种是正则表达式的splitslicemipmap。接下来解释一下split的作用,以php抓取1404字数的网页为例。if(str(newfile('r'))=http_ssl_cookie_level&&str(newfile('r'))
当我们学Python时,我们学什么?
网站优化 • 优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2022-06-24 17:55
很多朋友学习Python一段时间后,觉得有点入门了,但是不知道接下来该怎么做。如果其中有人是为了找工作而学习的Python,那么你其实很容易就可以找到自己学习的方向和目标。
这也是我为什么要分享今天这篇来自简书的文章的原因(已获作者授权)。文中作者爬取了大量Python岗位的职位要求,对于你该学哪些东西有很好的参考价值。
以下是正文,作者信息见文末,希望对你有所帮助:
虽然有时觉得Python简单得不像编程语言,知乎上也有人说,“requests 好用的让人想哭”。但当我们学习一门编程语言时,要学习哪些内容,怎么学习,还是很值得深入探究的。
先看一下Python官网上的说明:
powerful, fast, easy, 对,这就是赤果果的广告。不过我用下来的感觉确是如此,最大的问题是在于它太强大了有太多的库,貌似没有一个地方可以集中查看所有库的文档( 算吗?)。那Python究竟能做些什么?
还是先看一下官网上的说明:
The Python Package Index (PyPI) hosts thousands of third-party modules for Python. Both Python's standard library and the community-contributed modules allow for endless possibilities.
再看一下知乎上的回答,大家都用Python做什么?
看到Python的功能强大了吧。现在工作需要的一些网络数据抓取,我都用Python处理了。对于一个小白来说学习Python要注意些什么,哪些是重点,如果自学Python找一份开发的工作,重点又该是什么?
还是用数据说话,我用Python写了一段代码,把51JOB上上海地区Python职位的要求爬取下来,看看公司里对Python开发的要求是什么,这样你学习起来才更有针对性。
一共抓取了194个Python开发岗位
一、自学中一个最大的问题是,你没有找到应用的场景
大多数同学在自学一门编程语言时,是没有应用的场景感。就是不知道学了做什么用,讲不出具体、合理的应用。如果是有老师教,老师带着你学,是没有关系的。因为每一阶段做什么练习,做什么项目,知识点学到什么程度,老师都会帮你规划好。自学不一样,最好每个技能点都要有明确的应用场景感,这样学习起来目标、目的更强,不会出现看不到进步,自我否定而放弃。
学习Python,比较好快速找到应用的场景。如果马上可以找到解决工作生活中的问题,用Python来实现,学习的效果和效率就会立马得到提升。这种学习方法,采铜称之为“设计式操练”。
还是回到刚才知乎上的回答,有的人拿Python写了一个12306余票检测脚本;有的人用Python爬取图片和电影资源... ... 这些就是具体应用的场景感,然后分解功能,一步一步完成,Python可以用最少的代码来实现。
二、当我们学Python,我们学什么
1)如果学Python是想了解编程语言,做一些实用小工具来提高效率,那学习的主要内容应该是Python的网络访问(urllib, urllib2, requests),爬虫相关的库,正则表达式, BeautifulSoup,XPath,Excel,数据库MySQLdb模块等,了解html网页。
这些知识熟练应用,从网络上抓取数据,再进行分析处理,完全没有问题。
2)如果你想学习Python语言找一份开发的工作,那看企业的岗位中有哪些要求。(一共194个Python开发岗位)
再看一下岗位需求量,我把Java的也列出来作一个对比:
城市Python岗位数量(个)Java岗位数量(个)
上海
287
9993
西安
10
1309
武汉
23
2018
乌鲁木齐
0
55
北京
347
12235
结论:
Python语言作为工作中效率提升的工具,非常好用的。
Python好用易学,但作为程序员主力开发语言,要求比较高,大多需要其他语言的使用经验。Python作为程序猿的想扩展的新语言非常合适。
如果没有编程语言基础,想学习Python后从事开发,要求偏高。重点要放在Web学习,框架学习上。打好Linux基础,多了解一些Java还是比较好。
文/向右奔跑(简书作者)
原文链接:
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 查看全部
当我们学Python时,我们学什么?
很多朋友学习Python一段时间后,觉得有点入门了,但是不知道接下来该怎么做。如果其中有人是为了找工作而学习的Python,那么你其实很容易就可以找到自己学习的方向和目标。
这也是我为什么要分享今天这篇来自简书的文章的原因(已获作者授权)。文中作者爬取了大量Python岗位的职位要求,对于你该学哪些东西有很好的参考价值。
以下是正文,作者信息见文末,希望对你有所帮助:
虽然有时觉得Python简单得不像编程语言,知乎上也有人说,“requests 好用的让人想哭”。但当我们学习一门编程语言时,要学习哪些内容,怎么学习,还是很值得深入探究的。
先看一下Python官网上的说明:
powerful, fast, easy, 对,这就是赤果果的广告。不过我用下来的感觉确是如此,最大的问题是在于它太强大了有太多的库,貌似没有一个地方可以集中查看所有库的文档( 算吗?)。那Python究竟能做些什么?
还是先看一下官网上的说明:
The Python Package Index (PyPI) hosts thousands of third-party modules for Python. Both Python's standard library and the community-contributed modules allow for endless possibilities.
再看一下知乎上的回答,大家都用Python做什么?
看到Python的功能强大了吧。现在工作需要的一些网络数据抓取,我都用Python处理了。对于一个小白来说学习Python要注意些什么,哪些是重点,如果自学Python找一份开发的工作,重点又该是什么?
还是用数据说话,我用Python写了一段代码,把51JOB上上海地区Python职位的要求爬取下来,看看公司里对Python开发的要求是什么,这样你学习起来才更有针对性。
一共抓取了194个Python开发岗位
一、自学中一个最大的问题是,你没有找到应用的场景
大多数同学在自学一门编程语言时,是没有应用的场景感。就是不知道学了做什么用,讲不出具体、合理的应用。如果是有老师教,老师带着你学,是没有关系的。因为每一阶段做什么练习,做什么项目,知识点学到什么程度,老师都会帮你规划好。自学不一样,最好每个技能点都要有明确的应用场景感,这样学习起来目标、目的更强,不会出现看不到进步,自我否定而放弃。
学习Python,比较好快速找到应用的场景。如果马上可以找到解决工作生活中的问题,用Python来实现,学习的效果和效率就会立马得到提升。这种学习方法,采铜称之为“设计式操练”。
还是回到刚才知乎上的回答,有的人拿Python写了一个12306余票检测脚本;有的人用Python爬取图片和电影资源... ... 这些就是具体应用的场景感,然后分解功能,一步一步完成,Python可以用最少的代码来实现。
二、当我们学Python,我们学什么
1)如果学Python是想了解编程语言,做一些实用小工具来提高效率,那学习的主要内容应该是Python的网络访问(urllib, urllib2, requests),爬虫相关的库,正则表达式, BeautifulSoup,XPath,Excel,数据库MySQLdb模块等,了解html网页。
这些知识熟练应用,从网络上抓取数据,再进行分析处理,完全没有问题。
2)如果你想学习Python语言找一份开发的工作,那看企业的岗位中有哪些要求。(一共194个Python开发岗位)
再看一下岗位需求量,我把Java的也列出来作一个对比:
城市Python岗位数量(个)Java岗位数量(个)
上海
287
9993
西安
10
1309
武汉
23
2018
乌鲁木齐
0
55
北京
347
12235
结论:
Python语言作为工作中效率提升的工具,非常好用的。
Python好用易学,但作为程序员主力开发语言,要求比较高,大多需要其他语言的使用经验。Python作为程序猿的想扩展的新语言非常合适。
如果没有编程语言基础,想学习Python后从事开发,要求偏高。重点要放在Web学习,框架学习上。打好Linux基础,多了解一些Java还是比较好。
文/向右奔跑(简书作者)
原文链接:
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
Python 爬虫超详细讲解(零基础入门,老年人都看的懂)
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-06-23 01:48
讲解我们的爬虫之前,先概述关于爬虫的简单概念(毕竟是零基础教程)
爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做。
为什么我们要使用爬虫
互联网大数据时代,给予我们的是生活的便利以及海量数据爆炸式的出现在网络中。
过去,我们通过书籍、报纸、电视、广播或许信息,这些信息数量有限,且是经过一定的筛选,信息相对而言比较有效,但是缺点则是信息面太过于狭窄了。不对称的信息传导,以致于我们视野受限,无法了解到更多的信息和知识。
互联网大数据时代,我们突然间,信息获取自由了,我们得到了海量的信息,但是大多数都是无效的垃圾信息。
例如新浪微博,一天产生数亿条的状态更新,而在百度搜索引擎中,随意搜一条——减肥100,000,000条信息。
在如此海量的信息碎片中,我们如何获取对自己有用的信息呢?
答案是筛选!
通过某项技术将相关的内容收集起来,在分析删选才能得到我们真正需要的信息。
这个信息收集分析整合的工作,可应用的范畴非常的广泛,无论是生活服务、出行旅行、金融投资、各类制造业的产品市场需求等等……都能够借助这个技术获取更精准有效的信息加以利用。
网络爬虫技术,虽说有个诡异的名字,让能第一反应是那种软软的蠕动的生物,但它却是一个可以在虚拟世界里,无往不前的利器。
爬虫准备工作
我们平时都说Python爬虫,其实这里可能有个误解,爬虫并不是Python独有的,可以做爬虫的语言有很多例如:PHP,JAVA,C#,C++,Python,选择Python做爬虫是因为Python相对来说比较简单,而且功能比较齐全。
首先我们需要下载python,我下载的是官方最新的版本 3.8.3
其次我们需要一个运行Python的环境,我用的是pychram
也可以从官方下载,
我们还需要一些库来支持爬虫的运行(有些库Python可能自带了)
差不多就是这几个库了,良心的我已经在后面写好注释了
(爬虫运行过程中,不一定就只需要上面几个库,看你爬虫的一个具体写法了,反正需要库的话我们可以直接在setting里面安装)
爬虫项目讲解
我做的是爬取豆瓣评分电影Top250的爬虫代码
我们要爬取的就是这个网站:
这边我已经爬取完毕,给大家看下效果图,我是将爬取到的内容存到xls中
我们的爬取的内容是:电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,相关信息。
代码分析
先把代码发放上来,然后我根据代码逐步解析
# -*- codeing = utf-8 -*-from bs4 import BeautifulSoup # 网页解析,获取数据import re # 正则表达式,进行文字匹配`import urllib.request, urllib.error # 制定URL,获取网页数据import xlwt # 进行excel操作#import sqlite3 # 进行SQLite数据库操作<br />findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,标售规则 影片详情链接的规则findImgSrc = re.compile(r', re.S)findTitle = re.compile(r'(.*)')findRating = re.compile(r'(.*)')findJudge = re.compile(r'(\d*)人评价')findInq = re.compile(r'(.*)')findBd = re.compile(r'<p class="">(.*?)', re.S)<br /><br /><br /><br />def main(): baseurl = "https://movie.douban.com/top250?start=" #要爬取的网页链接 # 1.爬取网页 datalist = getData(baseurl) savepath = "豆瓣电影Top250.xls" #当前目录新建XLS,存储进去 # dbpath = "movie.db" #当前目录新建数据库,存储进去 # 3.保存数据 saveData(datalist,savepath) #2种存储方式可以只选择一种 # saveData2DB(datalist,dbpath)<br /><br /><br /># 爬取网页def getData(baseurl): datalist = [] #用来存储爬取的网页信息 for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25) html = askURL(url) # 保存获取到的网页源码 # 2.逐一解析数据 soup = BeautifulSoup(html, "html.parser") for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串 data = [] # 保存一部电影所有信息 item = str(item) link = re.findall(findLink, item)[0] # 通过正则表达式查找 data.append(link) imgSrc = re.findall(findImgSrc, item)[0] data.append(imgSrc) titles = re.findall(findTitle, item) if (len(titles) == 2): ctitle = titles[0] data.append(ctitle) otitle = titles[1].replace("/", "") #消除转义字符 data.append(otitle) else: data.append(titles[0]) data.append(' ') rating = re.findall(findRating, item)[0] data.append(rating) judgeNum = re.findall(findJudge, item)[0] data.append(judgeNum) inq = re.findall(findInq, item) if len(inq) != 0: inq = inq[0].replace("。", "") data.append(inq) else: data.append(" ") bd = re.findall(findBd, item)[0] bd = re.sub('(\s+)?', "", bd) bd = re.sub('/', "", bd) data.append(bd.strip()) datalist.append(data)<br /> return datalist<br /><br /># 得到指定一个URL的网页内容def askURL(url): head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息 "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36" } # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)<br /> request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html<br /><br /># 保存数据到表格def saveData(datalist,savepath): print("save.......") book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象 sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息") for i in range(0,8): sheet.write(0,i,col[i]) #列名 for i in range(0,250): # print("第%d条" %(i+1)) #输出语句,用来测试 data = datalist[i] for j in range(0,8): sheet.write(i+1,j,data[j]) #数据 book.save(savepath) #保存<br /># def saveData2DB(datalist,dbpath):# init_db(dbpath)# conn = sqlite3.connect(dbpath)# cur = conn.cursor()# for data in datalist:# for index in range(len(data)):# if index == 4 or index == 5:# continue# data[index] = '"'+data[index]+'"'# sql = '''# insert into movie250(# info_link,pic_link,cname,ename,score,rated,instroduction,info)# values (%s)'''%",".join(data)# # print(sql) #输出查询语句,用来测试# cur.execute(sql)# conn.commit()# cur.close# conn.close()<br /><br /># def init_db(dbpath):# sql = '''# create table movie250(# id integer primary key autoincrement,# info_link text,# pic_link text,# cname varchar,# ename varchar ,# score numeric,# rated numeric,# instroduction text,# info text# )### ''' #创建数据表# conn = sqlite3.connect(dbpath)# cursor = conn.cursor()# cursor.execute(sql)# conn.commit()# conn.close()<br /># 保存数据到数据库<br /><br /><br /><br /><br /><br /><br />if __name__ == "__main__": # 当程序执行时 # 调用函数 main() # init_db("movietest.db") print("爬取完毕!")</p>
下面我根据代码,从下到下给大家讲解分析一遍
-- codeing = utf-8 --,开头的这个是设置编码为utf-8 ,写在开头,防止乱码。
然后下面import就是导入一些库,做做准备工作,(sqlite3这库我并没有用到所以我注释起来了)。
下面一些find开头的是正则表达式,是用来我们筛选信息的。
(正则表达式用到 re 库,也可以不用正则表达式,不是必须的。)
大体流程分三步走:
1. 爬取网页
2.逐一解析数据
3. 保存网页
先分析流程1,爬取网页,baseurl 就是我们要爬虫的网页网址,往下走,调用了 getData(baseurl) ,
我们来看 getData方法
for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25)
这段大家可能看不懂,其实是这样的:
因为电影评分Top250,每个页面只显示25个,所以我们需要访问页面10次,25*10=250。
baseurl = "https://movie.douban.com/top250?start="
我们只要在baseurl后面加上数字就会跳到相应页面,比如i=1时
我放上超链接,大家可以点击看看会跳到哪个页面,毕竟实践出真知。
然后又调用了askURL来请求网页,这个方法是请求网页的主体方法,
怕大家翻页麻烦,我再把代码复制一遍,让大家有个直观感受
def askURL(url): head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息 "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36" } # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)<br /> request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html
这个askURL就是用来向网页发送请求用的,那么这里就有老铁问了,为什么这里要写个head呢?
这是因为我们要是不写的话,访问某些网站的时候会被认出来爬虫,显示错误,错误代码
418
这是一个梗大家可以百度下,
418 I’m a teapot
The HTTP 418 I’m a teapot client error response code indicates that
the server refuses to brew coffee because it is a teapot. This error
is a reference to Hyper Text Coffee Pot Control Protocol which was an
April Fools’ joke in 1998.
我是一个茶壶
所以我们需要 “装” ,装成我们就是一个浏览器,这样就不会被认出来,
伪装一个身份。
来,我们继续往下走,
html = response.read().decode("utf-8")
这段就是我们读取网页的内容,设置编码为utf-8,目的就是为了防止乱码。
访问成功后,来到了第二个流程:
2.逐一解析数据
解析数据这里我们用到了 BeautifulSoup(靓汤) 这个库,这个库是几乎是做爬虫必备的库,无论你是什么写法。
下面就开始查找符合我们要求的数据,用BeautifulSoup的方法以及 re 库的
正则表达式去匹配,
findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,标售规则 影片详情链接的规则findImgSrc = re.compile(r', re.S)findTitle = re.compile(r'(.*)')findRating = re.compile(r'(.*)')findJudge = re.compile(r'(\d*)人评价')findInq = re.compile(r'(.*)')findBd = re.compile(r'(.*?)', re.S)</p>
匹配到符合我们要求的数据,然后存进dataList, 所以dataList里就存放着我们需要的数据了。
最后一个流程:
3.保存数据
# 3.保存数据 saveData(datalist,savepath) #2种存储方式可以只选择一种 # saveData2DB(datalist,dbpath)
保存数据可以选择保存到 xls 表, 需要(xlwt库支持)
也可以选择保存数据到 sqlite数据库, 需要(sqlite3库支持)
这里我选择保存到 xls 表 ,这也是为什么我注释了一大堆代码,注释的部分就是保存到 sqlite 数据库的代码,二者选一就行
保存到 xls 的主体方法是 saveData(下面的saveData2DB方法是保存到sqlite数据库):
def saveData(datalist,savepath): print("save.......") book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象 sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息") for i in range(0,8): sheet.write(0,i,col[i]) #列名 for i in range(0,250): # print("第%d条" %(i+1)) #输出语句,用来测试 data = datalist[i] for j in range(0,8): sheet.write(i+1,j,data[j]) #数据 book.save(savepath) #保存
创建工作表,创列(会在当前目录下创建),
sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
然后把 dataList里的数据一条条存进去就行。
最后运作成功后,会在左侧生成这么一个文件
打开之后看看是不是我们想要的结果
成了,成了!
如果我们需要以数据库方式存储,可以先生成 xls 文件,再把 xls 文件导入数据库中,就可以啦
本篇文章讲解到这里啦,我感觉我讲的还算细致吧,爬虫我也是最近才可以学,对这个比较有兴趣,我肯定有讲的不好的地方,欢迎各位大佬来指正我 。
我也在不断的学习中,学到新东西第一时间会跟大家分享
大家可以动动小手,点波关注不迷路。
如果关于本篇文章有不懂的地方,欢迎大家下面留言,我知道的都会给大家一 一解答。
白嫖不好,创作不易。各位的点赞就是我创作的最大动力,如果我有哪里写的不对,欢迎评论区留言进行指正。
老铁,如果有收获,请点个免费的赞鼓励一下博主呗
查看全部
Python 爬虫超详细讲解(零基础入门,老年人都看的懂)
讲解我们的爬虫之前,先概述关于爬虫的简单概念(毕竟是零基础教程)
爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做。
为什么我们要使用爬虫
互联网大数据时代,给予我们的是生活的便利以及海量数据爆炸式的出现在网络中。
过去,我们通过书籍、报纸、电视、广播或许信息,这些信息数量有限,且是经过一定的筛选,信息相对而言比较有效,但是缺点则是信息面太过于狭窄了。不对称的信息传导,以致于我们视野受限,无法了解到更多的信息和知识。
互联网大数据时代,我们突然间,信息获取自由了,我们得到了海量的信息,但是大多数都是无效的垃圾信息。
例如新浪微博,一天产生数亿条的状态更新,而在百度搜索引擎中,随意搜一条——减肥100,000,000条信息。
在如此海量的信息碎片中,我们如何获取对自己有用的信息呢?
答案是筛选!
通过某项技术将相关的内容收集起来,在分析删选才能得到我们真正需要的信息。
这个信息收集分析整合的工作,可应用的范畴非常的广泛,无论是生活服务、出行旅行、金融投资、各类制造业的产品市场需求等等……都能够借助这个技术获取更精准有效的信息加以利用。
网络爬虫技术,虽说有个诡异的名字,让能第一反应是那种软软的蠕动的生物,但它却是一个可以在虚拟世界里,无往不前的利器。
爬虫准备工作
我们平时都说Python爬虫,其实这里可能有个误解,爬虫并不是Python独有的,可以做爬虫的语言有很多例如:PHP,JAVA,C#,C++,Python,选择Python做爬虫是因为Python相对来说比较简单,而且功能比较齐全。
首先我们需要下载python,我下载的是官方最新的版本 3.8.3
其次我们需要一个运行Python的环境,我用的是pychram
也可以从官方下载,
我们还需要一些库来支持爬虫的运行(有些库Python可能自带了)
差不多就是这几个库了,良心的我已经在后面写好注释了
(爬虫运行过程中,不一定就只需要上面几个库,看你爬虫的一个具体写法了,反正需要库的话我们可以直接在setting里面安装)
爬虫项目讲解
我做的是爬取豆瓣评分电影Top250的爬虫代码
我们要爬取的就是这个网站:
这边我已经爬取完毕,给大家看下效果图,我是将爬取到的内容存到xls中
我们的爬取的内容是:电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,相关信息。
代码分析
先把代码发放上来,然后我根据代码逐步解析
# -*- codeing = utf-8 -*-from bs4 import BeautifulSoup # 网页解析,获取数据import re # 正则表达式,进行文字匹配`import urllib.request, urllib.error # 制定URL,获取网页数据import xlwt # 进行excel操作#import sqlite3 # 进行SQLite数据库操作<br />findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,标售规则 影片详情链接的规则findImgSrc = re.compile(r', re.S)findTitle = re.compile(r'(.*)')findRating = re.compile(r'(.*)')findJudge = re.compile(r'(\d*)人评价')findInq = re.compile(r'(.*)')findBd = re.compile(r'<p class="">(.*?)', re.S)<br /><br /><br /><br />def main(): baseurl = "https://movie.douban.com/top250?start=" #要爬取的网页链接 # 1.爬取网页 datalist = getData(baseurl) savepath = "豆瓣电影Top250.xls" #当前目录新建XLS,存储进去 # dbpath = "movie.db" #当前目录新建数据库,存储进去 # 3.保存数据 saveData(datalist,savepath) #2种存储方式可以只选择一种 # saveData2DB(datalist,dbpath)<br /><br /><br /># 爬取网页def getData(baseurl): datalist = [] #用来存储爬取的网页信息 for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25) html = askURL(url) # 保存获取到的网页源码 # 2.逐一解析数据 soup = BeautifulSoup(html, "html.parser") for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串 data = [] # 保存一部电影所有信息 item = str(item) link = re.findall(findLink, item)[0] # 通过正则表达式查找 data.append(link) imgSrc = re.findall(findImgSrc, item)[0] data.append(imgSrc) titles = re.findall(findTitle, item) if (len(titles) == 2): ctitle = titles[0] data.append(ctitle) otitle = titles[1].replace("/", "") #消除转义字符 data.append(otitle) else: data.append(titles[0]) data.append(' ') rating = re.findall(findRating, item)[0] data.append(rating) judgeNum = re.findall(findJudge, item)[0] data.append(judgeNum) inq = re.findall(findInq, item) if len(inq) != 0: inq = inq[0].replace("。", "") data.append(inq) else: data.append(" ") bd = re.findall(findBd, item)[0] bd = re.sub('(\s+)?', "", bd) bd = re.sub('/', "", bd) data.append(bd.strip()) datalist.append(data)<br /> return datalist<br /><br /># 得到指定一个URL的网页内容def askURL(url): head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息 "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36" } # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)<br /> request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html<br /><br /># 保存数据到表格def saveData(datalist,savepath): print("save.......") book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象 sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息") for i in range(0,8): sheet.write(0,i,col[i]) #列名 for i in range(0,250): # print("第%d条" %(i+1)) #输出语句,用来测试 data = datalist[i] for j in range(0,8): sheet.write(i+1,j,data[j]) #数据 book.save(savepath) #保存<br /># def saveData2DB(datalist,dbpath):# init_db(dbpath)# conn = sqlite3.connect(dbpath)# cur = conn.cursor()# for data in datalist:# for index in range(len(data)):# if index == 4 or index == 5:# continue# data[index] = '"'+data[index]+'"'# sql = '''# insert into movie250(# info_link,pic_link,cname,ename,score,rated,instroduction,info)# values (%s)'''%",".join(data)# # print(sql) #输出查询语句,用来测试# cur.execute(sql)# conn.commit()# cur.close# conn.close()<br /><br /># def init_db(dbpath):# sql = '''# create table movie250(# id integer primary key autoincrement,# info_link text,# pic_link text,# cname varchar,# ename varchar ,# score numeric,# rated numeric,# instroduction text,# info text# )### ''' #创建数据表# conn = sqlite3.connect(dbpath)# cursor = conn.cursor()# cursor.execute(sql)# conn.commit()# conn.close()<br /># 保存数据到数据库<br /><br /><br /><br /><br /><br /><br />if __name__ == "__main__": # 当程序执行时 # 调用函数 main() # init_db("movietest.db") print("爬取完毕!")</p>
下面我根据代码,从下到下给大家讲解分析一遍
-- codeing = utf-8 --,开头的这个是设置编码为utf-8 ,写在开头,防止乱码。
然后下面import就是导入一些库,做做准备工作,(sqlite3这库我并没有用到所以我注释起来了)。
下面一些find开头的是正则表达式,是用来我们筛选信息的。
(正则表达式用到 re 库,也可以不用正则表达式,不是必须的。)
大体流程分三步走:
1. 爬取网页
2.逐一解析数据
3. 保存网页
先分析流程1,爬取网页,baseurl 就是我们要爬虫的网页网址,往下走,调用了 getData(baseurl) ,
我们来看 getData方法
for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25)
这段大家可能看不懂,其实是这样的:
因为电影评分Top250,每个页面只显示25个,所以我们需要访问页面10次,25*10=250。
baseurl = "https://movie.douban.com/top250?start="
我们只要在baseurl后面加上数字就会跳到相应页面,比如i=1时
我放上超链接,大家可以点击看看会跳到哪个页面,毕竟实践出真知。
然后又调用了askURL来请求网页,这个方法是请求网页的主体方法,
怕大家翻页麻烦,我再把代码复制一遍,让大家有个直观感受
def askURL(url): head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息 "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36" } # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)<br /> request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html
这个askURL就是用来向网页发送请求用的,那么这里就有老铁问了,为什么这里要写个head呢?
这是因为我们要是不写的话,访问某些网站的时候会被认出来爬虫,显示错误,错误代码
418
这是一个梗大家可以百度下,
418 I’m a teapot
The HTTP 418 I’m a teapot client error response code indicates that
the server refuses to brew coffee because it is a teapot. This error
is a reference to Hyper Text Coffee Pot Control Protocol which was an
April Fools’ joke in 1998.
我是一个茶壶
所以我们需要 “装” ,装成我们就是一个浏览器,这样就不会被认出来,
伪装一个身份。
来,我们继续往下走,
html = response.read().decode("utf-8")
这段就是我们读取网页的内容,设置编码为utf-8,目的就是为了防止乱码。
访问成功后,来到了第二个流程:
2.逐一解析数据
解析数据这里我们用到了 BeautifulSoup(靓汤) 这个库,这个库是几乎是做爬虫必备的库,无论你是什么写法。
下面就开始查找符合我们要求的数据,用BeautifulSoup的方法以及 re 库的
正则表达式去匹配,
findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,标售规则 影片详情链接的规则findImgSrc = re.compile(r', re.S)findTitle = re.compile(r'(.*)')findRating = re.compile(r'(.*)')findJudge = re.compile(r'(\d*)人评价')findInq = re.compile(r'(.*)')findBd = re.compile(r'(.*?)', re.S)</p>
匹配到符合我们要求的数据,然后存进dataList, 所以dataList里就存放着我们需要的数据了。
最后一个流程:
3.保存数据
# 3.保存数据 saveData(datalist,savepath) #2种存储方式可以只选择一种 # saveData2DB(datalist,dbpath)
保存数据可以选择保存到 xls 表, 需要(xlwt库支持)
也可以选择保存数据到 sqlite数据库, 需要(sqlite3库支持)
这里我选择保存到 xls 表 ,这也是为什么我注释了一大堆代码,注释的部分就是保存到 sqlite 数据库的代码,二者选一就行
保存到 xls 的主体方法是 saveData(下面的saveData2DB方法是保存到sqlite数据库):
def saveData(datalist,savepath): print("save.......") book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象 sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息") for i in range(0,8): sheet.write(0,i,col[i]) #列名 for i in range(0,250): # print("第%d条" %(i+1)) #输出语句,用来测试 data = datalist[i] for j in range(0,8): sheet.write(i+1,j,data[j]) #数据 book.save(savepath) #保存
创建工作表,创列(会在当前目录下创建),
sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
然后把 dataList里的数据一条条存进去就行。
最后运作成功后,会在左侧生成这么一个文件
打开之后看看是不是我们想要的结果
成了,成了!
如果我们需要以数据库方式存储,可以先生成 xls 文件,再把 xls 文件导入数据库中,就可以啦
本篇文章讲解到这里啦,我感觉我讲的还算细致吧,爬虫我也是最近才可以学,对这个比较有兴趣,我肯定有讲的不好的地方,欢迎各位大佬来指正我 。
我也在不断的学习中,学到新东西第一时间会跟大家分享
大家可以动动小手,点波关注不迷路。
如果关于本篇文章有不懂的地方,欢迎大家下面留言,我知道的都会给大家一 一解答。
白嫖不好,创作不易。各位的点赞就是我创作的最大动力,如果我有哪里写的不对,欢迎评论区留言进行指正。
老铁,如果有收获,请点个免费的赞鼓励一下博主呗
网络安全自学篇(十七)| Python攻防之构建Web目录扫描器及ip代理池(
网站优化 • 优采云 发表了文章 • 0 个评论 • 512 次浏览 • 2022-06-20 13:41
加入安全+ 交流群 和大佬们一起交流安全技术
作者介绍:杨秀璋
自幼受贵州大山的熏陶,养成了诚实质朴的性格。经过寒窗苦读,考入BIT,为完成自己的教师梦,放弃IT、航天等工作,成为贵财一名大学教师,并想把自己所学所感真心传授给自己的学生,帮助更多陌生人。
一.Web目录扫描思路
1.网站目录和敏感文件扫描
网站目录和敏感文件扫描是网站测试中最基本的手段之一。如果通过该方法发现了网站后台,可以尝试暴库、SQL注入等方式进行安全测试;如果发现敏感目录或敏感文件,能帮我们获取如php环境变量、robots.txt、网站指纹等信息;如果扫描出了一些上传的文件,我们甚至可能通过上传功能(一句话恶意代码)获取网站的权限。
2.原理
在Web目录扫描中,字典是非常重要的,一个好的字典能帮助我们的程序更好地发现漏洞和目标。那么,如何通过Python代码实现Web目录扫描呢?或者Web目录扫描器的原理是什么呢?
其原理是通过请求返回的信息来判断当前目录或文件是否真实存在。网站后台扫描工具都是利用目录字典进行爆破扫描,字典越多,扫描到的结果也越多。常见的Web目录扫描工具包括:御剑1.5、DirBuster、Dirsearch、Webdirscan、Cansina、Dirmap等。涉及的常用功能包括:能使用字典、支持纯爆破、并发引擎、能爬取页面动态生成字典、能fuzz扫描、能自定义请求(代理)、自定义响应结果及响应状态等。
3.工具介绍
DirBuster
Kali Linux提供的目录扫描工具DirBuster支持全部的Web目录扫描方式。它既支持网页爬虫方式扫描,也支持基于字典暴力扫描,还支持纯暴力扫描。该工具使用Java语言编写,提供命令行(Headless)和图形界面(GUI)两种模式。其中,图形界面模式功能更为强大。用户不仅可以指定纯暴力扫描的字符规则,还可以设置以URL模糊方式构建网页路径。同时,用户还对网页解析方式进行各种定制,提高网址解析效率。
御剑
御剑系列的web工具一直是比较顺手的工具。这款御剑也是很好用的网站后台扫描工具,图形化页面,使用起来简单上手,因此也被大多数人所喜好。其作者可能是“御剑孤独”。
Webdirscan
webdirscan是一个很简单的多线程Web目录扫描工具,它是使用Python语言编写的,主要调用了requests第三方库实现。大家可以看看它Github上面的代码,和本篇博客原理较为相似。
源代码:
我们将代码下载至本地,再进行扫描目标网站。
将CMD命令行打开,进入webdirscan路径下,指定扫描任务。
Dirmap
它是一个高级web目录扫描工具,功能将会强于DirBuster、Dirsearch、cansina、御剑。详见:
注意:工具的使用方法这里就不进行详细介绍了,希望读者下来自行学习,本文主要分享Python代码是如何实现Web目录扫描的。
二.Python构建Web目录扫描器
该程序主要实现以下3个功能:
判断Web目录或文件是否存在。通过requests发送请求实现,获取status_code状态码,状态码200表示成功。
通过读取文件后去 asp、aspx、jsp、php 常见目录,对其进行扫描。
由于很多安全产品能识别出你的恶意攻击请求,这里需要设置多线程调用,从而避免安全软件识别。
下面是Python实现Web目录扫描的代码,其中本地存在一个 asp.txt 文件(源自御剑),涉及了常见的网站目录。如下图所示:
.完整代码:
作者通过浏览器搜索 “inurl:asp”,寻找某网站为例,接着调用程序获取它的目录。
其扫描结果如下图所示,通过访问这些链接发现它们是真实存在的。
写到这里,一个简单的Web目录扫描器就实现了,希望对大家有所帮助 。后续如果将我们的程序扩展到BurpSuite工具,就能更好地进行抓包分析及安全测试,你可以去试试~
三.ip代理池
某些网站会对我们发送的请求进行有效拦截,这里可以尝试设置一个ip代理池,无论是网络爬虫还是请求发送,都能很好地解决这些问题。下面简单讲解一个获取IP代理的代码,但遗憾的是,作者想把它移植到上面那段代码中,但验证的IP地址多数无法访问,导致失败。
国内IP代理网站为:
其基本思路如下,通过Python爬虫获取IP地址、端口和协议类型,其代码的基本思路如下:
下面是对应的HTML源代码,需要抓取的是tr值,每行代表一个IP地址。
完整代码:
输出结果如下图所示,IP地址和端口成功抓取,但是很多无法使用,读者可以自行试试。
获取IP地址之后,通过如下设置可以使用代理IP地址进行访问。 查看全部
网络安全自学篇(十七)| Python攻防之构建Web目录扫描器及ip代理池(
加入安全+ 交流群 和大佬们一起交流安全技术
作者介绍:杨秀璋
自幼受贵州大山的熏陶,养成了诚实质朴的性格。经过寒窗苦读,考入BIT,为完成自己的教师梦,放弃IT、航天等工作,成为贵财一名大学教师,并想把自己所学所感真心传授给自己的学生,帮助更多陌生人。
一.Web目录扫描思路
1.网站目录和敏感文件扫描
网站目录和敏感文件扫描是网站测试中最基本的手段之一。如果通过该方法发现了网站后台,可以尝试暴库、SQL注入等方式进行安全测试;如果发现敏感目录或敏感文件,能帮我们获取如php环境变量、robots.txt、网站指纹等信息;如果扫描出了一些上传的文件,我们甚至可能通过上传功能(一句话恶意代码)获取网站的权限。
2.原理
在Web目录扫描中,字典是非常重要的,一个好的字典能帮助我们的程序更好地发现漏洞和目标。那么,如何通过Python代码实现Web目录扫描呢?或者Web目录扫描器的原理是什么呢?
其原理是通过请求返回的信息来判断当前目录或文件是否真实存在。网站后台扫描工具都是利用目录字典进行爆破扫描,字典越多,扫描到的结果也越多。常见的Web目录扫描工具包括:御剑1.5、DirBuster、Dirsearch、Webdirscan、Cansina、Dirmap等。涉及的常用功能包括:能使用字典、支持纯爆破、并发引擎、能爬取页面动态生成字典、能fuzz扫描、能自定义请求(代理)、自定义响应结果及响应状态等。
3.工具介绍
DirBuster
Kali Linux提供的目录扫描工具DirBuster支持全部的Web目录扫描方式。它既支持网页爬虫方式扫描,也支持基于字典暴力扫描,还支持纯暴力扫描。该工具使用Java语言编写,提供命令行(Headless)和图形界面(GUI)两种模式。其中,图形界面模式功能更为强大。用户不仅可以指定纯暴力扫描的字符规则,还可以设置以URL模糊方式构建网页路径。同时,用户还对网页解析方式进行各种定制,提高网址解析效率。
御剑
御剑系列的web工具一直是比较顺手的工具。这款御剑也是很好用的网站后台扫描工具,图形化页面,使用起来简单上手,因此也被大多数人所喜好。其作者可能是“御剑孤独”。
Webdirscan
webdirscan是一个很简单的多线程Web目录扫描工具,它是使用Python语言编写的,主要调用了requests第三方库实现。大家可以看看它Github上面的代码,和本篇博客原理较为相似。
源代码:
我们将代码下载至本地,再进行扫描目标网站。
将CMD命令行打开,进入webdirscan路径下,指定扫描任务。
Dirmap
它是一个高级web目录扫描工具,功能将会强于DirBuster、Dirsearch、cansina、御剑。详见:
注意:工具的使用方法这里就不进行详细介绍了,希望读者下来自行学习,本文主要分享Python代码是如何实现Web目录扫描的。
二.Python构建Web目录扫描器
该程序主要实现以下3个功能:
判断Web目录或文件是否存在。通过requests发送请求实现,获取status_code状态码,状态码200表示成功。
通过读取文件后去 asp、aspx、jsp、php 常见目录,对其进行扫描。
由于很多安全产品能识别出你的恶意攻击请求,这里需要设置多线程调用,从而避免安全软件识别。
下面是Python实现Web目录扫描的代码,其中本地存在一个 asp.txt 文件(源自御剑),涉及了常见的网站目录。如下图所示:
.完整代码:
作者通过浏览器搜索 “inurl:asp”,寻找某网站为例,接着调用程序获取它的目录。
其扫描结果如下图所示,通过访问这些链接发现它们是真实存在的。
写到这里,一个简单的Web目录扫描器就实现了,希望对大家有所帮助 。后续如果将我们的程序扩展到BurpSuite工具,就能更好地进行抓包分析及安全测试,你可以去试试~
三.ip代理池
某些网站会对我们发送的请求进行有效拦截,这里可以尝试设置一个ip代理池,无论是网络爬虫还是请求发送,都能很好地解决这些问题。下面简单讲解一个获取IP代理的代码,但遗憾的是,作者想把它移植到上面那段代码中,但验证的IP地址多数无法访问,导致失败。
国内IP代理网站为:
其基本思路如下,通过Python爬虫获取IP地址、端口和协议类型,其代码的基本思路如下:
下面是对应的HTML源代码,需要抓取的是tr值,每行代表一个IP地址。
完整代码:
输出结果如下图所示,IP地址和端口成功抓取,但是很多无法使用,读者可以自行试试。
获取IP地址之后,通过如下设置可以使用代理IP地址进行访问。
php用正则表达抓取网页中文章 [Python从零到壹] 十
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-06-20 13:40
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。
Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上共同成长。
前一篇文章讲述了Selenium基础技术,涉及基础入门、元素定位、常用方法和属性、鼠标操作、键盘操作和导航控制。本文将结合具体实例进行深入地分析,通过三个基于Selenium技术的爬虫,爬取Wikipedia、百度百科和互动百科消息盒的例子,从实际应用出发来学习利用。基础性文章,希望对您有所帮助。
在线百科是基于Wiki技术的、动态的、免费的、可自由访问和编辑的多语言百科全书的Web2.0知识库系统。它是互联网中公开的、最大数量的用户生成的知识库,并且具有知识面覆盖度广、结构化程度高、信息更新速度快和开放性好等优势。其中被广泛使用的三大在线百科包括Wikipedia、百度百科和互动百科。
文章目录:
下载地址:
作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。
一.三大在线百科
随着互联网和大数据的飞速发展,我们需要从海量信息中挖掘出有价值的信息,而在收集这些海量信息过程中,通常都会涉及到底层数据的抓取构建工作,比如多源知识库融合、知识图谱构建、计算引擎建立等。其中具有代表性的知识图谱应用包括谷歌公司的Knowledge Graph、Facebook推出的实体搜索服务(Graph Search)、百度公司的百度知心、搜狗公司的搜狗知立方等。这些应用的技术可能会有所区别,但相同的是它们在构建过程中都利用了Wikipedia、百度百科、互动百科等在线百科知识。所以本章将教大家分别爬取这三大在线百科。
百科是指天文、地理、自然、人文、宗教、信仰、文学等全部学科的知识的总称,它可以是综合性的,包含所有领域的相关内容;也可以是面向专业性的。接下来将介绍常见的三大在线百科,它们是信息抽取研究的重要语料库之一。
1.Wikipedia
“Wikipedia is a free online encyclopedia with the aim to allow anyone to edit articles.” 这是Wikipedia的官方介绍。Wikipedia是一个基于维基技术的多语言百科全书协作计划,用多种语言编写的网络百科全书。Wikipedia一词取自于该网站核心技术“Wiki”以及具有百科全书之意的“encyclopedia”共同创造出来的新混成词“Wikipedia”,接受任何人编辑。
在所有在线百科中,Wikipedia知识准确性最好,结构化最好,但是Wikipedia本以英文知识为主,涉及的中文知识很少。在线百科页面通常包括:Title(标题)、Description(摘要描述)、InfoBox(消息盒)、Categories(实体类别)、Crosslingual Links(跨语言链接)等。Wikipedia中实体“黄果树瀑布”的中文页面信息如图1所示。
图1所示的Wikipedia信息主要包括:
2.百度百科
百度百科是百度公司推出的一部内容开放、自由的网络百科全书平台。截至2017年4月,百度百科已经收录了超过1432万的词条,参与词条编辑的网友超过610万人,几乎涵盖了所有已知的知识领域。
百度百科旨在创造一个涵盖各领域知识的中文信息收集平台。百度百科强调用户的参与和奉献精神,充分调动互联网用户的力量,汇聚广大用户的头脑智慧,积极进行交流和分享。同时,百度百科实现与百度搜索、百度知道的结合,从不同的层次上满足用户对信息的需求。
与Wikipedia相比,百度百科所包含中文知识最多最广,但是准确性相对较差。百度百科页面也包括:Title(标题)、Description(摘要描述)、InfoBox(消息盒)、Categories(实体类别)、Crosslingual Links(跨语言链接)等。图2为百度百科“Python”网页知识,该网页的消息盒为中间部分,采用键值对(Key-value Pair)的形式,比如“外文名”对应的值为“Python”,“经典教材”对应的值为“Head First Python”等。
3.互动百科
互动百科()是中文百科网站的开拓与领军者,致力于为数亿中文用户免费提供海量、全面、及时的百科信息,并通过全新的维基平台不断改善用户对信息的创作、获取和共享方式。截止到2016年年底,互动百科已经发展成为由超过1100万用户共同打造的拥有1600万词条、2000万张图片、5万个微百科的百科网站,新媒体覆盖人群1000余万人,手机APP用户超2000万。
相对于百度百科而言,互动百科的准确性更高、结构化更好,在专业领域上知识质量较高,故研究者通常会选择互动百科作为主要语料之一。图3显示的是互动百科的首页。
互动百科的信息分为两种形式存储,一种是百科中结构化的信息盒,另一种是百科正文的自由文本。对于百科中的词条文章来说,只有少数词条含有结构化信息盒,但所有词条均含有自由文本。信息盒是采用结构化方式展现词条信息的形式,一个典型的百科信息盒展示例子如图4,显示了Python的InfoBox信息,采用键值对的形式呈现,比如Python的“设计人”为“Guido van Rossum”。
下面分别讲解Selenium技术爬取三大在线百科的消息盒,三大百科的分析方法略有不同。Wikipedia先从列表页面分别获取20国集团(简称G20)各国家的链接,再依次进行网页分析和信息爬取;百度百科调用Selenium自动操作,输入各种编程语言名,再进行访问定位爬取;互动百科采用分析网页的链接url,再去到不同的景点进行分析及信息抓取。
二.Selenium爬取百度百科知识
百度百科作为最大的中文在线百科或中文知识平台,它提供了各行各业的知识,可以供研究者从事各方面的研究。虽然词条的准确率不是最好,但依然可以为从事数据挖掘、知识图谱、自然语言处理、大数据等领域的学者提供很好的知识平台。
1.网页分析
本小节将详细讲解Selenium爬取百度百科消息盒的例子,爬取的主题为10个国家5A级景区,其中景区的名单定义在TXT文件中,然后再定向爬取它们的消息盒信息。其中网页分析的核心步骤如下:
(1) 调用Selenium自动搜索百科关键词
首先,调用Selenium技术访问百度百科首页,网址为:
图5为百度百科首页,其顶部为搜索框,输入相关词条如“故宫”,点击“进入词条”,可以得到故宫词条的详细信息。
然后,在浏览器鼠标选中“进入词条”按钮,右键鼠标点击“审查元素”,可以查看该按钮对应的HTML源代码,如图6所示。注意,不同浏览器查看网页控件或内容对应源代码的称呼是不同的,图中使用的是360安全浏览器,称呼为“审查元素”,而Chrome浏览器称为“检查”,QQ浏览器称为“检查”等。
“进入词条”对应的HTML核心代码如下所示:
调用Selenium函数可以获取输入框input控件。
然后自动输入“故宫”,获取按钮“进入词条”并自动点击,这里采用的方法是在键盘上输入回车键即可访问“故宫”界面,核心代码如下所示:
driver.get("http://baike.baidu.com/") <br />elem_inp=driver.find_element_by_xpath("//form[@id='searchForm']/input") <br />elem_inp.send_keys(name) <br />elem_inp.send_keys(Keys.RETURN) <br />
(2) 调用Selenium访问“故宫”页面并定位消息盒
第一步完成后,进入“故宫”页面然后找到中间消息盒InfoBox部分,右键鼠标并点击“审查元素”,返回结果如图7所示。
消息盒核心代码如下:
消息盒主要采用的形式存储,详细概括了“故宫”实体的信息。例如,属性“中文名称”对应值为“北京故宫”,属性“外文名称”对应值为“Fobidden City”。对应的HTML部分源代码如下。
整个消息盒位于< div class=“basic-info J-basic-info cmn-clearfix” >标签中,接下来是< dl >、< dt >、< dd >一组合HTML标签,其中消息盒div布局共包括两个< dl >…布局,一个是记录消息盒左边部分的内容,另一个< dl >记录了消息盒右部分的内容,每个< dl >标签里再定义属性和属性值,如图8所示。
注意:使用dt、dd最外层必须使用dl包裹,< dl >标签定义了定义列表(Definition List),< dt >标签定义列表中的项目,< dd >标签描述列表中的项目,此组合标签叫做表格标签,与table表格组合标签类似。
接下来调用Selenium扩展包的find_elements_by_xpath()函数分别定位属性和属性值,该函数返回多个属性及属性值集合,再通过for循环输出已定位的多个元素值。代码如下:
elem_name=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dt") <br />elem_value=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dd")<br />for e in elem_name:<br /> print(e.text)<br />for e in elem_value:<br /> print(e.text)<br />
此时,使用Selenium技术爬取百度百科国家5A级景区的分析方法就讲解完了,下面是这部分完整的代码及一些难点。
2.代码实现
注意,接下来我们尝试定义多个Python文件相互调用实现爬虫功能。完整代码包括两个文件,即:
test10_01_baidu.py
# -*- coding: utf-8 -*-<br />"""<br />test10_01_baidu.py<br /> 定义了主函数main并调用getinfo.py文件<br />By:Eastmount CSDN 2021-06-23<br />"""<br />import codecs <br />import getinfo #引用模块<br /><br />#主函数 <br />def main():<br /> #文件读取景点信息 <br /> source = open('data.txt','r',encoding='utf-8') <br /> for name in source: <br /> print(name)<br /> getinfo.getInfobox(name) <br /> print('End Read Files!') <br /> source.close()<br />if __name__ == '__main__':<br /> main()<br />
在代码中调用“import getinfo”代码导入getinfo.py文件,导入之后就可以在main函数中调用getinfo.py文件中的函数和属性,接着我们调用getinfo.py文件中的getInfobox()函数,执行爬取消息盒的操作。
getinfo.py
# coding=utf-8<br /><br />"""<br />getinfo.py:获取信息<br />By:Eastmount CSDN 2021-06-23<br />"""<br />import os <br />import codecs<br />import time<br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys<br /><br />#getInfobox函数: 获取国家5A级景区消息盒 <br />def getInfobox(name): <br /> try: <br /> #访问百度百科并自动搜索<br /> driver = webdriver.Firefox() <br /> driver.get("http://baike.baidu.com/") <br /> elem_inp = driver.find_element_by_xpath("//form[@id='searchForm']/input") <br /> elem_inp.send_keys(name) <br /> elem_inp.send_keys(Keys.RETURN) <br /> time.sleep(1)<br /> print(driver.current_url)<br /> print(driver.title)<br /> <br /> #爬取消息盒InfoBox内容<br /> elem_name=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dt") <br /> elem_value=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dd")<br /> """<br /> for e in elem_name:<br /> print(e.text)<br /> for e in elem_value:<br /> print(e.text)<br /> """<br /><br /> #构建字段成对输出<br /> elem_dic = dict(zip(elem_name,elem_value)) <br /> for key in elem_dic: <br /> print(key.text,elem_dic[key].text)<br /> time.sleep(5)<br /> return<br /> <br /> except Exception as e: <br /> print("Error: ",e)<br /> finally: <br /> print('\n')<br /> driver.close() <br /><br />
比如爬取过程Firefox浏览器会自动搜索“故宫”页面,如下图所示:
最终输出结果如下图所示:
内容如下:
https://baike.baidu.com/item/北京故宫<br />北京故宫_百度百科<br />https://baike.baidu.com/item/% ... %3Bbr />北京故宫_百度百科<br />中文名 北京故宫<br />地理位置 北京市东城区景山前街4号 [91] <br />开放时间 4.1-10.31:08:20-17:00(停止售票16:00,最晚入园16:10) ;11.1-3.31:08:30-16:30(停止售票15:30,最晚入园15:40) ;除法定节假日外每周一闭馆 [6] [91] <br />景点级别 AAAAA级<br />门票价格 60元旺季/40元淡季 [7] <br />占地面积 72万平方米(建筑面积约15万平方米)<br />保护级别 世界文化遗产;第一批全国重点文物保护单位<br />批准单位 联合国教科文组织;中华人民共和国国务院<br />批 号 III-100<br />主要藏品 清明上河图、乾隆款金瓯永固杯、酗亚方樽<br />别 名 紫禁城 [8] <br />官方电话 010-85007057 [92]<br />
Python运行结果如下所示,其中data.txt文件中包括了常见的几个景点。
上述代码属性和属性值通过字典进行组合输出的,核心代码如下:
elem_dic = dict(zip(elem_name,elem_value)) <br />for key in elem_dic: <br /> print(key.text,elem_dic[key].text)<br />
同时,读者可以尝试调用本地的无界面浏览器PhantomJS进行爬取的,调用方法如下:
webdriver.PhantomJS(executable_path="C:\...\phantomjs.exe")<br />
课程作业:
三.Selenium爬取Wikipedia
在线百科是互联网中存在公开的最大数据量的用户生成数据集合,这些数据具有一定的结构,属于半结构化数据,最知名的三大在线百科包括Wikipedia 、百度百科、互动百科。首先,作者将介绍Selenium爬取Wikipedia的实例。
1.网页分析
第一个实例作者将详细讲解Selenium爬取20国家集团(G20)的第一段摘要信息,具体步骤如下:
(1) 从G20列表页面中获取各国超链接
20国集团列表网址如下,Wikipedia采用国家英文单词首写字母进行排序,比如“Japan”、“Italy”、“Brazil”等,每个国家都采用超链接的形式进行跳转。
首先,需要获取20个国家的超链接,然后再去到具体的页面进行爬取。选中一个国家的超链接,比如“China”,右键鼠标并点击“检查”按钮,可以获取对应的HTML源代码,如下所示。
其中超链接位于< div class=“mw-category-group” >布局的< ul >< li >< a >节点下,对应代码:
调用Selenium的find_elements_by_xpath()函数获取节点class属性为“mw-category-group”的超链接,它将返回多个元素。定位超链接的核心代码如下:
driver.get("https://en.wikipedia.org/wiki/ ... 6quot;) <br />elem=driver.find_elements_by_xpath("//div[@class='mw-category-group']/ul/li/a") <br />for e in elem:<br /> print(e.text)<br /> print(e.get_attribute("href"))<br />
函数find_elements_by_xpth()先解析HTML的DOM树形结构并定位到指定节点,并获取其元素。然后定义一个for循环,依次获取节点的内容和href属性,其中e.text表示节点的内容,例如下面节点之间的内容为China。
China<br />
同时,e.get_attribute(“href”)表示获取节点属性href对应的属性值,即“/wiki/China”,同理,e.get_attribute(“title”)可以获取标题title属性,得到值“China”。
此时将获取的超链接存储至变量中如下图,再依次定位到每个国家并获取所需内容。
(2) 调用Selenium定位并爬取各国页面消息盒
接下来开始访问具体的页面,比如中国:
如图所示,可以看到页面的URL、标题、摘要、内容、消息盒等,其中消息盒在途中右部分,包括国家全称、位置等。
下面采用对的形式进行描述,很简明精准地概括了一个网页实体,比如、等信息。通常获取这些信息之后,需要进行预处理操作,之后才能进行数据分析,后面章节将详细讲解。
访问到每个国家的页面后,接下来需要获取每个国家的第一段介绍,本小节讲解的爬虫内容可能比较简单,但是讲解的方法非常重要,包括如何定位节点及爬取知识。详情页面对应的HTML核心部分代码如下:
浏览器审查元素方法如图所示。
正文内容位于属性class为“mw-parser-output”的< div >节点下。在HTML中,< P >标签表示段落,通常用于标识正文,< b >标签表示加粗。获取第一段内容即定位第一个< p >节点即可。核心代码如下:
driver.get("https://en.wikipedia.org/wiki/China") <br />elem=driver.find_element_by_xpath("//div[@class='mw-parser-output']/p[2]").text <br />print elem<br />
注意,正文第一段内容位于第二个< p >段落,故获取p[2]即可。同时,如果读者想从源代码中获取消息盒,则需获取消息盒的位置并抓取数据,消息盒(InfoBox)内容在HTML对应为如下节点,记录了网页实体的核心信息。
...<br />
2.代码实现
完整代码参考文件test10_02.py,如下所示:
# coding=utf-8<br />#By:Eastmount CSDN 2021-06-23<br />import time <br />import re <br />import os <br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys <br /><br />driver = webdriver.Firefox() <br />driver.get("https://en.wikipedia.org/wiki/ ... 6quot;) <br />elem = driver.find_elements_by_xpath("//div[@class='mw-category-group']/ul/li/a")<br />name = [] #国家名<br />urls = [] #国家超链接<br /><br />#爬取链接<br />for e in elem:<br /> print(e.text)<br /> print(e.get_attribute("href"))<br /> name.append(e.text)<br /> urls.append(e.get_attribute("href"))<br />print(name)<br />print(urls)<br /><br />#爬取内容<br />for url in urls:<br /> driver.get(url) <br /> elem = driver.find_element_by_xpath("//div[@class='mw-parser-output']/p[1]").text <br /> print(elem)<br />
其中,爬取的信息如图所示。
PS:该部分大家简单尝试即可,更推荐爬取百度百科、互动百科和搜狗百科。
四.Selenium爬取互动百科
几年过去,互动百科变成了快懂百科,但还好网页结构未变化。
1.网页分析
目前,在线百科已经发展为众多科研工作者从事语义分析、知识图谱构建、自然语言处理、搜索引擎和人工智能等领域的重要语料来源。互动百科作为最热门的在线百科之一,为研究者提供了强大的语料支持。
本小节将讲解一个爬取互动百科最热门的十个编程语言页面的摘要信息,通过该实例加深读者使用Selenium爬虫技术的印象,更加深入地剖析网络数据爬取的分析技巧。不同于Wikipedia先爬取词条列表超链接再爬取所需信息、百度百科输入词条进入相关页面再进行定向爬取,互动百科采用的方法是:
由于互动百科搜索不同词条对应的超链接是存在一定规律的,即采用“常用url+搜索的词条名”方式进行跳转,这里我们通过该方法设置不同的词条网页。具体步骤如下:
(1) 调用Selenium分析URL并搜索互动百科词条
我们首先分析互动百科搜索词条的一些规则,比如搜索人物“贵州”,对应的超链为:
对应页面如图所示,从图中可以看到,顶部的超链接URL、词条为“贵州”、第一段为“贵州”的摘要信息、“右边为对应的图片等信息。
同理,搜索编程语言“Python”,对应的超链接为:
可以得出一个简单的规则,即:
可以搜索对应的知识,如编程语言“Java”对应为:
(2) 访问热门Top10编程语言并爬取摘要
2016年,Github根据各语言过去12个月提交的PR数量进行排名,得出最受欢迎的Top10编程语言分别是:JavaScript、Java、Python、Ruby、PHP、C++、CSS、C#、C和GO语言。
然后,需要分布获取这十门语言的摘要信息。在浏览器中选中摘要部分,右键鼠标点击“审查元素”返回结果如图所示,可以在底部看到摘要部分对应的HTML源代码。
新版本的“快懂百科”内容如下图所示:
“Java”词条摘要部分对应的HTML核心代码如下所示:
调用Selenium的find_element_by_xpath()函数,可以获取摘要段落信息,核心代码如下。
driver = webdriver.Firefox()<br />url = "http://www.baike.com/wiki/" + name<br />driver.get(url)<br />elem = driver.find_element_by_xpath("//div[@class='summary']/div/span") <br />print(elem.text)<br />
这段代码的基本步骤是:
下面是完整的代码及详细讲解。
2.代码实现
完整代码为blog10_03.py如下所示,主函数main()中循环调用getgetAbstract()函数爬取Top10编程语言的摘要信息。
# coding=utf-8 <br />#By:Eastmount CSDN 2021-06-23 <br />import os <br />import codecs<br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys <br /><br />driver = webdriver.Firefox()<br /><br />#获取摘要信息<br />def getAbstract(name): <br /> try:<br /> #新建文件夹及文件<br /> basePathDirectory = "Hudong_Coding" <br /> if not os.path.exists(basePathDirectory): <br /> os.makedirs(basePathDirectory) <br /> baiduFile = os.path.join(basePathDirectory,"HudongSpider.txt")<br /> #文件不存在新建,存在则追加写入<br /> if not os.path.exists(baiduFile): <br /> info = codecs.open(baiduFile,'w','utf-8') <br /> else: <br /> info = codecs.open(baiduFile,'a','utf-8') <br /><br /> url = "http://www.baike.com/wiki/" + name<br /> print(url)<br /> driver.get(url) <br /> elem = driver.find_elements_by_xpath("//div[@class='summary']/div/span")<br /> content = ""<br /> for e in elem:<br /> content += e.text<br /> print(content)<br /> info.writelines(content+'\r\n') <br /> <br /> except Exception as e: <br /> print("Error: ",e) <br /> finally: <br /> print('\n') <br /> info.write('\r\n') <br /> <br />#主函数 <br />def main():<br /> languages = ["JavaScript", "Java", "Python", "Ruby", "PHP",<br /> "C++", "CSS", "C#", "C", "GO"]<br /> print('开始爬取')<br /> for lg in languages: <br /> print(lg)<br /> getAbstract(lg) <br /> print('结束爬取')<br /><br />if __name__ == '__main__':<br /> main() <br />
其中“JavaScript”和“Java”编程语言的抓取结果如图所示,该段代码爬取了热门十门语言在互动百科中的摘要信息。
程序成功抓取了各个编程语言的摘要信息,如下图所示:
同时将数据存储至本地TXT文件中,这将有效为NLP和文本挖掘进行一步分析提供支撑。
写到这里,几种常见的百科数据抓取方法就介绍完毕了,希望您喜欢。
五.总结
在线百科被广泛应用于科研工作、知识图谱和搜索引擎构建、大小型公司数据集成、Web2.0知识库系统中,由于其公开、动态、可自由访问和编辑、拥有多语言版本等特点,它深受科研工作者和公司开发人员的喜爱,常见的在线百科包括Wikipedia、百度百科和互动百科等。
本文结合Selenium技术分别爬取了Wikipedia的段落内容、百度百科的消息盒和互动百科的摘要信息,并采用了三种分析方法,希望读者通过该章节的案例掌握Selenium技术爬取网页的方法。
Selenium用得更广泛的领域是自动化测试,它直接运行在浏览器中(如Firefox、Chrome、IE等),就像真实用户操作一样,对开发的网页进行各式各样的测试,它更是自动化测试方向的必备工具。希望读者能掌握这种技术的爬取方法,尤其是目标网页需要验证登录等情形。
该系列所有代码下载地址:
感谢在求学路上的同行者,不负遇见,勿忘初心。这周的留言感慨~
(By:娜璋 2021-08-20夜于景怡)
前文赏析:
第一部分 基础语法
第二部分 网络爬虫
参考文献 查看全部
php用正则表达抓取网页中文章 [Python从零到壹] 十
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。
Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上共同成长。
前一篇文章讲述了Selenium基础技术,涉及基础入门、元素定位、常用方法和属性、鼠标操作、键盘操作和导航控制。本文将结合具体实例进行深入地分析,通过三个基于Selenium技术的爬虫,爬取Wikipedia、百度百科和互动百科消息盒的例子,从实际应用出发来学习利用。基础性文章,希望对您有所帮助。
在线百科是基于Wiki技术的、动态的、免费的、可自由访问和编辑的多语言百科全书的Web2.0知识库系统。它是互联网中公开的、最大数量的用户生成的知识库,并且具有知识面覆盖度广、结构化程度高、信息更新速度快和开放性好等优势。其中被广泛使用的三大在线百科包括Wikipedia、百度百科和互动百科。
文章目录:
下载地址:
作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。
一.三大在线百科
随着互联网和大数据的飞速发展,我们需要从海量信息中挖掘出有价值的信息,而在收集这些海量信息过程中,通常都会涉及到底层数据的抓取构建工作,比如多源知识库融合、知识图谱构建、计算引擎建立等。其中具有代表性的知识图谱应用包括谷歌公司的Knowledge Graph、Facebook推出的实体搜索服务(Graph Search)、百度公司的百度知心、搜狗公司的搜狗知立方等。这些应用的技术可能会有所区别,但相同的是它们在构建过程中都利用了Wikipedia、百度百科、互动百科等在线百科知识。所以本章将教大家分别爬取这三大在线百科。
百科是指天文、地理、自然、人文、宗教、信仰、文学等全部学科的知识的总称,它可以是综合性的,包含所有领域的相关内容;也可以是面向专业性的。接下来将介绍常见的三大在线百科,它们是信息抽取研究的重要语料库之一。
1.Wikipedia
“Wikipedia is a free online encyclopedia with the aim to allow anyone to edit articles.” 这是Wikipedia的官方介绍。Wikipedia是一个基于维基技术的多语言百科全书协作计划,用多种语言编写的网络百科全书。Wikipedia一词取自于该网站核心技术“Wiki”以及具有百科全书之意的“encyclopedia”共同创造出来的新混成词“Wikipedia”,接受任何人编辑。
在所有在线百科中,Wikipedia知识准确性最好,结构化最好,但是Wikipedia本以英文知识为主,涉及的中文知识很少。在线百科页面通常包括:Title(标题)、Description(摘要描述)、InfoBox(消息盒)、Categories(实体类别)、Crosslingual Links(跨语言链接)等。Wikipedia中实体“黄果树瀑布”的中文页面信息如图1所示。
图1所示的Wikipedia信息主要包括:
2.百度百科
百度百科是百度公司推出的一部内容开放、自由的网络百科全书平台。截至2017年4月,百度百科已经收录了超过1432万的词条,参与词条编辑的网友超过610万人,几乎涵盖了所有已知的知识领域。
百度百科旨在创造一个涵盖各领域知识的中文信息收集平台。百度百科强调用户的参与和奉献精神,充分调动互联网用户的力量,汇聚广大用户的头脑智慧,积极进行交流和分享。同时,百度百科实现与百度搜索、百度知道的结合,从不同的层次上满足用户对信息的需求。
与Wikipedia相比,百度百科所包含中文知识最多最广,但是准确性相对较差。百度百科页面也包括:Title(标题)、Description(摘要描述)、InfoBox(消息盒)、Categories(实体类别)、Crosslingual Links(跨语言链接)等。图2为百度百科“Python”网页知识,该网页的消息盒为中间部分,采用键值对(Key-value Pair)的形式,比如“外文名”对应的值为“Python”,“经典教材”对应的值为“Head First Python”等。
3.互动百科
互动百科()是中文百科网站的开拓与领军者,致力于为数亿中文用户免费提供海量、全面、及时的百科信息,并通过全新的维基平台不断改善用户对信息的创作、获取和共享方式。截止到2016年年底,互动百科已经发展成为由超过1100万用户共同打造的拥有1600万词条、2000万张图片、5万个微百科的百科网站,新媒体覆盖人群1000余万人,手机APP用户超2000万。
相对于百度百科而言,互动百科的准确性更高、结构化更好,在专业领域上知识质量较高,故研究者通常会选择互动百科作为主要语料之一。图3显示的是互动百科的首页。
互动百科的信息分为两种形式存储,一种是百科中结构化的信息盒,另一种是百科正文的自由文本。对于百科中的词条文章来说,只有少数词条含有结构化信息盒,但所有词条均含有自由文本。信息盒是采用结构化方式展现词条信息的形式,一个典型的百科信息盒展示例子如图4,显示了Python的InfoBox信息,采用键值对的形式呈现,比如Python的“设计人”为“Guido van Rossum”。
下面分别讲解Selenium技术爬取三大在线百科的消息盒,三大百科的分析方法略有不同。Wikipedia先从列表页面分别获取20国集团(简称G20)各国家的链接,再依次进行网页分析和信息爬取;百度百科调用Selenium自动操作,输入各种编程语言名,再进行访问定位爬取;互动百科采用分析网页的链接url,再去到不同的景点进行分析及信息抓取。
二.Selenium爬取百度百科知识
百度百科作为最大的中文在线百科或中文知识平台,它提供了各行各业的知识,可以供研究者从事各方面的研究。虽然词条的准确率不是最好,但依然可以为从事数据挖掘、知识图谱、自然语言处理、大数据等领域的学者提供很好的知识平台。
1.网页分析
本小节将详细讲解Selenium爬取百度百科消息盒的例子,爬取的主题为10个国家5A级景区,其中景区的名单定义在TXT文件中,然后再定向爬取它们的消息盒信息。其中网页分析的核心步骤如下:
(1) 调用Selenium自动搜索百科关键词
首先,调用Selenium技术访问百度百科首页,网址为:
图5为百度百科首页,其顶部为搜索框,输入相关词条如“故宫”,点击“进入词条”,可以得到故宫词条的详细信息。
然后,在浏览器鼠标选中“进入词条”按钮,右键鼠标点击“审查元素”,可以查看该按钮对应的HTML源代码,如图6所示。注意,不同浏览器查看网页控件或内容对应源代码的称呼是不同的,图中使用的是360安全浏览器,称呼为“审查元素”,而Chrome浏览器称为“检查”,QQ浏览器称为“检查”等。
“进入词条”对应的HTML核心代码如下所示:
调用Selenium函数可以获取输入框input控件。
然后自动输入“故宫”,获取按钮“进入词条”并自动点击,这里采用的方法是在键盘上输入回车键即可访问“故宫”界面,核心代码如下所示:
driver.get("http://baike.baidu.com/") <br />elem_inp=driver.find_element_by_xpath("//form[@id='searchForm']/input") <br />elem_inp.send_keys(name) <br />elem_inp.send_keys(Keys.RETURN) <br />
(2) 调用Selenium访问“故宫”页面并定位消息盒
第一步完成后,进入“故宫”页面然后找到中间消息盒InfoBox部分,右键鼠标并点击“审查元素”,返回结果如图7所示。
消息盒核心代码如下:
消息盒主要采用的形式存储,详细概括了“故宫”实体的信息。例如,属性“中文名称”对应值为“北京故宫”,属性“外文名称”对应值为“Fobidden City”。对应的HTML部分源代码如下。
整个消息盒位于< div class=“basic-info J-basic-info cmn-clearfix” >标签中,接下来是< dl >、< dt >、< dd >一组合HTML标签,其中消息盒div布局共包括两个< dl >…布局,一个是记录消息盒左边部分的内容,另一个< dl >记录了消息盒右部分的内容,每个< dl >标签里再定义属性和属性值,如图8所示。
注意:使用dt、dd最外层必须使用dl包裹,< dl >标签定义了定义列表(Definition List),< dt >标签定义列表中的项目,< dd >标签描述列表中的项目,此组合标签叫做表格标签,与table表格组合标签类似。
接下来调用Selenium扩展包的find_elements_by_xpath()函数分别定位属性和属性值,该函数返回多个属性及属性值集合,再通过for循环输出已定位的多个元素值。代码如下:
elem_name=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dt") <br />elem_value=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dd")<br />for e in elem_name:<br /> print(e.text)<br />for e in elem_value:<br /> print(e.text)<br />
此时,使用Selenium技术爬取百度百科国家5A级景区的分析方法就讲解完了,下面是这部分完整的代码及一些难点。
2.代码实现
注意,接下来我们尝试定义多个Python文件相互调用实现爬虫功能。完整代码包括两个文件,即:
test10_01_baidu.py
# -*- coding: utf-8 -*-<br />"""<br />test10_01_baidu.py<br /> 定义了主函数main并调用getinfo.py文件<br />By:Eastmount CSDN 2021-06-23<br />"""<br />import codecs <br />import getinfo #引用模块<br /><br />#主函数 <br />def main():<br /> #文件读取景点信息 <br /> source = open('data.txt','r',encoding='utf-8') <br /> for name in source: <br /> print(name)<br /> getinfo.getInfobox(name) <br /> print('End Read Files!') <br /> source.close()<br />if __name__ == '__main__':<br /> main()<br />
在代码中调用“import getinfo”代码导入getinfo.py文件,导入之后就可以在main函数中调用getinfo.py文件中的函数和属性,接着我们调用getinfo.py文件中的getInfobox()函数,执行爬取消息盒的操作。
getinfo.py
# coding=utf-8<br /><br />"""<br />getinfo.py:获取信息<br />By:Eastmount CSDN 2021-06-23<br />"""<br />import os <br />import codecs<br />import time<br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys<br /><br />#getInfobox函数: 获取国家5A级景区消息盒 <br />def getInfobox(name): <br /> try: <br /> #访问百度百科并自动搜索<br /> driver = webdriver.Firefox() <br /> driver.get("http://baike.baidu.com/") <br /> elem_inp = driver.find_element_by_xpath("//form[@id='searchForm']/input") <br /> elem_inp.send_keys(name) <br /> elem_inp.send_keys(Keys.RETURN) <br /> time.sleep(1)<br /> print(driver.current_url)<br /> print(driver.title)<br /> <br /> #爬取消息盒InfoBox内容<br /> elem_name=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dt") <br /> elem_value=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dd")<br /> """<br /> for e in elem_name:<br /> print(e.text)<br /> for e in elem_value:<br /> print(e.text)<br /> """<br /><br /> #构建字段成对输出<br /> elem_dic = dict(zip(elem_name,elem_value)) <br /> for key in elem_dic: <br /> print(key.text,elem_dic[key].text)<br /> time.sleep(5)<br /> return<br /> <br /> except Exception as e: <br /> print("Error: ",e)<br /> finally: <br /> print('\n')<br /> driver.close() <br /><br />
比如爬取过程Firefox浏览器会自动搜索“故宫”页面,如下图所示:
最终输出结果如下图所示:
内容如下:
https://baike.baidu.com/item/北京故宫<br />北京故宫_百度百科<br />https://baike.baidu.com/item/% ... %3Bbr />北京故宫_百度百科<br />中文名 北京故宫<br />地理位置 北京市东城区景山前街4号 [91] <br />开放时间 4.1-10.31:08:20-17:00(停止售票16:00,最晚入园16:10) ;11.1-3.31:08:30-16:30(停止售票15:30,最晚入园15:40) ;除法定节假日外每周一闭馆 [6] [91] <br />景点级别 AAAAA级<br />门票价格 60元旺季/40元淡季 [7] <br />占地面积 72万平方米(建筑面积约15万平方米)<br />保护级别 世界文化遗产;第一批全国重点文物保护单位<br />批准单位 联合国教科文组织;中华人民共和国国务院<br />批 号 III-100<br />主要藏品 清明上河图、乾隆款金瓯永固杯、酗亚方樽<br />别 名 紫禁城 [8] <br />官方电话 010-85007057 [92]<br />
Python运行结果如下所示,其中data.txt文件中包括了常见的几个景点。
上述代码属性和属性值通过字典进行组合输出的,核心代码如下:
elem_dic = dict(zip(elem_name,elem_value)) <br />for key in elem_dic: <br /> print(key.text,elem_dic[key].text)<br />
同时,读者可以尝试调用本地的无界面浏览器PhantomJS进行爬取的,调用方法如下:
webdriver.PhantomJS(executable_path="C:\...\phantomjs.exe")<br />
课程作业:
三.Selenium爬取Wikipedia
在线百科是互联网中存在公开的最大数据量的用户生成数据集合,这些数据具有一定的结构,属于半结构化数据,最知名的三大在线百科包括Wikipedia 、百度百科、互动百科。首先,作者将介绍Selenium爬取Wikipedia的实例。
1.网页分析
第一个实例作者将详细讲解Selenium爬取20国家集团(G20)的第一段摘要信息,具体步骤如下:
(1) 从G20列表页面中获取各国超链接
20国集团列表网址如下,Wikipedia采用国家英文单词首写字母进行排序,比如“Japan”、“Italy”、“Brazil”等,每个国家都采用超链接的形式进行跳转。
首先,需要获取20个国家的超链接,然后再去到具体的页面进行爬取。选中一个国家的超链接,比如“China”,右键鼠标并点击“检查”按钮,可以获取对应的HTML源代码,如下所示。
其中超链接位于< div class=“mw-category-group” >布局的< ul >< li >< a >节点下,对应代码:
调用Selenium的find_elements_by_xpath()函数获取节点class属性为“mw-category-group”的超链接,它将返回多个元素。定位超链接的核心代码如下:
driver.get("https://en.wikipedia.org/wiki/ ... 6quot;) <br />elem=driver.find_elements_by_xpath("//div[@class='mw-category-group']/ul/li/a") <br />for e in elem:<br /> print(e.text)<br /> print(e.get_attribute("href"))<br />
函数find_elements_by_xpth()先解析HTML的DOM树形结构并定位到指定节点,并获取其元素。然后定义一个for循环,依次获取节点的内容和href属性,其中e.text表示节点的内容,例如下面节点之间的内容为China。
China<br />
同时,e.get_attribute(“href”)表示获取节点属性href对应的属性值,即“/wiki/China”,同理,e.get_attribute(“title”)可以获取标题title属性,得到值“China”。
此时将获取的超链接存储至变量中如下图,再依次定位到每个国家并获取所需内容。
(2) 调用Selenium定位并爬取各国页面消息盒
接下来开始访问具体的页面,比如中国:
如图所示,可以看到页面的URL、标题、摘要、内容、消息盒等,其中消息盒在途中右部分,包括国家全称、位置等。
下面采用对的形式进行描述,很简明精准地概括了一个网页实体,比如、等信息。通常获取这些信息之后,需要进行预处理操作,之后才能进行数据分析,后面章节将详细讲解。
访问到每个国家的页面后,接下来需要获取每个国家的第一段介绍,本小节讲解的爬虫内容可能比较简单,但是讲解的方法非常重要,包括如何定位节点及爬取知识。详情页面对应的HTML核心部分代码如下:
浏览器审查元素方法如图所示。
正文内容位于属性class为“mw-parser-output”的< div >节点下。在HTML中,< P >标签表示段落,通常用于标识正文,< b >标签表示加粗。获取第一段内容即定位第一个< p >节点即可。核心代码如下:
driver.get("https://en.wikipedia.org/wiki/China") <br />elem=driver.find_element_by_xpath("//div[@class='mw-parser-output']/p[2]").text <br />print elem<br />
注意,正文第一段内容位于第二个< p >段落,故获取p[2]即可。同时,如果读者想从源代码中获取消息盒,则需获取消息盒的位置并抓取数据,消息盒(InfoBox)内容在HTML对应为如下节点,记录了网页实体的核心信息。
...<br />
2.代码实现
完整代码参考文件test10_02.py,如下所示:
# coding=utf-8<br />#By:Eastmount CSDN 2021-06-23<br />import time <br />import re <br />import os <br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys <br /><br />driver = webdriver.Firefox() <br />driver.get("https://en.wikipedia.org/wiki/ ... 6quot;) <br />elem = driver.find_elements_by_xpath("//div[@class='mw-category-group']/ul/li/a")<br />name = [] #国家名<br />urls = [] #国家超链接<br /><br />#爬取链接<br />for e in elem:<br /> print(e.text)<br /> print(e.get_attribute("href"))<br /> name.append(e.text)<br /> urls.append(e.get_attribute("href"))<br />print(name)<br />print(urls)<br /><br />#爬取内容<br />for url in urls:<br /> driver.get(url) <br /> elem = driver.find_element_by_xpath("//div[@class='mw-parser-output']/p[1]").text <br /> print(elem)<br />
其中,爬取的信息如图所示。
PS:该部分大家简单尝试即可,更推荐爬取百度百科、互动百科和搜狗百科。
四.Selenium爬取互动百科
几年过去,互动百科变成了快懂百科,但还好网页结构未变化。
1.网页分析
目前,在线百科已经发展为众多科研工作者从事语义分析、知识图谱构建、自然语言处理、搜索引擎和人工智能等领域的重要语料来源。互动百科作为最热门的在线百科之一,为研究者提供了强大的语料支持。
本小节将讲解一个爬取互动百科最热门的十个编程语言页面的摘要信息,通过该实例加深读者使用Selenium爬虫技术的印象,更加深入地剖析网络数据爬取的分析技巧。不同于Wikipedia先爬取词条列表超链接再爬取所需信息、百度百科输入词条进入相关页面再进行定向爬取,互动百科采用的方法是:
由于互动百科搜索不同词条对应的超链接是存在一定规律的,即采用“常用url+搜索的词条名”方式进行跳转,这里我们通过该方法设置不同的词条网页。具体步骤如下:
(1) 调用Selenium分析URL并搜索互动百科词条
我们首先分析互动百科搜索词条的一些规则,比如搜索人物“贵州”,对应的超链为:
对应页面如图所示,从图中可以看到,顶部的超链接URL、词条为“贵州”、第一段为“贵州”的摘要信息、“右边为对应的图片等信息。
同理,搜索编程语言“Python”,对应的超链接为:
可以得出一个简单的规则,即:
可以搜索对应的知识,如编程语言“Java”对应为:
(2) 访问热门Top10编程语言并爬取摘要
2016年,Github根据各语言过去12个月提交的PR数量进行排名,得出最受欢迎的Top10编程语言分别是:JavaScript、Java、Python、Ruby、PHP、C++、CSS、C#、C和GO语言。
然后,需要分布获取这十门语言的摘要信息。在浏览器中选中摘要部分,右键鼠标点击“审查元素”返回结果如图所示,可以在底部看到摘要部分对应的HTML源代码。
新版本的“快懂百科”内容如下图所示:
“Java”词条摘要部分对应的HTML核心代码如下所示:
调用Selenium的find_element_by_xpath()函数,可以获取摘要段落信息,核心代码如下。
driver = webdriver.Firefox()<br />url = "http://www.baike.com/wiki/" + name<br />driver.get(url)<br />elem = driver.find_element_by_xpath("//div[@class='summary']/div/span") <br />print(elem.text)<br />
这段代码的基本步骤是:
下面是完整的代码及详细讲解。
2.代码实现
完整代码为blog10_03.py如下所示,主函数main()中循环调用getgetAbstract()函数爬取Top10编程语言的摘要信息。
# coding=utf-8 <br />#By:Eastmount CSDN 2021-06-23 <br />import os <br />import codecs<br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys <br /><br />driver = webdriver.Firefox()<br /><br />#获取摘要信息<br />def getAbstract(name): <br /> try:<br /> #新建文件夹及文件<br /> basePathDirectory = "Hudong_Coding" <br /> if not os.path.exists(basePathDirectory): <br /> os.makedirs(basePathDirectory) <br /> baiduFile = os.path.join(basePathDirectory,"HudongSpider.txt")<br /> #文件不存在新建,存在则追加写入<br /> if not os.path.exists(baiduFile): <br /> info = codecs.open(baiduFile,'w','utf-8') <br /> else: <br /> info = codecs.open(baiduFile,'a','utf-8') <br /><br /> url = "http://www.baike.com/wiki/" + name<br /> print(url)<br /> driver.get(url) <br /> elem = driver.find_elements_by_xpath("//div[@class='summary']/div/span")<br /> content = ""<br /> for e in elem:<br /> content += e.text<br /> print(content)<br /> info.writelines(content+'\r\n') <br /> <br /> except Exception as e: <br /> print("Error: ",e) <br /> finally: <br /> print('\n') <br /> info.write('\r\n') <br /> <br />#主函数 <br />def main():<br /> languages = ["JavaScript", "Java", "Python", "Ruby", "PHP",<br /> "C++", "CSS", "C#", "C", "GO"]<br /> print('开始爬取')<br /> for lg in languages: <br /> print(lg)<br /> getAbstract(lg) <br /> print('结束爬取')<br /><br />if __name__ == '__main__':<br /> main() <br />
其中“JavaScript”和“Java”编程语言的抓取结果如图所示,该段代码爬取了热门十门语言在互动百科中的摘要信息。
程序成功抓取了各个编程语言的摘要信息,如下图所示:
同时将数据存储至本地TXT文件中,这将有效为NLP和文本挖掘进行一步分析提供支撑。
写到这里,几种常见的百科数据抓取方法就介绍完毕了,希望您喜欢。
五.总结
在线百科被广泛应用于科研工作、知识图谱和搜索引擎构建、大小型公司数据集成、Web2.0知识库系统中,由于其公开、动态、可自由访问和编辑、拥有多语言版本等特点,它深受科研工作者和公司开发人员的喜爱,常见的在线百科包括Wikipedia、百度百科和互动百科等。
本文结合Selenium技术分别爬取了Wikipedia的段落内容、百度百科的消息盒和互动百科的摘要信息,并采用了三种分析方法,希望读者通过该章节的案例掌握Selenium技术爬取网页的方法。
Selenium用得更广泛的领域是自动化测试,它直接运行在浏览器中(如Firefox、Chrome、IE等),就像真实用户操作一样,对开发的网页进行各式各样的测试,它更是自动化测试方向的必备工具。希望读者能掌握这种技术的爬取方法,尤其是目标网页需要验证登录等情形。
该系列所有代码下载地址:
感谢在求学路上的同行者,不负遇见,勿忘初心。这周的留言感慨~
(By:娜璋 2021-08-20夜于景怡)
前文赏析:
第一部分 基础语法
第二部分 网络爬虫
参考文献
牛逼操作!我用Python做了一个编程语言20年的动态排行榜!
网站优化 • 优采云 发表了文章 • 0 个评论 • 91 次浏览 • 2022-05-29 16:35
在编程语言的舞台上,一直有着谁是最好的语言的竞争,小编虽然一直用着几种编程语言,但是感觉个人的想法不能代表着大家的想法。虽然关于最好语言的争论从未停止过,但是关于编程语言的热度排名,我们可以从TIOBE 编程语言排行榜上进行探索。
今天,小编就带领大家爬取一下,自2001年5月至今,TIOBE 编程语言排行榜上编程语言的变化情况,看一下在接近20年的时间里,编程语言的热度是如何变化的。
01.编程语言资料获取
首先我们是进行的是资料的获取,我们打开链接,就可以看到TIOBE编程语言的排行榜,通过查看其网页源代码,可以发现,我们想要爬取的资料,都显示在网页源代码里,如下图所示:
接下来就可以直接利用爬虫来获取网页源代码,并利用正则表达式来匹配我们需要的关键字内容,部分程序如下图所示:
上述程序中,我们对于抓取到的数据,进行正则表达式匹配,然后提取各个编程语言在不同时间段的热度数值,并保存到本地的文件中。
02.清洗数据
接下来,我们要完成的就是利用动态可视化的柱状图来观察各种编程语言随着时间的热度变化。我们先对数据进行清洗,获取编程语言的名字一起设置一个嵌套的字典,程序如下图所示:
上述程序中的嵌套字典含义为每一个月份下的每种编程语言的热度值,其结构格式如下所示:
{“2020-1-12”:{“Java”:16, “C++”:14, “python”:10,…}, “2020-2-13”:{“Java”:16.3, “C++”:15.6, …},…}。
03.设置柱状图的颜色
为了在可视化过程中区分每一种编程语言,需要为柱状图中的每一柱都设置不同的颜色,同时,将嵌套字典按照月份的顺序进行排序,程序如下所示:
04.大功告成,动态显示
最后,我们便可以对数据进行可视化的展示,程序如下图所示:
上述程序中,首先需要清除figure 中的活动轴,我们对于嵌套字典的每一个月份,将每一个月份中的编程语言,按照其热度值进行从小到大的排序,然后将排序号的编程语言,关联其对应的柱状图颜色。
05.动态现实图
接下来就可以画出我们的柱状图,然后暂停显示结果,并不断循环,从而达到动态柱状图的功能,其效果如下图所示:
06.更炫酷的动态图
如果大家觉得图做的不够优美,大家可以利用js进行数据渲染制作,这里小编也为大家利用Flourish制作了一个更加好看的界面,如下图所示:
从上面的可视化动图可以看出,Java和C语言一直是牢牢地掌控着编程语言热度前两名的宝座,而python语言,凭借着人工智能的热潮,逐渐的从排名末尾,一路追赶,排名在第三位,并逐渐拉开了与第四名的差距,可谓是编程语言界的逆袭王者。
而像是C++和PHP,其热度却逐渐的走低。虽然编程语言热度有高有低,但是不可否认的是,每一门编程语言,都有其应用的价值,能够在编程语言的历史长河中历经洗礼,而没有被淘汰,只要好好掌握一门语言,都会有用武之地。
感谢阅读<p style="max-width: 100%;min-height: 1em;box-sizing: border-box !important;overflow-wrap: break-word !important;">推荐阅读:
1:真实的上海IT圈:张江男vs漕河泾男
2:真实的北京IT圈:后厂村姑 vs 后厂村花?
3:为什么你的提问没人解答?
4:Python爱好者社区历史文章合集
<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
重磅!Python交流群已成立<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />公众号运营至今,离不开小伙伴们的支持。<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />为了给小伙伴们提供一个互相交流的技术平台,特地开通了Python交流群。群里有不少技术大神,不时会分享一些技术要点,更有一些资源收藏爱好者不时分享一些优质的学习资料。(免费,不卖课!)
需要进群的朋友,可长按扫描下方二维码。
<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
▲长按扫码</p> 查看全部
牛逼操作!我用Python做了一个编程语言20年的动态排行榜!
在编程语言的舞台上,一直有着谁是最好的语言的竞争,小编虽然一直用着几种编程语言,但是感觉个人的想法不能代表着大家的想法。虽然关于最好语言的争论从未停止过,但是关于编程语言的热度排名,我们可以从TIOBE 编程语言排行榜上进行探索。
今天,小编就带领大家爬取一下,自2001年5月至今,TIOBE 编程语言排行榜上编程语言的变化情况,看一下在接近20年的时间里,编程语言的热度是如何变化的。
01.编程语言资料获取
首先我们是进行的是资料的获取,我们打开链接,就可以看到TIOBE编程语言的排行榜,通过查看其网页源代码,可以发现,我们想要爬取的资料,都显示在网页源代码里,如下图所示:
接下来就可以直接利用爬虫来获取网页源代码,并利用正则表达式来匹配我们需要的关键字内容,部分程序如下图所示:
上述程序中,我们对于抓取到的数据,进行正则表达式匹配,然后提取各个编程语言在不同时间段的热度数值,并保存到本地的文件中。
02.清洗数据
接下来,我们要完成的就是利用动态可视化的柱状图来观察各种编程语言随着时间的热度变化。我们先对数据进行清洗,获取编程语言的名字一起设置一个嵌套的字典,程序如下图所示:
上述程序中的嵌套字典含义为每一个月份下的每种编程语言的热度值,其结构格式如下所示:
{“2020-1-12”:{“Java”:16, “C++”:14, “python”:10,…}, “2020-2-13”:{“Java”:16.3, “C++”:15.6, …},…}。
03.设置柱状图的颜色
为了在可视化过程中区分每一种编程语言,需要为柱状图中的每一柱都设置不同的颜色,同时,将嵌套字典按照月份的顺序进行排序,程序如下所示:
04.大功告成,动态显示
最后,我们便可以对数据进行可视化的展示,程序如下图所示:
上述程序中,首先需要清除figure 中的活动轴,我们对于嵌套字典的每一个月份,将每一个月份中的编程语言,按照其热度值进行从小到大的排序,然后将排序号的编程语言,关联其对应的柱状图颜色。
05.动态现实图
接下来就可以画出我们的柱状图,然后暂停显示结果,并不断循环,从而达到动态柱状图的功能,其效果如下图所示:
06.更炫酷的动态图
如果大家觉得图做的不够优美,大家可以利用js进行数据渲染制作,这里小编也为大家利用Flourish制作了一个更加好看的界面,如下图所示:
从上面的可视化动图可以看出,Java和C语言一直是牢牢地掌控着编程语言热度前两名的宝座,而python语言,凭借着人工智能的热潮,逐渐的从排名末尾,一路追赶,排名在第三位,并逐渐拉开了与第四名的差距,可谓是编程语言界的逆袭王者。
而像是C++和PHP,其热度却逐渐的走低。虽然编程语言热度有高有低,但是不可否认的是,每一门编程语言,都有其应用的价值,能够在编程语言的历史长河中历经洗礼,而没有被淘汰,只要好好掌握一门语言,都会有用武之地。
感谢阅读
1:真实的上海IT圈:张江男vs漕河泾男
2:真实的北京IT圈:后厂村姑 vs 后厂村花?
3:为什么你的提问没人解答?
4:Python爱好者社区历史文章合集
<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
重磅!Python交流群已成立<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />公众号运营至今,离不开小伙伴们的支持。<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />为了给小伙伴们提供一个互相交流的技术平台,特地开通了Python交流群。群里有不少技术大神,不时会分享一些技术要点,更有一些资源收藏爱好者不时分享一些优质的学习资料。(免费,不卖课!)
需要进群的朋友,可长按扫描下方二维码。
▲长按扫码</p>
php用正则表达抓取网页中文章对于php和python程序员来说
网站优化 • 优采云 发表了文章 • 0 个评论 • 94 次浏览 • 2022-05-21 15:01
php用正则表达抓取网页中文章对于php和python程序员来说,有个抓取网页中文章的方法。google正则表达式引擎可以自动判断文章中的某个字符是否可以用正则表达式表示出来。你可以利用这个自动找到该字符所对应的正则表达式。正则表达式引擎用于匹配网页中所有可用正则表达式字符,但正则表达式引擎只是找到用作正则表达式匹配的字符,而且只能匹配到php的文章。
常用正则表达式有:匹配html字符串,匹配正则表达式,匹配php中任意字符,如:匹配html文本第一个字符第二个字符不可匹配:其他正则表达式匹配php中任意一个字符bashb格式正则表达式大多都以包含行开头,一些常用正则表达式中会包含空行,来避免字符串空格对正则表达式所造成的额外影响。在re和grep引擎中,正则表达式引擎是必要的。
正则表达式中第一个字符必须用正则表达式表示,即只能匹配字符串的开头,并以一个正则表达式开头,如下表所示。正则表达式必须匹配特定的字符,大家可以用正则表达式库来验证一下,如:site.text例子中(text)中,(00。
0)代表正则表达式(000
0)正确,而不是上面表格第四个字符的错误。然后,我们需要将正则表达式传递给grep和re模块进行匹配查找,如下所示:re库正则表达式匹配000000-255555,然后我们可以得到正则表达式,end。
(-255555
5)---(000000
1)---(000000
2)---(000000
3)---(000000
4)正则表达式模块匹配11111111。 查看全部
php用正则表达抓取网页中文章对于php和python程序员来说
php用正则表达抓取网页中文章对于php和python程序员来说,有个抓取网页中文章的方法。google正则表达式引擎可以自动判断文章中的某个字符是否可以用正则表达式表示出来。你可以利用这个自动找到该字符所对应的正则表达式。正则表达式引擎用于匹配网页中所有可用正则表达式字符,但正则表达式引擎只是找到用作正则表达式匹配的字符,而且只能匹配到php的文章。
常用正则表达式有:匹配html字符串,匹配正则表达式,匹配php中任意字符,如:匹配html文本第一个字符第二个字符不可匹配:其他正则表达式匹配php中任意一个字符bashb格式正则表达式大多都以包含行开头,一些常用正则表达式中会包含空行,来避免字符串空格对正则表达式所造成的额外影响。在re和grep引擎中,正则表达式引擎是必要的。
正则表达式中第一个字符必须用正则表达式表示,即只能匹配字符串的开头,并以一个正则表达式开头,如下表所示。正则表达式必须匹配特定的字符,大家可以用正则表达式库来验证一下,如:site.text例子中(text)中,(00。
0)代表正则表达式(000
0)正确,而不是上面表格第四个字符的错误。然后,我们需要将正则表达式传递给grep和re模块进行匹配查找,如下所示:re库正则表达式匹配000000-255555,然后我们可以得到正则表达式,end。
(-255555
5)---(000000
1)---(000000
2)---(000000
3)---(000000
4)正则表达式模块匹配11111111。
php用正则表达抓取网页中文章信息中文分词器抓取
网站优化 • 优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2022-05-13 15:01
php用正则表达抓取网页中文章信息中文分词器qpanda抓取百度首页贴吧抓取爱奇艺视频分享链接抓取网易云音乐歌单快搜。用户正在抓取一个分享请求或者一个翻页请求分享你自己的爬虫或者解析你爬虫用户用户属性值,如id,注册id等。当一个用户发布一个内容发布一个好友,搜索,推荐时都可以用到分词器技术或者正则表达下限制如果你要抓取一个链接长度(类似一页)也可以用正则表达下抓取。
比如下面是我的爬虫。一个带分词器的爬虫爬取百度首页抓取百度贴吧搜索结果抓取爱奇艺视频观看链接抓取快搜当然下面的除外。php正则表达其他爬虫正则表达获取关键字如果使用正则表达获取一个页面的,你可以从网页的第一个元素开始。比如,你可以从你的首页开始抓取以便获取其所有的链接。1.给爬虫取个标题你可以得到这样一个页面。
php,urllib,mysql等等这个会爬虫才能获取,如果不会,可以学习下。2.给一个首页分段php用requests将整个页面分段,每一段爬取需要抓取的部分。php-gpl,因为requests是gpl。requests很好用的~然后分段爬取每一页,也可以分段获取每一个id的爬取,比如以json的形式抓取,有时候也可以分段抓取所有id的抓取。
这个我有写爬虫demo。php中文分词器抓取百度首页贴吧抓取百度音乐分享链接抓取网易云音乐歌单抓取爱奇艺视频分享链接抓取快搜当然下面的除外。php正则表达:正则表达form1form2__form__(){if(page=='no'){return'no';}//javascript}form1__form__(){//比如某个页面page='4094'}php用正则处理url的部分,如果首页不是正则表达,就调用正则表达。
4.准备需要的库javascript-soupcss-soup这两个是正则的事情。这些我都在爬虫中写demo,有时间一定更新。 查看全部
php用正则表达抓取网页中文章信息中文分词器抓取
php用正则表达抓取网页中文章信息中文分词器qpanda抓取百度首页贴吧抓取爱奇艺视频分享链接抓取网易云音乐歌单快搜。用户正在抓取一个分享请求或者一个翻页请求分享你自己的爬虫或者解析你爬虫用户用户属性值,如id,注册id等。当一个用户发布一个内容发布一个好友,搜索,推荐时都可以用到分词器技术或者正则表达下限制如果你要抓取一个链接长度(类似一页)也可以用正则表达下抓取。
比如下面是我的爬虫。一个带分词器的爬虫爬取百度首页抓取百度贴吧搜索结果抓取爱奇艺视频观看链接抓取快搜当然下面的除外。php正则表达其他爬虫正则表达获取关键字如果使用正则表达获取一个页面的,你可以从网页的第一个元素开始。比如,你可以从你的首页开始抓取以便获取其所有的链接。1.给爬虫取个标题你可以得到这样一个页面。
php,urllib,mysql等等这个会爬虫才能获取,如果不会,可以学习下。2.给一个首页分段php用requests将整个页面分段,每一段爬取需要抓取的部分。php-gpl,因为requests是gpl。requests很好用的~然后分段爬取每一页,也可以分段获取每一个id的爬取,比如以json的形式抓取,有时候也可以分段抓取所有id的抓取。
这个我有写爬虫demo。php中文分词器抓取百度首页贴吧抓取百度音乐分享链接抓取网易云音乐歌单抓取爱奇艺视频分享链接抓取快搜当然下面的除外。php正则表达:正则表达form1form2__form__(){if(page=='no'){return'no';}//javascript}form1__form__(){//比如某个页面page='4094'}php用正则处理url的部分,如果首页不是正则表达,就调用正则表达。
4.准备需要的库javascript-soupcss-soup这两个是正则的事情。这些我都在爬虫中写demo,有时间一定更新。
资源推荐 | 五十种最好用的开源爬虫软件
网站优化 • 优采云 发表了文章 • 0 个评论 • 265 次浏览 • 2022-05-12 12:05
网络爬虫是一种自动化程序或脚本,根据设定的数据爬取索引系统地爬取 Web 网页。整个过程称为 Web 数据采集(Crawling)或爬取(Spidering)。
人们通常将用于爬取的工具称为爬虫(Web Spider)、Web 数据抽取软件或 Web 网站采集工具。
当前 Web 爬取应用广受关注,一个重要的原因在于它们从多个方面上推进了业务的加速增长。这些应用非常便于在数据驱动的大环境中使用。它们从多个公开的网站采集信息和内容,并按统一可管理的方式提供。在这些应用的帮助下,我们可以一窥遍布全球的海量信息,例如新闻、社会媒体、图片、文章,甚至是竞争对手的情况。
为更好地采用各种爬取应用,我们需要做好调研,了解各种应用的不同功能和相同特性。我们将在本文中介绍多种不同的开源 Web 爬取软件库和工具。本文有助于读者实现爬取、采集网站数据并分析数据。
我们全面地总结了一些最好的开源 Web 爬取软件库和工具,并按实现语言的不同进行了分类。
Python 编写的开源 Web 爬虫1. Scrapy
简介
特性
2. Cola简介
特性
3. Crawley简介
特性
4. MechanicalSoup简介
特性
5. PySpider简介
特性
6. Portia简介
特性
7. Beautifulsoup简介
特性
8. Spidy 爬虫简介
特性
9. Garb简介
特性
Java 编写的开源 Web 爬虫10. Apache Nutch
简介特性:11. Heritrix简介:
在使用 Java 编写的免费开源 Web 爬虫中,Heritrix 是其中一种得到广泛使用的工具。事实上,它是一种可扩展、Web 规模、存档质量(archival-quality)的 Web 爬取项目。Heritrix 是一种扩展能力和性能很好的解决方案,支持用户即刻爬取并归档一组网站。此外,它在设计上考虑了 robots.txt 禁止规则和 META 机器人标签。Heritrix 可运行在 Linux/Unix 和 Windows 系统上。
特性:12. ACHE 爬虫简介:
ACHE 是一种专用于特定用途的 Web 爬虫。ACHE 爬取满足特定标准的 Web 页面。例如,属于特定领域并包含用户指定模式的页面。不同于通用爬虫,ACHE 使用页面分类器遴选特定领域中的相关和无关页面。页面分类器可以是基本的正则表达式(例如,匹配所有包含给定单词的页面),也可以基于机器学习的分类模型。ACHE 也可以自动学习如何对链接做优先处理,实现高效地定位相关内容,避免检索无关的页面内容。
特性:13. Crawler4j简介:14. Gecco简介:
Gecco 是一种使用 Java 开发的轻量级 Web 爬虫,易于使用。Gecco 集成了 jsoup、httpclient、fastjson、spring、htmlunit、redission 等优秀框架。用户只需要配置一系列 jQuery 风格选择器,就能很快地建立一个爬虫。Gecco 框架具有优秀的扩展能力。框架基于一些开放式和封闭式设计原则,对改进封闭,对扩展开放。
特性:15. BUbiNG简介:
BUbiNG 令人惊喜,它可称为下一代的开源 Web 爬虫。BUbiNG 是一种 Java 开发的完全分布式爬虫(无需中央协调),每秒可爬取数千个网页,并支持采集大规模数据集。BUbiNG 的分布式是基于高速协议实现的,因此可以获得非常高的通量。BUbiNG 提供对海量数据的大规模爬取。它完全可配置、易于扩展,并可集成垃圾信息检测。
特性:16. Narconex简介:
对于寻求可满足企业级需求的开源 Web 爬虫的用户而言,Narconex 是一种很好的工具。Norconex 支持用户爬取任何 Web 内容。用户可以独立运行这种全功能数据采集器,或是将其集成在自己的应用中。支持所有操作系统。可在具有一般容量的单体服务器上爬取数百万信息。此外,Narconex 提供多种内容和元数据操作特性,还可以抽取页面中特定的图像。
特性:17. WebSPHINX简介:
WebSphinix 是一种非常易于使用的可定制 Web 爬虫。它设计用于高级 Web 用户和 Java 编程人员,支持他们自动爬取小部分 Web。WebSphinix 数据抽取解决方案也提供了一种全面的 Java 类库和交互式软件开发环境。WebSphinix 包括两部分:爬虫基准测试(Crawler Workbench),WebSPHINX 类库。爬虫基准测试提供了很好的用户图形接口,支持用户配置并控制定制的 Web 爬虫。WebSPHINX 类库为使用 Java 编写 Web 爬虫提供支持。WebSphinix 支持运行在 Windows、Linux、Mac 和 Android IOS 上。
特性:18. Spiderman简介:
Spiderman 是一种 Java 开源 Web 数据抽取工具。它采集特定的 Web 页面,并从中抽取有用数据。Spiderman 主要使用 XPath 和正则表达式等技术抽取实际数据。
特性:19. WebCollector :简介:
WebCollector 是一种基于 Java 的开源 Web 爬虫框架。它为实现 Web 爬取功能提供了一下基本的接口。用户可以使用它在五分钟内建立起一个多线程爬虫。
特性:20. Webmagic简介:
WebMagic 是一种可扩展的爬虫框架。WebMagic 涵盖了爬虫的整个生命周期,包括下载、URL 管理、内容抽取和持久化。可用于简化一些特定爬虫的开发。
特性:21. StormCrawler简介:
StormCrawler 是一种基于 Apache Storm 构架分布式 Web 爬虫的开源 SDK。StormCrawler 为开发人员构建爬虫提供了软件库和一系列资源。StormCrawler 完全适用于以数据流提供需获取和解析的 URL 的情况,也非常适用于大规模递归性爬取,尤其是需要低延迟的情况。
特性:JavaScript 编写的开源 Web 爬虫22. NodeCrawler简介:
NodeCrawler 是一种广为使用的 Web 爬虫,它基于 NodeJS 实现,具有非常快的爬取速度。Nodecrawler 非常适用于偏爱使用 JavaScript 编程或者致力于 JavaScript 项目的开发人员。其安装也非常简单。JSDOM 和 Cheerio(用于 HTML 解析)实现服务器端渲染。其中,JSDOM 更为稳定。
特性:23. Simplecrawler简介:
Simplecrawler 设计提供基本的、灵活且稳定的网站爬取 API。Simplecrawler 在实现上考虑了针对特大型 Web 站点的归档、分析和搜索。它可爬取上百万页面,并毫无问题地向磁盘写入数十 GB 数据。
特性:24. Js-crawler :简介:25. Webster简介:26. Node-osmosis简介:
一种使用 NodeJS 实现的 HTML/XML 解析器和 Web 爬虫。
特性:27. Supercrawler简介:
Supercrawler 是一种使用 NodeJS 实现的 Web 爬虫,在设计上支持高度可配置和易用性。一旦成功爬取一个网页(可以是图像、文本文档或其他任何文件),Supercrawler 将会触发用户自定义的内容类型(content-type)处理器,处理页面解析、保存数据以及其它一些用户定义的功能。
特性:28. Web scraper 的 Chrome 扩展简介:
Web Scraper 是一种 Chrome 浏览器扩展,构建用于从 Web 页面抽取数据。用户可以使用该扩展创建计划(站点地图),定义如何遍历一个 Web 网站,以及如何从中抽取数据。Web Scraper 使用站点地图相应地遍历网站,并从中抽取数据。支持以 CSV 格式导出所抽取的数据。
特性:29. Headless Chrome 爬虫简介:
使用基本 HTML 文件请求的爬虫,通常速度很快。但这样的爬虫往往会抽取到空白内容,尤其是在爬取使用 AngularJS、React 和 Vue.js 等现代前端框架构建的网站时。
特性:30. X-ray特性:C 编写的开源 Web 爬虫31. Httrack简介:
HTTracks 是一项免费(GPL、Libre/ 自由软件)且易于使用的离线浏览器功能。支持用户将 Web 站点下载到本地目录,递归构建全部目录,以及获取 HTML、图像和其它文件到本地计算机。HTTrack 会维持原站点的相对链接结构。用户可以用浏览器打开本地的“镜像”页面,并逐个链接浏览,与在线浏览无异。HTTrack 也支持对已有镜像站点的更新,以及从中断点恢复下载。HTTrack 高度可配置,并提供帮助文档。
特性:32. GNU Wget简介:
GNU Wget 是一种免费软件包,它使用 HTTP、HTTPS、FTP、FTPS 等广为使用的互联网协议检索文件。Wget 是一种非交互式命令行工具,易于从脚本、Cron 任务、不具有 X 窗口支持的终端等处调用。
特性:C++ 编写的开源 Web 爬虫33. gigablast简介:
Gigablast 是一种开源的 Web 和企业搜索引擎,也是一种爬虫。Gigablast 是自身维护数十亿页面检索索引的数家美国搜索引擎之一。
特性:C# 编写的开源 Web 爬虫34. 简介:
适用于寻求开源 Web 爬虫的 C# 开发人员。 软件类库从因特网下载内容、对内容做索引,并对过程做定制。用户可使用该工具做个人内容聚合,也可用于将下载的内容抽取、采集和解析为多个表单。 索引所发现的内容,并存储在 Lucene.NET 索引中。 非常适用于文本挖掘,也适用于学习高级爬取技术。
特性:35. Abot简介:
Abot 是一种 C# 实现的开源 Web 爬虫,主要侧重于速度和灵活性。Abot 在实现中考虑了底层技术细节,包括多线程、HTTP 请求、调度、链接解析等。用户只需注册事件,就可以处理分页数据。支持用户插入自己的核心接口实现,实现对整个爬取过程的完全控制。
特性:36. Hawk简介:
HAWK 无需用户做任何编程,提供图形可视化数据获取和清理工具,并以 GPL 协议开源。
特性:37. SkyScraper简介:.NET 编写的 Web 爬虫38. DotnetSpider简介:PHP 编写的开源 Web 爬虫39. Goutte简介:40. Dom-crawler简介:41. Pspider简介:42. Php-spider简介:
一种可配置、可扩展的 Web 爬虫。
特性:43. Spatie / Crawler简介:Ruby 实现的开源 Web 爬虫44. Mechanize简介:GO 编写的开源 Web 爬虫45. Colly简介:
为 Go 爱好者提供了一种快速且适用的爬取框架。Colly 提供了非常清晰的接口,可用于编写任何类型的爬虫和数据获取工具。Colly 使得用户可以轻易地从站点抽取结构化数据。这些数据适用于大范围的应用,例如数据挖掘、数据处理和归档。
特性:46. Gopa特性:47. Pholcus简介:
Pholcus 是一种完全使用 Go 语言实现的高并发性、重量级爬虫软件。它针对因特网数据采集,为只具有基本 Go 或 JavaScript 编程基础的用户提供了一种只需要关注自定义功能的特性。规则简单灵活,并发批处理任务,提供丰富的输出方式,包括 MySQL、MongoDB、Kafka、CSV、Exvel 等。用户共享了大量的演示。此外,Pholcus 支持两种水平和垂直爬取模式,支持模拟登陆、暂停任务、取消任务等一系列高级特性。
特性:R 编写的开源 Web 爬虫48. Rvest简介:Scala 编写的开源 Web 爬虫49. Sparkler简介:
Web 爬虫是一种机器人程序,它从 Web 网站采集资源,用于构建搜索引擎、知识库等应用。Sparkler(“Spark-Crawler”的缩写)是一种新型的 Web 爬虫,它通过整合 Spark、Kafka、Lucene/Solr、Tika、pf4j 等多种 Apache 项目,使用了分布式计算和信息检索领域的最新进展。
特性:Perl 编写的开源 Web 爬虫50. Web-scraper简介:总 结
开源 Web 爬取应用纷繁多样,在此难以一一枚举。每种爬取应用分别各具特长,适用于不同用户的需求。
用户可根据自己的需求和技术要求选取适用的工具。也许用户会从上述工具中做出选择,也许会选择本文列表之外的工具。在实践中,用户只需根据任务的不同做出一个合理的选择,这完全取决于最终用户。其中至关重要的是,用户必须要了解每种工具的独特优势,并利用这些优势服务于用户自身的业务,或是自身所承担的其它任何任务。
欢迎与我们就此开展交流!
查看英文原文:
如果你喜欢这篇文章,或希望看到更多类似优质报道,记得给我留言和点赞哦! 查看全部
资源推荐 | 五十种最好用的开源爬虫软件
网络爬虫是一种自动化程序或脚本,根据设定的数据爬取索引系统地爬取 Web 网页。整个过程称为 Web 数据采集(Crawling)或爬取(Spidering)。
人们通常将用于爬取的工具称为爬虫(Web Spider)、Web 数据抽取软件或 Web 网站采集工具。
当前 Web 爬取应用广受关注,一个重要的原因在于它们从多个方面上推进了业务的加速增长。这些应用非常便于在数据驱动的大环境中使用。它们从多个公开的网站采集信息和内容,并按统一可管理的方式提供。在这些应用的帮助下,我们可以一窥遍布全球的海量信息,例如新闻、社会媒体、图片、文章,甚至是竞争对手的情况。
为更好地采用各种爬取应用,我们需要做好调研,了解各种应用的不同功能和相同特性。我们将在本文中介绍多种不同的开源 Web 爬取软件库和工具。本文有助于读者实现爬取、采集网站数据并分析数据。
我们全面地总结了一些最好的开源 Web 爬取软件库和工具,并按实现语言的不同进行了分类。
Python 编写的开源 Web 爬虫1. Scrapy
简介
特性
2. Cola简介
特性
3. Crawley简介
特性
4. MechanicalSoup简介
特性
5. PySpider简介
特性
6. Portia简介
特性
7. Beautifulsoup简介
特性
8. Spidy 爬虫简介
特性
9. Garb简介
特性
Java 编写的开源 Web 爬虫10. Apache Nutch
简介特性:11. Heritrix简介:
在使用 Java 编写的免费开源 Web 爬虫中,Heritrix 是其中一种得到广泛使用的工具。事实上,它是一种可扩展、Web 规模、存档质量(archival-quality)的 Web 爬取项目。Heritrix 是一种扩展能力和性能很好的解决方案,支持用户即刻爬取并归档一组网站。此外,它在设计上考虑了 robots.txt 禁止规则和 META 机器人标签。Heritrix 可运行在 Linux/Unix 和 Windows 系统上。
特性:12. ACHE 爬虫简介:
ACHE 是一种专用于特定用途的 Web 爬虫。ACHE 爬取满足特定标准的 Web 页面。例如,属于特定领域并包含用户指定模式的页面。不同于通用爬虫,ACHE 使用页面分类器遴选特定领域中的相关和无关页面。页面分类器可以是基本的正则表达式(例如,匹配所有包含给定单词的页面),也可以基于机器学习的分类模型。ACHE 也可以自动学习如何对链接做优先处理,实现高效地定位相关内容,避免检索无关的页面内容。
特性:13. Crawler4j简介:14. Gecco简介:
Gecco 是一种使用 Java 开发的轻量级 Web 爬虫,易于使用。Gecco 集成了 jsoup、httpclient、fastjson、spring、htmlunit、redission 等优秀框架。用户只需要配置一系列 jQuery 风格选择器,就能很快地建立一个爬虫。Gecco 框架具有优秀的扩展能力。框架基于一些开放式和封闭式设计原则,对改进封闭,对扩展开放。
特性:15. BUbiNG简介:
BUbiNG 令人惊喜,它可称为下一代的开源 Web 爬虫。BUbiNG 是一种 Java 开发的完全分布式爬虫(无需中央协调),每秒可爬取数千个网页,并支持采集大规模数据集。BUbiNG 的分布式是基于高速协议实现的,因此可以获得非常高的通量。BUbiNG 提供对海量数据的大规模爬取。它完全可配置、易于扩展,并可集成垃圾信息检测。
特性:16. Narconex简介:
对于寻求可满足企业级需求的开源 Web 爬虫的用户而言,Narconex 是一种很好的工具。Norconex 支持用户爬取任何 Web 内容。用户可以独立运行这种全功能数据采集器,或是将其集成在自己的应用中。支持所有操作系统。可在具有一般容量的单体服务器上爬取数百万信息。此外,Narconex 提供多种内容和元数据操作特性,还可以抽取页面中特定的图像。
特性:17. WebSPHINX简介:
WebSphinix 是一种非常易于使用的可定制 Web 爬虫。它设计用于高级 Web 用户和 Java 编程人员,支持他们自动爬取小部分 Web。WebSphinix 数据抽取解决方案也提供了一种全面的 Java 类库和交互式软件开发环境。WebSphinix 包括两部分:爬虫基准测试(Crawler Workbench),WebSPHINX 类库。爬虫基准测试提供了很好的用户图形接口,支持用户配置并控制定制的 Web 爬虫。WebSPHINX 类库为使用 Java 编写 Web 爬虫提供支持。WebSphinix 支持运行在 Windows、Linux、Mac 和 Android IOS 上。
特性:18. Spiderman简介:
Spiderman 是一种 Java 开源 Web 数据抽取工具。它采集特定的 Web 页面,并从中抽取有用数据。Spiderman 主要使用 XPath 和正则表达式等技术抽取实际数据。
特性:19. WebCollector :简介:
WebCollector 是一种基于 Java 的开源 Web 爬虫框架。它为实现 Web 爬取功能提供了一下基本的接口。用户可以使用它在五分钟内建立起一个多线程爬虫。
特性:20. Webmagic简介:
WebMagic 是一种可扩展的爬虫框架。WebMagic 涵盖了爬虫的整个生命周期,包括下载、URL 管理、内容抽取和持久化。可用于简化一些特定爬虫的开发。
特性:21. StormCrawler简介:
StormCrawler 是一种基于 Apache Storm 构架分布式 Web 爬虫的开源 SDK。StormCrawler 为开发人员构建爬虫提供了软件库和一系列资源。StormCrawler 完全适用于以数据流提供需获取和解析的 URL 的情况,也非常适用于大规模递归性爬取,尤其是需要低延迟的情况。
特性:JavaScript 编写的开源 Web 爬虫22. NodeCrawler简介:
NodeCrawler 是一种广为使用的 Web 爬虫,它基于 NodeJS 实现,具有非常快的爬取速度。Nodecrawler 非常适用于偏爱使用 JavaScript 编程或者致力于 JavaScript 项目的开发人员。其安装也非常简单。JSDOM 和 Cheerio(用于 HTML 解析)实现服务器端渲染。其中,JSDOM 更为稳定。
特性:23. Simplecrawler简介:
Simplecrawler 设计提供基本的、灵活且稳定的网站爬取 API。Simplecrawler 在实现上考虑了针对特大型 Web 站点的归档、分析和搜索。它可爬取上百万页面,并毫无问题地向磁盘写入数十 GB 数据。
特性:24. Js-crawler :简介:25. Webster简介:26. Node-osmosis简介:
一种使用 NodeJS 实现的 HTML/XML 解析器和 Web 爬虫。
特性:27. Supercrawler简介:
Supercrawler 是一种使用 NodeJS 实现的 Web 爬虫,在设计上支持高度可配置和易用性。一旦成功爬取一个网页(可以是图像、文本文档或其他任何文件),Supercrawler 将会触发用户自定义的内容类型(content-type)处理器,处理页面解析、保存数据以及其它一些用户定义的功能。
特性:28. Web scraper 的 Chrome 扩展简介:
Web Scraper 是一种 Chrome 浏览器扩展,构建用于从 Web 页面抽取数据。用户可以使用该扩展创建计划(站点地图),定义如何遍历一个 Web 网站,以及如何从中抽取数据。Web Scraper 使用站点地图相应地遍历网站,并从中抽取数据。支持以 CSV 格式导出所抽取的数据。
特性:29. Headless Chrome 爬虫简介:
使用基本 HTML 文件请求的爬虫,通常速度很快。但这样的爬虫往往会抽取到空白内容,尤其是在爬取使用 AngularJS、React 和 Vue.js 等现代前端框架构建的网站时。
特性:30. X-ray特性:C 编写的开源 Web 爬虫31. Httrack简介:
HTTracks 是一项免费(GPL、Libre/ 自由软件)且易于使用的离线浏览器功能。支持用户将 Web 站点下载到本地目录,递归构建全部目录,以及获取 HTML、图像和其它文件到本地计算机。HTTrack 会维持原站点的相对链接结构。用户可以用浏览器打开本地的“镜像”页面,并逐个链接浏览,与在线浏览无异。HTTrack 也支持对已有镜像站点的更新,以及从中断点恢复下载。HTTrack 高度可配置,并提供帮助文档。
特性:32. GNU Wget简介:
GNU Wget 是一种免费软件包,它使用 HTTP、HTTPS、FTP、FTPS 等广为使用的互联网协议检索文件。Wget 是一种非交互式命令行工具,易于从脚本、Cron 任务、不具有 X 窗口支持的终端等处调用。
特性:C++ 编写的开源 Web 爬虫33. gigablast简介:
Gigablast 是一种开源的 Web 和企业搜索引擎,也是一种爬虫。Gigablast 是自身维护数十亿页面检索索引的数家美国搜索引擎之一。
特性:C# 编写的开源 Web 爬虫34. 简介:
适用于寻求开源 Web 爬虫的 C# 开发人员。 软件类库从因特网下载内容、对内容做索引,并对过程做定制。用户可使用该工具做个人内容聚合,也可用于将下载的内容抽取、采集和解析为多个表单。 索引所发现的内容,并存储在 Lucene.NET 索引中。 非常适用于文本挖掘,也适用于学习高级爬取技术。
特性:35. Abot简介:
Abot 是一种 C# 实现的开源 Web 爬虫,主要侧重于速度和灵活性。Abot 在实现中考虑了底层技术细节,包括多线程、HTTP 请求、调度、链接解析等。用户只需注册事件,就可以处理分页数据。支持用户插入自己的核心接口实现,实现对整个爬取过程的完全控制。
特性:36. Hawk简介:
HAWK 无需用户做任何编程,提供图形可视化数据获取和清理工具,并以 GPL 协议开源。
特性:37. SkyScraper简介:.NET 编写的 Web 爬虫38. DotnetSpider简介:PHP 编写的开源 Web 爬虫39. Goutte简介:40. Dom-crawler简介:41. Pspider简介:42. Php-spider简介:
一种可配置、可扩展的 Web 爬虫。
特性:43. Spatie / Crawler简介:Ruby 实现的开源 Web 爬虫44. Mechanize简介:GO 编写的开源 Web 爬虫45. Colly简介:
为 Go 爱好者提供了一种快速且适用的爬取框架。Colly 提供了非常清晰的接口,可用于编写任何类型的爬虫和数据获取工具。Colly 使得用户可以轻易地从站点抽取结构化数据。这些数据适用于大范围的应用,例如数据挖掘、数据处理和归档。
特性:46. Gopa特性:47. Pholcus简介:
Pholcus 是一种完全使用 Go 语言实现的高并发性、重量级爬虫软件。它针对因特网数据采集,为只具有基本 Go 或 JavaScript 编程基础的用户提供了一种只需要关注自定义功能的特性。规则简单灵活,并发批处理任务,提供丰富的输出方式,包括 MySQL、MongoDB、Kafka、CSV、Exvel 等。用户共享了大量的演示。此外,Pholcus 支持两种水平和垂直爬取模式,支持模拟登陆、暂停任务、取消任务等一系列高级特性。
特性:R 编写的开源 Web 爬虫48. Rvest简介:Scala 编写的开源 Web 爬虫49. Sparkler简介:
Web 爬虫是一种机器人程序,它从 Web 网站采集资源,用于构建搜索引擎、知识库等应用。Sparkler(“Spark-Crawler”的缩写)是一种新型的 Web 爬虫,它通过整合 Spark、Kafka、Lucene/Solr、Tika、pf4j 等多种 Apache 项目,使用了分布式计算和信息检索领域的最新进展。
特性:Perl 编写的开源 Web 爬虫50. Web-scraper简介:总 结
开源 Web 爬取应用纷繁多样,在此难以一一枚举。每种爬取应用分别各具特长,适用于不同用户的需求。
用户可根据自己的需求和技术要求选取适用的工具。也许用户会从上述工具中做出选择,也许会选择本文列表之外的工具。在实践中,用户只需根据任务的不同做出一个合理的选择,这完全取决于最终用户。其中至关重要的是,用户必须要了解每种工具的独特优势,并利用这些优势服务于用户自身的业务,或是自身所承担的其它任何任务。
欢迎与我们就此开展交流!
查看英文原文:
如果你喜欢这篇文章,或希望看到更多类似优质报道,记得给我留言和点赞哦!
视频下载器你知道吧?那你听说过文章下载器吗?Python来实现!
网站优化 • 优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2022-05-10 13:03
进群:548377875 即可获取数十套PDF哦!还有源码呢!
工具需求:
输入:给定公众号ID,和用户需要获取的公众号文章目录页码数(小于已发布最大收录页数)
( 输出Ⅰ:每个公众号历史文章信息csv文件(链接+标题)
输出Ⅱ: wkhtmltopdf和pdfkit将html转换成PDF文件或者图片文件(初稿)
现有方案
之前在网上也搜索了些爬取微信公众号的资料,大概有如下几种
selenium爬取流程
安装python selenium自动模块,通过selenium中的webdriver驱动浏览器获取Cookie登录微信公众号后台;
使用webdriver功能需要安装对应浏览器的驱动插件
注意:谷歌浏览器版本和chromedriver需要对应,否则会导致启动时报错。
微信公众号登陆地址:
微信公众号文章接口地址可以在微信公众号后台中新建图文消息,超链接功能中获取:
搜索公众号名称
获取要爬取的公众号的fakeid
选定要爬取的公众号,获取文章接口地址
文章列表翻页及内容获取
AnyProxy代理批量采集
Fiddler设置代理和抓包
通过对多个账号进行抓包分析,可以确定:
步骤:
1,写按键精灵脚本,在手机上自动点击公号文章列表页,也就是“查看历史消息”;
2,使用fiddler代理劫持手机端的访问,将网址转发到本地用php写的网页;
3,在php网页上将接收到的网址备份到数据库;
4,用python从数据库取出网址,然后进行正常的爬取。
可能存在的问题:
如果只是想爬取文章内容,似乎并没有访问频率限制,但如果想抓取阅读数、点赞数,超过一定频率后,返回就会变为空值。
付费平台
例如清博 新榜,如果只是想看数据的话,直接看每天的榜单就可以了,还不用花钱,如果需要接入自己的系统的话,他们也提供api接口
3项目步骤
3.1基本原理
目标爬取网站收录了微信平台大部分的优质微信公众号文章,会定期更新,经测试发现对爬虫较为友好。
1、网站页面布局排版规律,不同公众号通过链接中的account区分
2、一个公众号合集下的文章翻页也有规律:id号每翻一页+12
所以流程思路就是
3.5自动跳转页面
以下代码通过循环递增赋值,改变url中的页码参数
3.8生成的PDF结果
4结果展示
5 完整代码
由于考虑到转pdf的稳定性,我在发布版的代码中没有加转PDF的函数。预留了一个粗糙的py源文件,如果感兴趣,读者可以在此基础上自行调整修改。
源码就单独私信,我一个个给你们发! 查看全部
视频下载器你知道吧?那你听说过文章下载器吗?Python来实现!
进群:548377875 即可获取数十套PDF哦!还有源码呢!
工具需求:
输入:给定公众号ID,和用户需要获取的公众号文章目录页码数(小于已发布最大收录页数)
( 输出Ⅰ:每个公众号历史文章信息csv文件(链接+标题)
输出Ⅱ: wkhtmltopdf和pdfkit将html转换成PDF文件或者图片文件(初稿)
现有方案
之前在网上也搜索了些爬取微信公众号的资料,大概有如下几种
selenium爬取流程
安装python selenium自动模块,通过selenium中的webdriver驱动浏览器获取Cookie登录微信公众号后台;
使用webdriver功能需要安装对应浏览器的驱动插件
注意:谷歌浏览器版本和chromedriver需要对应,否则会导致启动时报错。
微信公众号登陆地址:
微信公众号文章接口地址可以在微信公众号后台中新建图文消息,超链接功能中获取:
搜索公众号名称
获取要爬取的公众号的fakeid
选定要爬取的公众号,获取文章接口地址
文章列表翻页及内容获取
AnyProxy代理批量采集
Fiddler设置代理和抓包
通过对多个账号进行抓包分析,可以确定:
步骤:
1,写按键精灵脚本,在手机上自动点击公号文章列表页,也就是“查看历史消息”;
2,使用fiddler代理劫持手机端的访问,将网址转发到本地用php写的网页;
3,在php网页上将接收到的网址备份到数据库;
4,用python从数据库取出网址,然后进行正常的爬取。
可能存在的问题:
如果只是想爬取文章内容,似乎并没有访问频率限制,但如果想抓取阅读数、点赞数,超过一定频率后,返回就会变为空值。
付费平台
例如清博 新榜,如果只是想看数据的话,直接看每天的榜单就可以了,还不用花钱,如果需要接入自己的系统的话,他们也提供api接口
3项目步骤
3.1基本原理
目标爬取网站收录了微信平台大部分的优质微信公众号文章,会定期更新,经测试发现对爬虫较为友好。
1、网站页面布局排版规律,不同公众号通过链接中的account区分
2、一个公众号合集下的文章翻页也有规律:id号每翻一页+12
所以流程思路就是
3.5自动跳转页面
以下代码通过循环递增赋值,改变url中的页码参数
3.8生成的PDF结果
4结果展示
5 完整代码
由于考虑到转pdf的稳定性,我在发布版的代码中没有加转PDF的函数。预留了一个粗糙的py源文件,如果感兴趣,读者可以在此基础上自行调整修改。
源码就单独私信,我一个个给你们发!
对网站进行归档 | Linux 中国
网站优化 • 优采云 发表了文章 • 0 个评论 • 213 次浏览 • 2022-05-10 12:55
本文介绍了对传统网站进行归档的过程,并阐述在面对最新流行单页面应用程序(SPA)的现代网站时,它有哪些不足。-- Anarcat
有用的原文链接请访问文末的“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。
致谢编译自|
作者|Anarcat
译者|fuowang 共计翻译:12.0篇 贡献时间:763 天
我最近深入研究了网站归档,因为有些朋友担心遇到糟糕的系统管理或恶意删除时失去对放在网上的内容的控制权。这使得网站归档成为系统管理员工具箱中的重要工具。事实证明,有些网站比其他网站更难归档。本文介绍了对传统网站进行归档的过程,并阐述在面对最新流行单页面应用程序(SPA)的现代网站时,它有哪些不足。
转换为简单网站
手动编码 HTML 网站的日子早已不复存在。现在的网站是动态的,并使用最新的 JavaScript、PHP 或 Python 框架即时构建。结果,这些网站更加脆弱:数据库崩溃、升级出错或者未修复的漏洞都可能使数据丢失。在我以前是一名 Web 开发人员时,我不得不接受客户这样的想法:希望网站基本上可以永久工作。这种期望与 web 开发“快速行动和破除陈规”的理念不相符。在这方面,使用Drupal[1]内容管理系统(CMS)尤其具有挑战性,因为重大更新会破坏与第三方模块的兼容性,这意味着客户很少承担的起高昂的升级成本。解决方案是将这些网站归档:以实时动态的网站为基础,将其转换为任何 web 服务器可以永久服务的纯 HTML 文件。此过程对你自己的动态网站非常有用,也适用于你想保护但无法控制的第三方网站。
对于简单的静态网站,古老的Wget[2]程序就可以胜任。然而镜像保存一个完整网站的命令却是错综复杂的:
<p>$ nice wget --mirror --execute robots=off --no-verbose --convert-links \
--backup-converted --page-requisites --adjust-extension \
--base=./ --directory-prefix=./ --span-hosts \
--domains=www.example.com,example.com http://www.example.com/</p>
以上命令下载了网页的内容,也抓取了指定域名中的所有内容。在对你喜欢的网站执行此操作之前,请考虑此类抓取可能对网站产生的影响。上面的命令故意忽略了robots.txt规则,就像现在归档者的习惯做法[3],并以尽可能快的速度归档网站。大多数抓取工具都可以选择在两次抓取间暂停并限制带宽使用,以避免使网站瘫痪。
上面的命令还将获取 “页面所需(LCTT 译注:单页面所需的所有元素)”,如样式表(CSS)、图像和脚本等。下载的页面内容将会被修改,以便链接也指向本地副本。任何 web 服务器均可托管生成的文件集,从而生成原始网站的静态副本。
以上所述是事情一切顺利的时候。任何使用过计算机的人都知道事情的进展很少如计划那样;各种各样的事情可以使程序以有趣的方式脱离正轨。比如,在网站上有一段时间很流行日历块。内容管理系统会动态生成这些内容,这会使爬虫程序陷入死循环以尝试检索所有页面。灵巧的归档者可以使用正则表达式(例如 Wget 有一个--reject-regex选项)来忽略有问题的资源。如果可以访问网站的管理界面,另一个方法是禁用日历、登录表单、评论表单和其他动态区域。一旦网站变成静态的,(那些动态区域)也肯定会停止工作,因此从原始网站中移除这些杂乱的东西也不是全无意义。
JavaScript 噩梦
很不幸,有些网站不仅仅是纯 HTML 文件构建的。比如,在单页面网站中,web 浏览器通过执行一个小的 JavaScript 程序来构建内容。像 Wget 这样的简单用户代理将难以重建这些网站的有意义的静态副本,因为它根本不支持 JavaScript。理论上,网站应该使用渐进增强[4]技术,在不使用 JavaScript 的情况下提供内容和实现功能,但这些指引很少被人遵循 —— 使用过NoScript[5]或uMatrix[6]等插件的人都知道。
传统的归档方法有时会以最愚蠢的方式失败。在尝试为一个本地报纸网站(pamplemousse.ca[7])创建备份时,我发现 WordPress 在包含 的 JavaScript 末尾添加了查询字符串(例如:?ver=1.12.4)。这会使提供归档服务的 web 服务器不能正确进行内容类型检测,因为其靠文件扩展名来发送正确的Content-Type头部信息。在 web 浏览器加载此类归档时,这些脚本会加载失败,导致动态网站受损。
随着 web 向使用浏览器作为执行任意代码的虚拟机转化,依赖于纯 HTML 文件解析的归档方法也需要随之适应。这个问题的解决方案是在抓取时记录(以及重现)服务器提供的 HTTP 头部信息,实际上专业的归档者就使用这种方法。
创建和显示 WARC 文件
在互联网档案馆Internet Archive[8]网站,Brewster Kahle 和 Mike Burner 在 1996 年设计了ARC[9](即 “ARChive”)文件格式,以提供一种聚合其归档工作所产生的百万个小文件的方法。该格式最终标准化为 WARC(“Web ARChive”)规范[10],并在 2009 年作为 ISO 标准发布,2017 年修订。标准化工作由国际互联网保护联盟International Internet Preservation Consortium[11](IIPC)领导,据维基百科称,这是一个“为了协调为未来而保护互联网内容的努力而成立的国际图书馆组织和其他组织”;它的成员包括美国国会图书馆US Library of Congress和互联网档案馆等。后者在其基于 Java 的Heritrix crawler[12](LCTT 译注:一种爬虫程序)内部使用了 WARC 格式。
WARC 在单个压缩文件中聚合了多种资源,像 HTTP 头部信息、文件内容,以及其他元数据。方便的是,Wget 实际上提供了--warc参数来支持 WARC 格式。不幸的是,web 浏览器不能直接显示 WARC 文件,所以为了访问归档文件,一个查看器或某些格式转换是很有必要的。我所发现的最简单的查看器是pywb[13],它以 Python 包的形式运行一个简单的 web 服务器提供一个像“时光倒流机网站Wayback Machine”的界面,来浏览 WARC 文件的内容。执行以下命令将会在:8080/地址显示 WARC 文件的内容:
<p>$ pip install pywb
$ wb-manager init example
$ wb-manager add example crawl.warc.gz
$ wayback</p>
顺便说一句,这个工具是由Webrecorder[14]服务提供者建立的,Webrecoder 服务可以使用 web 浏览器保存动态页面的内容。
很不幸,pywb 无法加载 Wget 生成的 WARC 文件,因为它遵循[15]的1.0 规范不一致[16],1.1 规范修复了此问题[16]。就算 Wget 或 pywb 修复了这些问题,Wget 生成的 WARC 文件对我的使用来说不够可靠,所以我找了其他的替代品。引起我注意的爬虫程序简称crawl[17]。以下是它的调用方式:
<p>$ crawl https://example.com/</p>
(它的 README 文件说“非常简单”。)该程序支持一些命令行参数选项,但大多数默认值都是最佳的:它会从其他域获取页面所需(除非使用-exclude-related参数),但肯定不会递归出域。默认情况下,它会与远程站点建立十个并发连接,这个值可以使用-c参数更改。但是,最重要的是,生成的 WARC 文件可以使用 pywb 完美加载。
未来的工作和替代方案
这里还有更多有关使用 WARC 文件的资源[18]。特别要提的是,这里有一个专门用来归档网站的 Wget 的直接替代品,叫做Wpull[19]。它实验性地支持了PhantomJS[20]和youtube-dl[21]的集成,即允许分别下载更复杂的 JavaScript 页面以及流媒体。该程序是一个叫做ArchiveBot[22]的复杂归档工具的基础,ArchiveBot 被那些在ArchiveTeam[23]的“零散离群的归档者、程序员、作家以及演说家”使用,他们致力于“在历史永远丢失之前保存它们”。集成 PhantomJS 好像并没有如团队期望的那样良好工作,所以 ArchiveTeam 也用其它零散的工具来镜像保存更复杂的网站。例如,snscrape[24]将抓取一个社交媒体配置文件以生成要发送到 ArchiveBot 的页面列表。该团队使用的另一个工具是crocoite[25],它使用无头模式的 Chrome 浏览器来归档 JavaScript 较多的网站。
如果没有提到称做“网站复制者”的HTTrack[26]项目,那么这篇文章算不上完整。它工作方式和 Wget 相似,HTTrack 可以对远程站点创建一个本地的副本,但是不幸的是它不支持输出 WRAC 文件。对于不熟悉命令行的小白用户来说,它在人机交互方面显得更有价值。
同样,在我的研究中,我发现了叫做Wget2[27]的 Wget 的完全重制版本,它支持多线程操作,这可能使它比前身更快。和 Wget 相比,它舍弃了一些功能[28],但是最值得注意的是拒绝模式、WARC 输出以及 FTP 支持,并增加了 RSS、DNS 缓存以及改进的 TLS 支持。
最后,我个人对这些工具的愿景是将它们与我现有的书签系统集成起来。目前我在Wallabag[29]中保留了一些有趣的链接,这是一种自托管式的“稍后阅读”服务,意在成为Pocket[30](现在由 Mozilla 拥有)的免费替代品。但是 Wallabag 在设计上只保留了文章的“可读”副本,而不是一个完整的拷贝。在某些情况下,“可读版本”实际上不可读[31],并且 Wallabag 有时无法解析文章[32]。恰恰相反,像bookmark-archiver[33]或reminiscence[34]这样其他的工具会保存页面的屏幕截图以及完整的 HTML 文件,但遗憾的是,它没有 WRAC 文件所以没有办法更可信的重现网页内容。
我所经历的有关镜像保存和归档的悲剧就是死数据。幸运的是,业余的归档者可以利用工具将有趣的内容保存到网上。对于那些不想麻烦的人来说,“互联网档案馆”看起来仍然在那里,并且 ArchiveTeam 显然正在为互联网档案馆本身做备份[35]。
via:
作者:Anarcat[37]选题:lujun9972译者:fuowang校对:wxy
本文由LCTT原创编译,Linux中国荣誉推出 查看全部
对网站进行归档 | Linux 中国
本文介绍了对传统网站进行归档的过程,并阐述在面对最新流行单页面应用程序(SPA)的现代网站时,它有哪些不足。-- Anarcat
有用的原文链接请访问文末的“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。
致谢编译自|
作者|Anarcat
译者|fuowang 共计翻译:12.0篇 贡献时间:763 天
我最近深入研究了网站归档,因为有些朋友担心遇到糟糕的系统管理或恶意删除时失去对放在网上的内容的控制权。这使得网站归档成为系统管理员工具箱中的重要工具。事实证明,有些网站比其他网站更难归档。本文介绍了对传统网站进行归档的过程,并阐述在面对最新流行单页面应用程序(SPA)的现代网站时,它有哪些不足。
转换为简单网站
手动编码 HTML 网站的日子早已不复存在。现在的网站是动态的,并使用最新的 JavaScript、PHP 或 Python 框架即时构建。结果,这些网站更加脆弱:数据库崩溃、升级出错或者未修复的漏洞都可能使数据丢失。在我以前是一名 Web 开发人员时,我不得不接受客户这样的想法:希望网站基本上可以永久工作。这种期望与 web 开发“快速行动和破除陈规”的理念不相符。在这方面,使用Drupal[1]内容管理系统(CMS)尤其具有挑战性,因为重大更新会破坏与第三方模块的兼容性,这意味着客户很少承担的起高昂的升级成本。解决方案是将这些网站归档:以实时动态的网站为基础,将其转换为任何 web 服务器可以永久服务的纯 HTML 文件。此过程对你自己的动态网站非常有用,也适用于你想保护但无法控制的第三方网站。
对于简单的静态网站,古老的Wget[2]程序就可以胜任。然而镜像保存一个完整网站的命令却是错综复杂的:
<p>$ nice wget --mirror --execute robots=off --no-verbose --convert-links \
--backup-converted --page-requisites --adjust-extension \
--base=./ --directory-prefix=./ --span-hosts \
--domains=www.example.com,example.com http://www.example.com/</p>
以上命令下载了网页的内容,也抓取了指定域名中的所有内容。在对你喜欢的网站执行此操作之前,请考虑此类抓取可能对网站产生的影响。上面的命令故意忽略了robots.txt规则,就像现在归档者的习惯做法[3],并以尽可能快的速度归档网站。大多数抓取工具都可以选择在两次抓取间暂停并限制带宽使用,以避免使网站瘫痪。
上面的命令还将获取 “页面所需(LCTT 译注:单页面所需的所有元素)”,如样式表(CSS)、图像和脚本等。下载的页面内容将会被修改,以便链接也指向本地副本。任何 web 服务器均可托管生成的文件集,从而生成原始网站的静态副本。
以上所述是事情一切顺利的时候。任何使用过计算机的人都知道事情的进展很少如计划那样;各种各样的事情可以使程序以有趣的方式脱离正轨。比如,在网站上有一段时间很流行日历块。内容管理系统会动态生成这些内容,这会使爬虫程序陷入死循环以尝试检索所有页面。灵巧的归档者可以使用正则表达式(例如 Wget 有一个--reject-regex选项)来忽略有问题的资源。如果可以访问网站的管理界面,另一个方法是禁用日历、登录表单、评论表单和其他动态区域。一旦网站变成静态的,(那些动态区域)也肯定会停止工作,因此从原始网站中移除这些杂乱的东西也不是全无意义。
JavaScript 噩梦
很不幸,有些网站不仅仅是纯 HTML 文件构建的。比如,在单页面网站中,web 浏览器通过执行一个小的 JavaScript 程序来构建内容。像 Wget 这样的简单用户代理将难以重建这些网站的有意义的静态副本,因为它根本不支持 JavaScript。理论上,网站应该使用渐进增强[4]技术,在不使用 JavaScript 的情况下提供内容和实现功能,但这些指引很少被人遵循 —— 使用过NoScript[5]或uMatrix[6]等插件的人都知道。
传统的归档方法有时会以最愚蠢的方式失败。在尝试为一个本地报纸网站(pamplemousse.ca[7])创建备份时,我发现 WordPress 在包含 的 JavaScript 末尾添加了查询字符串(例如:?ver=1.12.4)。这会使提供归档服务的 web 服务器不能正确进行内容类型检测,因为其靠文件扩展名来发送正确的Content-Type头部信息。在 web 浏览器加载此类归档时,这些脚本会加载失败,导致动态网站受损。
随着 web 向使用浏览器作为执行任意代码的虚拟机转化,依赖于纯 HTML 文件解析的归档方法也需要随之适应。这个问题的解决方案是在抓取时记录(以及重现)服务器提供的 HTTP 头部信息,实际上专业的归档者就使用这种方法。
创建和显示 WARC 文件
在互联网档案馆Internet Archive[8]网站,Brewster Kahle 和 Mike Burner 在 1996 年设计了ARC[9](即 “ARChive”)文件格式,以提供一种聚合其归档工作所产生的百万个小文件的方法。该格式最终标准化为 WARC(“Web ARChive”)规范[10],并在 2009 年作为 ISO 标准发布,2017 年修订。标准化工作由国际互联网保护联盟International Internet Preservation Consortium[11](IIPC)领导,据维基百科称,这是一个“为了协调为未来而保护互联网内容的努力而成立的国际图书馆组织和其他组织”;它的成员包括美国国会图书馆US Library of Congress和互联网档案馆等。后者在其基于 Java 的Heritrix crawler[12](LCTT 译注:一种爬虫程序)内部使用了 WARC 格式。
WARC 在单个压缩文件中聚合了多种资源,像 HTTP 头部信息、文件内容,以及其他元数据。方便的是,Wget 实际上提供了--warc参数来支持 WARC 格式。不幸的是,web 浏览器不能直接显示 WARC 文件,所以为了访问归档文件,一个查看器或某些格式转换是很有必要的。我所发现的最简单的查看器是pywb[13],它以 Python 包的形式运行一个简单的 web 服务器提供一个像“时光倒流机网站Wayback Machine”的界面,来浏览 WARC 文件的内容。执行以下命令将会在:8080/地址显示 WARC 文件的内容:
<p>$ pip install pywb
$ wb-manager init example
$ wb-manager add example crawl.warc.gz
$ wayback</p>
顺便说一句,这个工具是由Webrecorder[14]服务提供者建立的,Webrecoder 服务可以使用 web 浏览器保存动态页面的内容。
很不幸,pywb 无法加载 Wget 生成的 WARC 文件,因为它遵循[15]的1.0 规范不一致[16],1.1 规范修复了此问题[16]。就算 Wget 或 pywb 修复了这些问题,Wget 生成的 WARC 文件对我的使用来说不够可靠,所以我找了其他的替代品。引起我注意的爬虫程序简称crawl[17]。以下是它的调用方式:
<p>$ crawl https://example.com/</p>
(它的 README 文件说“非常简单”。)该程序支持一些命令行参数选项,但大多数默认值都是最佳的:它会从其他域获取页面所需(除非使用-exclude-related参数),但肯定不会递归出域。默认情况下,它会与远程站点建立十个并发连接,这个值可以使用-c参数更改。但是,最重要的是,生成的 WARC 文件可以使用 pywb 完美加载。
未来的工作和替代方案
这里还有更多有关使用 WARC 文件的资源[18]。特别要提的是,这里有一个专门用来归档网站的 Wget 的直接替代品,叫做Wpull[19]。它实验性地支持了PhantomJS[20]和youtube-dl[21]的集成,即允许分别下载更复杂的 JavaScript 页面以及流媒体。该程序是一个叫做ArchiveBot[22]的复杂归档工具的基础,ArchiveBot 被那些在ArchiveTeam[23]的“零散离群的归档者、程序员、作家以及演说家”使用,他们致力于“在历史永远丢失之前保存它们”。集成 PhantomJS 好像并没有如团队期望的那样良好工作,所以 ArchiveTeam 也用其它零散的工具来镜像保存更复杂的网站。例如,snscrape[24]将抓取一个社交媒体配置文件以生成要发送到 ArchiveBot 的页面列表。该团队使用的另一个工具是crocoite[25],它使用无头模式的 Chrome 浏览器来归档 JavaScript 较多的网站。
如果没有提到称做“网站复制者”的HTTrack[26]项目,那么这篇文章算不上完整。它工作方式和 Wget 相似,HTTrack 可以对远程站点创建一个本地的副本,但是不幸的是它不支持输出 WRAC 文件。对于不熟悉命令行的小白用户来说,它在人机交互方面显得更有价值。
同样,在我的研究中,我发现了叫做Wget2[27]的 Wget 的完全重制版本,它支持多线程操作,这可能使它比前身更快。和 Wget 相比,它舍弃了一些功能[28],但是最值得注意的是拒绝模式、WARC 输出以及 FTP 支持,并增加了 RSS、DNS 缓存以及改进的 TLS 支持。
最后,我个人对这些工具的愿景是将它们与我现有的书签系统集成起来。目前我在Wallabag[29]中保留了一些有趣的链接,这是一种自托管式的“稍后阅读”服务,意在成为Pocket[30](现在由 Mozilla 拥有)的免费替代品。但是 Wallabag 在设计上只保留了文章的“可读”副本,而不是一个完整的拷贝。在某些情况下,“可读版本”实际上不可读[31],并且 Wallabag 有时无法解析文章[32]。恰恰相反,像bookmark-archiver[33]或reminiscence[34]这样其他的工具会保存页面的屏幕截图以及完整的 HTML 文件,但遗憾的是,它没有 WRAC 文件所以没有办法更可信的重现网页内容。
我所经历的有关镜像保存和归档的悲剧就是死数据。幸运的是,业余的归档者可以利用工具将有趣的内容保存到网上。对于那些不想麻烦的人来说,“互联网档案馆”看起来仍然在那里,并且 ArchiveTeam 显然正在为互联网档案馆本身做备份[35]。
via:
作者:Anarcat[37]选题:lujun9972译者:fuowang校对:wxy
本文由LCTT原创编译,Linux中国荣誉推出
【分享吧】基于GO语言的爬虫框架在互联网项目中的应用
网站优化 • 优采云 发表了文章 • 0 个评论 • 116 次浏览 • 2022-05-08 22:04
产品的爬虫框架设计之初,仅仅是为了爬取资讯。但是随着产品覆盖信息的扩大,爬虫的目标范围和需要支持的功能也在不断地进行扩展和复杂化。截至目前我们产品中的爬虫系统已经具备了高并发,高可用和高可扩展性的特点,可以利用很小的开发成本,就完成所有新增的需求。本文我们从基本概念为切入点,简单介绍一下目前主流的爬虫框架及特点,最终将项目中使用的爬虫框架结构,以及做了哪些优化和定制介绍给大家。希望能够让大家对网络爬虫有一个清楚的认识。
一、什么是爬虫
1
概念
网络爬虫是一种按照一定的规则,自动地抓取万维网(www)信息的程序或者脚本。是搜索引擎的一个重要组成部分。
通过爬虫软件更新自身的网站内容或其他网站的索引。网络爬虫可以将自己所访问的页面保存下来,以便搜索引擎事后生成索引供用户搜索。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件;定向爬虫则可以根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。以此来避免重复及不相关的页面被搜索到。
图1-1 工作原理
2
分类和目前主流爬虫
网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型(实际的网络爬虫系统通常是几种爬虫技术相结合实现的):
① 通用爬虫:爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低;
② 定向爬虫:选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求;
③ 增量爬虫:对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度;
④ 深层爬虫:对深层网页的爬取。深层网页是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。例如那些用户注册后内容才可见的网页就属于这个范畴。
网络爬虫诞生之初,大都是由解释型脚本语言编写(主要是python)。但随着互联网的高速发展,各主流开发语言基本都出现了一些出色的爬虫框架。整理了目前业内比较有名的框架如下:
✱ Scrapy(Python):一个快速、高效且易扩展的爬虫框架。可快速整合到python主流的web应用框架,并且能够使用redis等中间件快速搭建起分布式集群;
✱ Pyspider(Python):功能强大的爬虫框架,有自己的web UI;
✱ Apache Nutch(Java):灵活及高可扩展的爬虫框架;
✱ Crawler4j(Java):简单易用、轻量级的网络爬虫;
✱ Scraperjs(JS):高可用,功能强大的网络爬虫;
✱ node-crawler(JS):封装了简单易用的API;
✱ Goutte(PHP):可快速整合到Laravel引用框架;
✱ Pholcus(GO):分布式、高并发的强大爬虫,可通过web UI配置爬取策略(扩展性较差);
✱ go_spider(GO):一个出色,并且支持高并发的爬虫。扩展性强。
二、我们的爬虫
1
技术选型
文章开头的时候我们提到过产品的爬虫功能原始需求,主要是抓取新闻资讯。这样就要求爬虫必须具备以下功能:
1. 增量提取(已抓取的资讯不能重复抓取);
2. 页面指纹去重(存在url不同,但是内容完全相同的资讯,要识别出这部分资讯,避免重复抓取);
3. 翻页递归提取(资讯都是分页展示,要支持翻页抓取);
4. 定时提取(常驻内存爬虫进程浪费资源,需要能够定时运行爬虫)。
根据以上需求,项目的爬虫初版选用scrapy框架来实现,可以很好地满足业务需要。但是考虑到项目组成员熟悉python的比例不高,并且scrapy也需要一定的学习成本,新的开发人员无法快速熟悉代码并开发新功能。从2.0版本开始,重构采用go语言来实现爬虫系统。我们选择的就是上面提到的go_spider框架,主要考虑到的也是它的高可扩展性,方便我们做个性化开发及优化。从目前的效果来看还是很不错的,它的框架原型功能结构如下图:
图2-1 go_spider框架原型
2
定制化开发与优化
从上图中可以看到,go_spider框架本身优雅地分解了爬虫中各个模块,每部分只要专注自己的工作,最后由框架整合到一起完成爬虫功能。它本身支持高并发。但是结合上面的需求来看,通用的go_spider框架并不能满足我们的全部需求,比如增量和翻页抓取等功能都无法完全自动化来实现。所以,我们根据实际需求做了如下的扩展(蓝色部分为扩展与优化的功能点):
图2-2扩展优化后的框架
1. 规则引擎
参照业内应用最广泛,且表现出色的Python Scrapy框架的规则设计理念。自主开发了规则解析引擎,最大程度抽象出业务以外的代码处理。每新增一个爬虫的时候,理论上我们只需要配置相应的规则及页面解析代码,框架就可以自动去实现递归爬取相应链接、解析内容、提交入库等操作。支持的规则配置项包括但不限于:
✱ Allow:正则表达式,当匹配到元素时,发起新的请求,进入下一次递归;
✱ Callback:回调函数名,当匹配到相应元素,就将该页面的DOM传递给回调函数,进行页面内容的抓取;
✱ Restrict_selector:HTML选择器,当前页面中要匹配的元素(一般这个元素都是包含href属性,可以交给Deny或Allow进行匹配的);
✱ Attrs:一般默认我们都是访问元素的href属性,当配置了这个内容以后,可以从指定的属性中读取属性值;
✱ IsResource:bool,特殊配置,针对那些指向的内容为资源文件的链接抓取。(如XLSX、PDF、PPT和视频等);
✱ Method:默认发起的网络请求都是GET方式,但针对一些深层页面,需要支持表单提交后返回。这里可以通过制定该属性的值为“POST”来实现表单提交;
✱ PostData:当指定POST表单请求时,可以通过该属性设定表单的值。
图2-3规则配置样例
2. 增量提取
在scheduler将网页请求插入请求队列以前,需要识别该请求是否已经抓取过。典型的key-value应用场景,但是每个爬虫要发起的网页请求可能达到几千甚至上万,所以该识别处理的运行速度一定要快,而且需要持久化处理。go_spider框架的任务队列默认是在内存中维护的,没有持久化操作,在异常退出或是重启时无法记录之前的爬取位置。为了保证该部分内存管理的高可用及稳定性,我们选择了成熟的内存数据库中间件redis来保存这些已经爬取的状态数据。Key就是页面请求的url、Value为数字1,可以实现随机访问,且避免了因为递归层级增多而导致的内存泄漏问题。
3. 指纹去重
已经具备上述url增量前提下,基本上不会出现重复爬取情况的出现。但是在实际过程中,确实存在url不同,但是内容却完全相同的网页。所以对我们就提出了一个全新的要求,就是如何快速识别出每一个网页的唯一标识呢?我们采取的主要是以下两种方式:
✱ “资讯标题+发布时间”转换成MD5编码;
✱ 页面全文转换成MD5编码;
实际使用中前者的比例会更高。MD5编码也是业内最常用的内容校验编码方式之一,在转码速度和内存消耗上有一个很好的平衡。指纹的生成策略方式是完全开放给开发者的,它是通过规则引擎的“FingerInput”属性来指定的,可以传入一个函数名,框架会自动调用该函数来获取指纹的定义。同样它也会被保存到redis中来使用。
图2-4指纹配置样例
4. 其他优化
针对既有框架,以及不断增加的业务需求,做了很多框架优化的工作。举例如下:
✱ 数据库连接池:原型框架的官方文档给出的示例是在pipeline中创建数据库连接,执行DML之后,就直接释放该连接。在我们实际应用场景中单次执行的爬虫数量非常庞大,如果采用上面的方式就会造成很多资源的消耗,并且影响整体性能。所以这里引入数据库连接池,在整个框架中是以单例模式的实例被使用,在每次执行DML之后,会将该连接释放回连接池,其他爬虫可以继续使用;
✱ 数据库pipeline共享:高度抽象了SQL语句代码的生成及执行,对于开发者来说,我们只需要在创建爬虫时传入一个数据库表名,并且在callback函数中将想要插入的字段值通过Page.AddField函数设定到参数实例中。框架就可以自动生成SQL并将数据插入数据库。这样所有爬虫可以共用一个pipeline,而不需要重复编写该部分代码 。
✱ 命令模式:可以通过在启动爬虫应用程序时,传入不同的参数来控制爬虫的运行频率,以及开关增量爬取去重处理(针对发起POST请求的URL是不能插入到redis去重数据队列的,否则就只能请求一次,第二次以后都会被去重机制阻断)等操作。好处是通过参数配置可以运行一个行为完全不同的爬虫,避免了维护多个应用程序带来的高昂成本。
三、未来展望
任何一个好的产品都不是一蹴而就的,基本需要在一个原型基础上,通过不断的扩展和优化,使其功能和性能达到一个极致。我们的爬虫框架也经历了这样一个历程,从代码重构,到各种个性化的性能优化和框架改进,使该框架已经可以很好地为我们的产品服务。但这并不是终点,未来我们还要从以下几个方面继续推动爬虫框架的发展:
✱ 动态JS渲染:有些页面中的数据,是需要经过JS渲染后才能够显示。目前我们遇到类似的业务场景,也都是采取直接从数据源头进行解析,进而绕开了JS渲染的处理。在未来我们考虑引入“JS解释器”来融合到框架中来解决该问题,可以预想到需要解决的问题还有很多;
✱ 支持分布式:如果要实现一个功能强大的爬虫系统,分布式是必须要解决的问题,尤其是在大数据分析场景下。未来我们也考虑引用zookeeper中间件,并且选定一个合适的分布式文件系统来支持任务的水平和垂直拆分;
✱ 平台化:我们的远期目标是将爬虫系统的功能和性能做到极致,然后优化封装和接口的设计。使该框架可以快速整合到公司其他爬虫应用场景的项目中去。也希望有兴趣的同事能多给提出意见或者一起讨论。
[参照资料]
网络爬虫/
查看全部
【分享吧】基于GO语言的爬虫框架在互联网项目中的应用
产品的爬虫框架设计之初,仅仅是为了爬取资讯。但是随着产品覆盖信息的扩大,爬虫的目标范围和需要支持的功能也在不断地进行扩展和复杂化。截至目前我们产品中的爬虫系统已经具备了高并发,高可用和高可扩展性的特点,可以利用很小的开发成本,就完成所有新增的需求。本文我们从基本概念为切入点,简单介绍一下目前主流的爬虫框架及特点,最终将项目中使用的爬虫框架结构,以及做了哪些优化和定制介绍给大家。希望能够让大家对网络爬虫有一个清楚的认识。
一、什么是爬虫
1
概念
网络爬虫是一种按照一定的规则,自动地抓取万维网(www)信息的程序或者脚本。是搜索引擎的一个重要组成部分。
通过爬虫软件更新自身的网站内容或其他网站的索引。网络爬虫可以将自己所访问的页面保存下来,以便搜索引擎事后生成索引供用户搜索。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件;定向爬虫则可以根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。以此来避免重复及不相关的页面被搜索到。
图1-1 工作原理
2
分类和目前主流爬虫
网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型(实际的网络爬虫系统通常是几种爬虫技术相结合实现的):
① 通用爬虫:爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低;
② 定向爬虫:选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求;
③ 增量爬虫:对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度;
④ 深层爬虫:对深层网页的爬取。深层网页是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。例如那些用户注册后内容才可见的网页就属于这个范畴。
网络爬虫诞生之初,大都是由解释型脚本语言编写(主要是python)。但随着互联网的高速发展,各主流开发语言基本都出现了一些出色的爬虫框架。整理了目前业内比较有名的框架如下:
✱ Scrapy(Python):一个快速、高效且易扩展的爬虫框架。可快速整合到python主流的web应用框架,并且能够使用redis等中间件快速搭建起分布式集群;
✱ Pyspider(Python):功能强大的爬虫框架,有自己的web UI;
✱ Apache Nutch(Java):灵活及高可扩展的爬虫框架;
✱ Crawler4j(Java):简单易用、轻量级的网络爬虫;
✱ Scraperjs(JS):高可用,功能强大的网络爬虫;
✱ node-crawler(JS):封装了简单易用的API;
✱ Goutte(PHP):可快速整合到Laravel引用框架;
✱ Pholcus(GO):分布式、高并发的强大爬虫,可通过web UI配置爬取策略(扩展性较差);
✱ go_spider(GO):一个出色,并且支持高并发的爬虫。扩展性强。
二、我们的爬虫
1
技术选型
文章开头的时候我们提到过产品的爬虫功能原始需求,主要是抓取新闻资讯。这样就要求爬虫必须具备以下功能:
1. 增量提取(已抓取的资讯不能重复抓取);
2. 页面指纹去重(存在url不同,但是内容完全相同的资讯,要识别出这部分资讯,避免重复抓取);
3. 翻页递归提取(资讯都是分页展示,要支持翻页抓取);
4. 定时提取(常驻内存爬虫进程浪费资源,需要能够定时运行爬虫)。
根据以上需求,项目的爬虫初版选用scrapy框架来实现,可以很好地满足业务需要。但是考虑到项目组成员熟悉python的比例不高,并且scrapy也需要一定的学习成本,新的开发人员无法快速熟悉代码并开发新功能。从2.0版本开始,重构采用go语言来实现爬虫系统。我们选择的就是上面提到的go_spider框架,主要考虑到的也是它的高可扩展性,方便我们做个性化开发及优化。从目前的效果来看还是很不错的,它的框架原型功能结构如下图:
图2-1 go_spider框架原型
2
定制化开发与优化
从上图中可以看到,go_spider框架本身优雅地分解了爬虫中各个模块,每部分只要专注自己的工作,最后由框架整合到一起完成爬虫功能。它本身支持高并发。但是结合上面的需求来看,通用的go_spider框架并不能满足我们的全部需求,比如增量和翻页抓取等功能都无法完全自动化来实现。所以,我们根据实际需求做了如下的扩展(蓝色部分为扩展与优化的功能点):
图2-2扩展优化后的框架
1. 规则引擎
参照业内应用最广泛,且表现出色的Python Scrapy框架的规则设计理念。自主开发了规则解析引擎,最大程度抽象出业务以外的代码处理。每新增一个爬虫的时候,理论上我们只需要配置相应的规则及页面解析代码,框架就可以自动去实现递归爬取相应链接、解析内容、提交入库等操作。支持的规则配置项包括但不限于:
✱ Allow:正则表达式,当匹配到元素时,发起新的请求,进入下一次递归;
✱ Callback:回调函数名,当匹配到相应元素,就将该页面的DOM传递给回调函数,进行页面内容的抓取;
✱ Restrict_selector:HTML选择器,当前页面中要匹配的元素(一般这个元素都是包含href属性,可以交给Deny或Allow进行匹配的);
✱ Attrs:一般默认我们都是访问元素的href属性,当配置了这个内容以后,可以从指定的属性中读取属性值;
✱ IsResource:bool,特殊配置,针对那些指向的内容为资源文件的链接抓取。(如XLSX、PDF、PPT和视频等);
✱ Method:默认发起的网络请求都是GET方式,但针对一些深层页面,需要支持表单提交后返回。这里可以通过制定该属性的值为“POST”来实现表单提交;
✱ PostData:当指定POST表单请求时,可以通过该属性设定表单的值。
图2-3规则配置样例
2. 增量提取
在scheduler将网页请求插入请求队列以前,需要识别该请求是否已经抓取过。典型的key-value应用场景,但是每个爬虫要发起的网页请求可能达到几千甚至上万,所以该识别处理的运行速度一定要快,而且需要持久化处理。go_spider框架的任务队列默认是在内存中维护的,没有持久化操作,在异常退出或是重启时无法记录之前的爬取位置。为了保证该部分内存管理的高可用及稳定性,我们选择了成熟的内存数据库中间件redis来保存这些已经爬取的状态数据。Key就是页面请求的url、Value为数字1,可以实现随机访问,且避免了因为递归层级增多而导致的内存泄漏问题。
3. 指纹去重
已经具备上述url增量前提下,基本上不会出现重复爬取情况的出现。但是在实际过程中,确实存在url不同,但是内容却完全相同的网页。所以对我们就提出了一个全新的要求,就是如何快速识别出每一个网页的唯一标识呢?我们采取的主要是以下两种方式:
✱ “资讯标题+发布时间”转换成MD5编码;
✱ 页面全文转换成MD5编码;
实际使用中前者的比例会更高。MD5编码也是业内最常用的内容校验编码方式之一,在转码速度和内存消耗上有一个很好的平衡。指纹的生成策略方式是完全开放给开发者的,它是通过规则引擎的“FingerInput”属性来指定的,可以传入一个函数名,框架会自动调用该函数来获取指纹的定义。同样它也会被保存到redis中来使用。
图2-4指纹配置样例
4. 其他优化
针对既有框架,以及不断增加的业务需求,做了很多框架优化的工作。举例如下:
✱ 数据库连接池:原型框架的官方文档给出的示例是在pipeline中创建数据库连接,执行DML之后,就直接释放该连接。在我们实际应用场景中单次执行的爬虫数量非常庞大,如果采用上面的方式就会造成很多资源的消耗,并且影响整体性能。所以这里引入数据库连接池,在整个框架中是以单例模式的实例被使用,在每次执行DML之后,会将该连接释放回连接池,其他爬虫可以继续使用;
✱ 数据库pipeline共享:高度抽象了SQL语句代码的生成及执行,对于开发者来说,我们只需要在创建爬虫时传入一个数据库表名,并且在callback函数中将想要插入的字段值通过Page.AddField函数设定到参数实例中。框架就可以自动生成SQL并将数据插入数据库。这样所有爬虫可以共用一个pipeline,而不需要重复编写该部分代码 。
✱ 命令模式:可以通过在启动爬虫应用程序时,传入不同的参数来控制爬虫的运行频率,以及开关增量爬取去重处理(针对发起POST请求的URL是不能插入到redis去重数据队列的,否则就只能请求一次,第二次以后都会被去重机制阻断)等操作。好处是通过参数配置可以运行一个行为完全不同的爬虫,避免了维护多个应用程序带来的高昂成本。
三、未来展望
任何一个好的产品都不是一蹴而就的,基本需要在一个原型基础上,通过不断的扩展和优化,使其功能和性能达到一个极致。我们的爬虫框架也经历了这样一个历程,从代码重构,到各种个性化的性能优化和框架改进,使该框架已经可以很好地为我们的产品服务。但这并不是终点,未来我们还要从以下几个方面继续推动爬虫框架的发展:
✱ 动态JS渲染:有些页面中的数据,是需要经过JS渲染后才能够显示。目前我们遇到类似的业务场景,也都是采取直接从数据源头进行解析,进而绕开了JS渲染的处理。在未来我们考虑引入“JS解释器”来融合到框架中来解决该问题,可以预想到需要解决的问题还有很多;
✱ 支持分布式:如果要实现一个功能强大的爬虫系统,分布式是必须要解决的问题,尤其是在大数据分析场景下。未来我们也考虑引用zookeeper中间件,并且选定一个合适的分布式文件系统来支持任务的水平和垂直拆分;
✱ 平台化:我们的远期目标是将爬虫系统的功能和性能做到极致,然后优化封装和接口的设计。使该框架可以快速整合到公司其他爬虫应用场景的项目中去。也希望有兴趣的同事能多给提出意见或者一起讨论。
[参照资料]
网络爬虫/
是时候表演真正的技术了——观海技术部纳新啦~
网站优化 • 优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2022-05-08 21:26
获取到发送者的OpenID, 从数据库里查出之前绑定的学号和教务处密码,发送给在学校内的服务器。
校内的服务器用学号和密码去登陆选课系统。这种模拟用户行为,自动抓取信息的程序一般被叫做爬虫。
表面上选课系统是这个样子。
实际上,在我们看来是这样的。
这种代码叫超文本标记语言,简称HTML。浏览器收到这些代码后,就会在屏幕上画出两个输入框、确认提交按钮、重置按钮和对应的文字。图中第一行也告诉我们学号和密码会以POST方式发送到/pls/wwwbks/bks_login2.login。
于是我们用PHP的curl库来发送密码。
登录之后就可以在/pls/wwwbks/xk.CourseView这个地址看到课表了。
下一步是用正则表达式在网页中查找出课程名和上课的时间地点。
课表是个用HTML画的表格,所以(.|\n)*?可以匹配行,可以匹配列。这里用preg_match_all函数来执行正则表达式匹配。
获取到课表之后,我们会将课表转化为json格式,返回给观海在腾讯云上的服务器。在腾讯云上的服务器就会生成你所看到的页面。这里用到了jQuery和Bootstrap这两个前端框架。
这就是用微信查课表的大致过程了。
既然你都看到这里了,就不考虑一下我们观海听涛技术部的纳新嘛?
(不是所有人都能看到这里哦~)
观海听涛技术部负责维护观海听涛论坛以及微信后台,用代码使同学们的生活更加方便快捷、丰富多彩。现在我们正在招募PHP开发和Linux运维。
要求:
1、对计算机技术,尤其是PHP开发和Linux运维以及云计算有浓厚兴趣和热情。
2、有良好的学习能力和独立解决问题的能力,懂得“提问的智慧”。
3、有阅读中英文文档的能力。
4、课余时间比较充足。
5、计算机相关专业或有编程经验者加分,但其他专业或是没有经验的同学也可以报名。
其实半路出家的程序员也挺多的,比如腾讯著名网络安全专家tombkeeper,之前是学医的,所以他外号叫“妇科圣手”
待遇:
1、提供舒适的工作环境。
2、可以得到来自今日头条等大型互联网公司大佬的指导和内推机会。
3、写的代码在不造成安全隐患的情况下可以放到自己GitHub上。
报名方式:
发邮件到 。
邮件里面除了姓名QQ观海账号等联系方式,简短的自我介绍,也可以写写自己打算怎么学习PHP与Linux、找了哪些书籍教程学习资料、有什么学习计划。我们会在收到邮件后安排面试。
快来加入我们吧~
文案 | 专业核弹头喷漆
图片 |专业核弹头喷漆
查看全部
是时候表演真正的技术了——观海技术部纳新啦~
获取到发送者的OpenID, 从数据库里查出之前绑定的学号和教务处密码,发送给在学校内的服务器。
校内的服务器用学号和密码去登陆选课系统。这种模拟用户行为,自动抓取信息的程序一般被叫做爬虫。
表面上选课系统是这个样子。
实际上,在我们看来是这样的。
这种代码叫超文本标记语言,简称HTML。浏览器收到这些代码后,就会在屏幕上画出两个输入框、确认提交按钮、重置按钮和对应的文字。图中第一行也告诉我们学号和密码会以POST方式发送到/pls/wwwbks/bks_login2.login。
于是我们用PHP的curl库来发送密码。
登录之后就可以在/pls/wwwbks/xk.CourseView这个地址看到课表了。
下一步是用正则表达式在网页中查找出课程名和上课的时间地点。
课表是个用HTML画的表格,所以(.|\n)*?可以匹配行,可以匹配列。这里用preg_match_all函数来执行正则表达式匹配。
获取到课表之后,我们会将课表转化为json格式,返回给观海在腾讯云上的服务器。在腾讯云上的服务器就会生成你所看到的页面。这里用到了jQuery和Bootstrap这两个前端框架。
这就是用微信查课表的大致过程了。
既然你都看到这里了,就不考虑一下我们观海听涛技术部的纳新嘛?
(不是所有人都能看到这里哦~)
观海听涛技术部负责维护观海听涛论坛以及微信后台,用代码使同学们的生活更加方便快捷、丰富多彩。现在我们正在招募PHP开发和Linux运维。
要求:
1、对计算机技术,尤其是PHP开发和Linux运维以及云计算有浓厚兴趣和热情。
2、有良好的学习能力和独立解决问题的能力,懂得“提问的智慧”。
3、有阅读中英文文档的能力。
4、课余时间比较充足。
5、计算机相关专业或有编程经验者加分,但其他专业或是没有经验的同学也可以报名。
其实半路出家的程序员也挺多的,比如腾讯著名网络安全专家tombkeeper,之前是学医的,所以他外号叫“妇科圣手”
待遇:
1、提供舒适的工作环境。
2、可以得到来自今日头条等大型互联网公司大佬的指导和内推机会。
3、写的代码在不造成安全隐患的情况下可以放到自己GitHub上。
报名方式:
发邮件到 。
邮件里面除了姓名QQ观海账号等联系方式,简短的自我介绍,也可以写写自己打算怎么学习PHP与Linux、找了哪些书籍教程学习资料、有什么学习计划。我们会在收到邮件后安排面试。
快来加入我们吧~
文案 | 专业核弹头喷漆
图片 |专业核弹头喷漆
通用方法:php利用curl方法和正则表达式提取网页内容
网站优化 • 优采云 发表了文章 • 0 个评论 • 154 次浏览 • 2022-09-23 13:12
在网页开发中,有时我们需要从其他网页的内容中提取我们需要的信息。抓取页面信息需要使用curl方法,但是要从抓取的信息中提取出我们真正需要的内容,需要使用正则表达式进行匹配。
在这里,我将简要说明如何使用正则匹配从网站的页面中提取我们想要的招聘信息,分为以下几个步骤:
1、分析我们要爬取的内容网页的url构成;
2、根据实际情况拼接我们需要的url;
3、阅读网页内容;
4、使用正则模式根据返回的内容匹配我们需要的内容;
第一步:分析url组成:
在网站的搜索职位页面,选择要搜索的职位地点和职位,
发现它的url组成如下:
地点:
Øji参数的值是工位:这里看到的值“%E7%BB%B5%E9%98%B3”不是乱码;就是中文使用urlencode的结果,我们也可以直接跟明码,比如ji=Mianyang;
ØKw参数的值为位置;
Øp参数为页码;
第二步现在我们构造我们要访问的url:
步骤 3 使用 file_get_contents 函数获取 网站内容:
现在需要用谷歌浏览器的调试工具观察这部分的html结构,才能写出对应的正则表达式:
这部分的html结构是:
Step 4 使用正则表达式匹配所需内容:
先用正则表达式匹配这部分的值,参考上面的html结构,构造的正则表达式(这里我们使用效率更高的PCRE模式)为:
我们使用匹配函数preg_match_all:
通过以上匹配,可以将匹配到的内容放入$arr数组中,返回内容如下:
继续使用正则表达式匹配我们需要的内容,但是之前构造的url中的页码值为1,我们需要匹配所有的页面,所以需要修改之前的url,需要使用a循环,但具有什么样的循环结构?我们需要先观察页面中“下一页”按钮的html结构:
我们可以匹配上图中a标签中的类名“nopress2”来判断是否有下一页。如果值能匹配,则表示没有下一页,所以我们使用do...while循环结构来获取所有页面内容,代码修改如下:
当“nopress2”匹配时,不再满足while条件,循环停止。
1、根据下面的html结构,在对应的a标签中找到job title和url
这里我们使用foreach遍历我们刚刚得到的数组$arr,并添加代码do...while:
2 找到公司名称和对应的url,在foreach中继续添加代码
3 匹配配置职位的月薪、工作地点、发布时间,继续添加代码
经过以上处理,最终得到如下形式的数组:
此时,我们有了要提取的数据。
完整代码:
这个文章只是提供了一个通用的方法来抓取网页上我们想要的内容。中间的一些步骤和代码还是可以优化的,但是还是有不足的地方。欢迎大家一起讨论,毕竟在编程中,没有最好的代码,只有更好的想法。
解密:修改hosts文件禁止访问和加速访问某网站
一般情况下,如果我们需要输入一个网站,我们可以直接输入网站的URL来访问。在这个过程中会将URL转换成IP地址,然后再把IP地址转换成IP地址到网站的服务器,但是这个过程比较长,所以访问速度比较慢下面我们来说说如何通过修改hosts文件来禁用访问,提高网站的访问速度!
禁止访问 网站trick
1),用记事本打开C:\Windows\System32\drivers\etc\文件夹下的hosts文件
2),在hosts文件中填写你要封禁的域名,在域名前加127.0.0.1并隔开带空格的本地 IP。节省。如下图(原理是把域名解释为127.的本地IP,所以输入的域名打不开。通过推断可以改变127.@的IP >0 到你要解释的那个。IP 也可以)
以上是通过修改HOSTS文件来禁止对某个网站的访问。释放方式:删除添加的IP和对应的域名
改进对网站速度技巧的访问
1),获取你需要的网站的IP地址,打开运行,输入cmd打开命令提示符; ping你想要和需要的网站域名,获取IP并复制。
2),用记事本打开C:\Windows\System32\drivers\etc\文件夹下的hosts文件,将获取到的IP填入hosts文件。 IP 和域名之间用空格隔开。保存就行了
3),打开你输入的域名,测试一下。 (原理:输入域名时,不需要通过在线服务器解析IP地址,直接在本地解析IP地址,这样会更快。现在大部分光纤网络已经非常快了,而且你可能肉眼感觉不到改善,但事实是改善了。) 查看全部
通用方法:php利用curl方法和正则表达式提取网页内容
在网页开发中,有时我们需要从其他网页的内容中提取我们需要的信息。抓取页面信息需要使用curl方法,但是要从抓取的信息中提取出我们真正需要的内容,需要使用正则表达式进行匹配。
在这里,我将简要说明如何使用正则匹配从网站的页面中提取我们想要的招聘信息,分为以下几个步骤:
1、分析我们要爬取的内容网页的url构成;
2、根据实际情况拼接我们需要的url;
3、阅读网页内容;
4、使用正则模式根据返回的内容匹配我们需要的内容;
第一步:分析url组成:
在网站的搜索职位页面,选择要搜索的职位地点和职位,
发现它的url组成如下:
地点:
Øji参数的值是工位:这里看到的值“%E7%BB%B5%E9%98%B3”不是乱码;就是中文使用urlencode的结果,我们也可以直接跟明码,比如ji=Mianyang;
ØKw参数的值为位置;
Øp参数为页码;
第二步现在我们构造我们要访问的url:
步骤 3 使用 file_get_contents 函数获取 网站内容:

现在需要用谷歌浏览器的调试工具观察这部分的html结构,才能写出对应的正则表达式:
这部分的html结构是:
Step 4 使用正则表达式匹配所需内容:
先用正则表达式匹配这部分的值,参考上面的html结构,构造的正则表达式(这里我们使用效率更高的PCRE模式)为:
我们使用匹配函数preg_match_all:
通过以上匹配,可以将匹配到的内容放入$arr数组中,返回内容如下:
继续使用正则表达式匹配我们需要的内容,但是之前构造的url中的页码值为1,我们需要匹配所有的页面,所以需要修改之前的url,需要使用a循环,但具有什么样的循环结构?我们需要先观察页面中“下一页”按钮的html结构:
我们可以匹配上图中a标签中的类名“nopress2”来判断是否有下一页。如果值能匹配,则表示没有下一页,所以我们使用do...while循环结构来获取所有页面内容,代码修改如下:

当“nopress2”匹配时,不再满足while条件,循环停止。
1、根据下面的html结构,在对应的a标签中找到job title和url
这里我们使用foreach遍历我们刚刚得到的数组$arr,并添加代码do...while:
2 找到公司名称和对应的url,在foreach中继续添加代码
3 匹配配置职位的月薪、工作地点、发布时间,继续添加代码
经过以上处理,最终得到如下形式的数组:
此时,我们有了要提取的数据。
完整代码:
这个文章只是提供了一个通用的方法来抓取网页上我们想要的内容。中间的一些步骤和代码还是可以优化的,但是还是有不足的地方。欢迎大家一起讨论,毕竟在编程中,没有最好的代码,只有更好的想法。
解密:修改hosts文件禁止访问和加速访问某网站
一般情况下,如果我们需要输入一个网站,我们可以直接输入网站的URL来访问。在这个过程中会将URL转换成IP地址,然后再把IP地址转换成IP地址到网站的服务器,但是这个过程比较长,所以访问速度比较慢下面我们来说说如何通过修改hosts文件来禁用访问,提高网站的访问速度!
禁止访问 网站trick
1),用记事本打开C:\Windows\System32\drivers\etc\文件夹下的hosts文件

2),在hosts文件中填写你要封禁的域名,在域名前加127.0.0.1并隔开带空格的本地 IP。节省。如下图(原理是把域名解释为127.的本地IP,所以输入的域名打不开。通过推断可以改变127.@的IP >0 到你要解释的那个。IP 也可以)
以上是通过修改HOSTS文件来禁止对某个网站的访问。释放方式:删除添加的IP和对应的域名
改进对网站速度技巧的访问

1),获取你需要的网站的IP地址,打开运行,输入cmd打开命令提示符; ping你想要和需要的网站域名,获取IP并复制。
2),用记事本打开C:\Windows\System32\drivers\etc\文件夹下的hosts文件,将获取到的IP填入hosts文件。 IP 和域名之间用空格隔开。保存就行了
3),打开你输入的域名,测试一下。 (原理:输入域名时,不需要通过在线服务器解析IP地址,直接在本地解析IP地址,这样会更快。现在大部分光纤网络已经非常快了,而且你可能肉眼感觉不到改善,但事实是改善了。)
php用正则表达抓取网页中文章啊,可以快速获取里面全文内容
网站优化 • 优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-09-01 08:01
php用正则表达抓取网页中文章啊,可以快速获取里面全文内容用wordpress自带的正则表达抓取功能,可以自动生成规则图片中存在中文,所以如果这篇图片不是从中文再到英文,在不改变文本和作者名称的情况下是无法抓取出来的。不过如果该图片是在php文件里生成的,wordpress和php文件应该是同一个php文件,就可以像抓取网页那样抓取出来。
谢邀这样的情况,从我的经验来看,最难,最正确的方法是,从url=^\.\.php开始编写shell脚本,抓取数据库里全部的中文,
用wordpress自带正则表达式抓取插件,
wordpress官方自带的正则就可以抓取
官方自带正则表达式/faq/faq/?result=dihi4ciu
如果没有指定域名,php抓取中文有多种可能性:手动查询中文,生成搜索引擎的爬虫,并搜索网站对应服务器上的关键字进行下载;或者通过wordpress自带正则表达式抓取并存储数据库数据;可以通过wordpress自带的服务器抓取;不过以上几种方法都是无源码抓取,而且后者需要修改wordpress程序才可以使用,在我做脚本后端的时候,aspshopifymvcpatiter只支持wordpress,但wordpress官方从来不支持cms抓取,因为这样才能真正提高php查询请求,并且必须做“正则表达式\u”,因为“\u”这个包含几乎所有的正则模式。我好多年前用过,没用几次就被apache挖坑了。 查看全部
php用正则表达抓取网页中文章啊,可以快速获取里面全文内容
php用正则表达抓取网页中文章啊,可以快速获取里面全文内容用wordpress自带的正则表达抓取功能,可以自动生成规则图片中存在中文,所以如果这篇图片不是从中文再到英文,在不改变文本和作者名称的情况下是无法抓取出来的。不过如果该图片是在php文件里生成的,wordpress和php文件应该是同一个php文件,就可以像抓取网页那样抓取出来。

谢邀这样的情况,从我的经验来看,最难,最正确的方法是,从url=^\.\.php开始编写shell脚本,抓取数据库里全部的中文,
用wordpress自带正则表达式抓取插件,

wordpress官方自带的正则就可以抓取
官方自带正则表达式/faq/faq/?result=dihi4ciu
如果没有指定域名,php抓取中文有多种可能性:手动查询中文,生成搜索引擎的爬虫,并搜索网站对应服务器上的关键字进行下载;或者通过wordpress自带正则表达式抓取并存储数据库数据;可以通过wordpress自带的服务器抓取;不过以上几种方法都是无源码抓取,而且后者需要修改wordpress程序才可以使用,在我做脚本后端的时候,aspshopifymvcpatiter只支持wordpress,但wordpress官方从来不支持cms抓取,因为这样才能真正提高php查询请求,并且必须做“正则表达式\u”,因为“\u”这个包含几乎所有的正则模式。我好多年前用过,没用几次就被apache挖坑了。
php用正则表达抓取网页中文章列表不是有一个很不错的题主
网站优化 • 优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-08-11 22:02
php用正则表达抓取网页中文章列表
不是有一个很不错的题主可以参考一下【web开发】restfulapi接口参考-book-list.html
要先去了解服务器知识,
一句话看这些htmlcssjavascriptsql我觉得写不出,要想玩出花,和玩微博差不多。
crawler1.0有这个需求的人多的是,这个没人做,等别人来做吧
newsradio也可以先去看看
wordpress首页
深入浅出mysql
写api跟写excel有什么区别?
可以参考淘宝采集
emm,
fbapi?info=0000045e0bcbd383201bebc7f552f2849eb568
如果你们网站已经有html和css代码,那么可以采用wordpress的导航模块。方法见如何在wordpress模板中使用导航功能?-廖高的回答如果你们网站还没有开始做,想采用外部api就意味着也需要你们自己写一些代码。而且技术含量会比较高。
1、可以直接申请一个账号,
2、可以把关键词都转化为二进制形式,
3、具体案例可以直接问采集公司--好吧,上述是想说的,
云采集。在电脑上登录young模板网站,以可连接客户端的方式登录,即可采集全站中的中文网站。当然,别忘了把重要关键词加上吧。 查看全部
php用正则表达抓取网页中文章列表不是有一个很不错的题主
php用正则表达抓取网页中文章列表
不是有一个很不错的题主可以参考一下【web开发】restfulapi接口参考-book-list.html
要先去了解服务器知识,
一句话看这些htmlcssjavascriptsql我觉得写不出,要想玩出花,和玩微博差不多。
crawler1.0有这个需求的人多的是,这个没人做,等别人来做吧

newsradio也可以先去看看
wordpress首页
深入浅出mysql
写api跟写excel有什么区别?
可以参考淘宝采集
emm,

fbapi?info=0000045e0bcbd383201bebc7f552f2849eb568
如果你们网站已经有html和css代码,那么可以采用wordpress的导航模块。方法见如何在wordpress模板中使用导航功能?-廖高的回答如果你们网站还没有开始做,想采用外部api就意味着也需要你们自己写一些代码。而且技术含量会比较高。
1、可以直接申请一个账号,
2、可以把关键词都转化为二进制形式,
3、具体案例可以直接问采集公司--好吧,上述是想说的,
云采集。在电脑上登录young模板网站,以可连接客户端的方式登录,即可采集全站中的中文网站。当然,别忘了把重要关键词加上吧。
成为专业程序员路上用到的各种优秀资料、神器及框架
网站优化 • 优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2022-08-01 11:28
温馨提示:本文包含大量外部链接,墙裂建议小伙伴们点击 “阅读原文“ 进行阅读和Fork。:)前言
成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。
笔者作为一位tool mad,将工作以来用到的各种优秀资料、神器及框架整理在此,毕竟好记性不如烂键盘,此项目可以作为自己的不时之需。
本人喜欢折腾,记录的东西也比较杂,各方面都会有一些,内容按重要等级排序,大家各取所需。
这里的东西会持续积累下去,欢迎Star,也欢迎发PR给我。
Thonatos.Yang整理的GitBook版本,阅读体验更佳:
目录资料篇技术站点必看书籍大牛博客GitHub篇
Awesome
书籍资料
优秀项目
前端 & Node.js
工作,工具
工具篇平台工具常用工具第三方服务爬虫相关(好玩的工具)安全相关Web服务器性能/压力测试工具/负载均衡器大数据处理/数据分析/分布式工具Web前端语言篇
折腾中:Scala、Python、Lua、JavaScript、Go
待折腾:
ScalaJavaPythonSwift
客户端
Framework
小工具
游戏
.NETC & C++其他游戏开发相关日志聚合,分布式日志收集RTP,实时传输协议与音视频 查看全部
成为专业程序员路上用到的各种优秀资料、神器及框架
温馨提示:本文包含大量外部链接,墙裂建议小伙伴们点击 “阅读原文“ 进行阅读和Fork。:)前言
成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。
笔者作为一位tool mad,将工作以来用到的各种优秀资料、神器及框架整理在此,毕竟好记性不如烂键盘,此项目可以作为自己的不时之需。
本人喜欢折腾,记录的东西也比较杂,各方面都会有一些,内容按重要等级排序,大家各取所需。
这里的东西会持续积累下去,欢迎Star,也欢迎发PR给我。
Thonatos.Yang整理的GitBook版本,阅读体验更佳:

目录资料篇技术站点必看书籍大牛博客GitHub篇
Awesome
书籍资料
优秀项目
前端 & Node.js
工作,工具
工具篇平台工具常用工具第三方服务爬虫相关(好玩的工具)安全相关Web服务器性能/压力测试工具/负载均衡器大数据处理/数据分析/分布式工具Web前端语言篇

折腾中:Scala、Python、Lua、JavaScript、Go
待折腾:
ScalaJavaPythonSwift
客户端
Framework
小工具
游戏
.NETC & C++其他游戏开发相关日志聚合,分布式日志收集RTP,实时传输协议与音视频
php用正则表达抓取网页中文章方法特别简单(组图)
网站优化 • 优采云 发表了文章 • 0 个评论 • 87 次浏览 • 2022-07-26 00:02
php用正则表达抓取网页中文章方法特别简单,很多比较大型的网站都是用的php来抓取网页中文章。scrapy是现在很多互联网公司使用的爬虫框架,封装出来一套比较完善的爬虫组件,适合特定领域快速抓取一些网站的中文段子。今天我们就来学习如何用php来抓取github中搜索结果的中文段子!首先我们可以打开开发者工具,在github搜索页面搜索“哔哩哔哩”,就能看到很多跟“哔哩哔哩”有关的结果。
由于我们都不知道搜索引擎的规则,就只能自己写了。首先我们要写一个重定向网址的函数,例如将其他网站的url重定向到该网址的页面,然后用js或cookie加载页面,再用正则表达抓取搜索结果到本地。本实战参考了codeforces的代码,codeforces使用scrapy-galleryjs()框架为使用方便,我们不使用jquery等框架。
//正则表达抓取下面的结果url:/[0-9](-hwh-zee)[0-9](__abbucket)[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]user-agent:'mozilla/5.0(windowsnt6.1;wow64)applewebkit/537.36(khtml,likegecko)chrome/74.0.3350.110safari/537.36'encoding:utf-8'/#我们就是定位好了页面url及结果url然后用正则来抓取搜索结果使用:;code=&site=site-page&query=一共就那几行代码,即可抓取github中所有的中文结果。
代码开源在github上::,欢迎关注我的微信公众号:zouzhezhejiuying如果觉得有用,点个赞吧!。 查看全部
php用正则表达抓取网页中文章方法特别简单(组图)
php用正则表达抓取网页中文章方法特别简单,很多比较大型的网站都是用的php来抓取网页中文章。scrapy是现在很多互联网公司使用的爬虫框架,封装出来一套比较完善的爬虫组件,适合特定领域快速抓取一些网站的中文段子。今天我们就来学习如何用php来抓取github中搜索结果的中文段子!首先我们可以打开开发者工具,在github搜索页面搜索“哔哩哔哩”,就能看到很多跟“哔哩哔哩”有关的结果。

由于我们都不知道搜索引擎的规则,就只能自己写了。首先我们要写一个重定向网址的函数,例如将其他网站的url重定向到该网址的页面,然后用js或cookie加载页面,再用正则表达抓取搜索结果到本地。本实战参考了codeforces的代码,codeforces使用scrapy-galleryjs()框架为使用方便,我们不使用jquery等框架。

//正则表达抓取下面的结果url:/[0-9](-hwh-zee)[0-9](__abbucket)[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]user-agent:'mozilla/5.0(windowsnt6.1;wow64)applewebkit/537.36(khtml,likegecko)chrome/74.0.3350.110safari/537.36'encoding:utf-8'/#我们就是定位好了页面url及结果url然后用正则来抓取搜索结果使用:;code=&site=site-page&query=一共就那几行代码,即可抓取github中所有的中文结果。
代码开源在github上::,欢迎关注我的微信公众号:zouzhezhejiuying如果觉得有用,点个赞吧!。
php用正则表达抓取网页中文章是否可行?程序语言得到解放
网站优化 • 优采云 发表了文章 • 0 个评论 • 74 次浏览 • 2022-07-03 23:00
php用正则表达抓取网页中文章是否可行?程序语言得到解放。
如果有其他语言知识的话php确实应该使用python作为主要开发语言,而且python本身也是做web开发最好的语言之一,php的优势更多在于简单,优秀的性能,丰富的第三方库的支持,良好的社区以及良好的代码风格python所面临的问题php底层已经很封闭了,和其他语言比起来甚至略显落后python作为一门脚本语言,脚本语言本身很适合快速开发和小规模部署,并且python和awk,random库很有渊源,使用python开发一个awk包,在部署调试方面也很方便,而且在处理大规模计算问题的时候,python的发展前景要比php好,毕竟php核心竞争力只在于快速开发的脚本语言,可是python,php由于他个人定义程度过高,包含了太多非本职业务的功能,导致python的核心竞争力已经不在其上,从人工智能到flask这样的mvc框架,都是建立在python上的php作为一个长期被包装为脚本语言的程序员,建议我在学习php的时候多用phpstorm。
找程序员看看:
能比的应该是c++,这是全面的性能的主流语言,但php显然还有很多不足的地方,目前我了解到的还没有一个语言是能像c++那样一个程序能包含c还有javahtmlpythonphp的所有功能的。php,不管是语言还是社区都显然要差其他语言一大截。c++很多时候是作为一个库或者开发工具使用,做web开发会用到php甚至javahtmlpythonphp这样的语言,如果你想做上层web开发的话,建议避开php。 查看全部
php用正则表达抓取网页中文章是否可行?程序语言得到解放
php用正则表达抓取网页中文章是否可行?程序语言得到解放。

如果有其他语言知识的话php确实应该使用python作为主要开发语言,而且python本身也是做web开发最好的语言之一,php的优势更多在于简单,优秀的性能,丰富的第三方库的支持,良好的社区以及良好的代码风格python所面临的问题php底层已经很封闭了,和其他语言比起来甚至略显落后python作为一门脚本语言,脚本语言本身很适合快速开发和小规模部署,并且python和awk,random库很有渊源,使用python开发一个awk包,在部署调试方面也很方便,而且在处理大规模计算问题的时候,python的发展前景要比php好,毕竟php核心竞争力只在于快速开发的脚本语言,可是python,php由于他个人定义程度过高,包含了太多非本职业务的功能,导致python的核心竞争力已经不在其上,从人工智能到flask这样的mvc框架,都是建立在python上的php作为一个长期被包装为脚本语言的程序员,建议我在学习php的时候多用phpstorm。

找程序员看看:
能比的应该是c++,这是全面的性能的主流语言,但php显然还有很多不足的地方,目前我了解到的还没有一个语言是能像c++那样一个程序能包含c还有javahtmlpythonphp的所有功能的。php,不管是语言还是社区都显然要差其他语言一大截。c++很多时候是作为一个库或者开发工具使用,做web开发会用到php甚至javahtmlpythonphp这样的语言,如果你想做上层web开发的话,建议避开php。
php用正则表达网页中文章,抓取到后,(图)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-07-02 03:03
<p>php用正则表达抓取网页中文章,抓取到后,我们首先想知道爬虫下载到的文章是文章的页面还是源代码,php提供了两种方法,一种是httpcookie的txt字典,一种是正则表达式的splitslicemipmap。接下来解释一下split的作用,以php抓取1404字数的网页为例。if(str(newfile('r'))=http_ssl_cookie_level&&str(newfile('r')) 查看全部
php用正则表达网页中文章,抓取到后,(图)
<p>php用正则表达抓取网页中文章,抓取到后,我们首先想知道爬虫下载到的文章是文章的页面还是源代码,php提供了两种方法,一种是httpcookie的txt字典,一种是正则表达式的splitslicemipmap。接下来解释一下split的作用,以php抓取1404字数的网页为例。if(str(newfile('r'))=http_ssl_cookie_level&&str(newfile('r'))
当我们学Python时,我们学什么?
网站优化 • 优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2022-06-24 17:55
很多朋友学习Python一段时间后,觉得有点入门了,但是不知道接下来该怎么做。如果其中有人是为了找工作而学习的Python,那么你其实很容易就可以找到自己学习的方向和目标。
这也是我为什么要分享今天这篇来自简书的文章的原因(已获作者授权)。文中作者爬取了大量Python岗位的职位要求,对于你该学哪些东西有很好的参考价值。
以下是正文,作者信息见文末,希望对你有所帮助:
虽然有时觉得Python简单得不像编程语言,知乎上也有人说,“requests 好用的让人想哭”。但当我们学习一门编程语言时,要学习哪些内容,怎么学习,还是很值得深入探究的。
先看一下Python官网上的说明:
powerful, fast, easy, 对,这就是赤果果的广告。不过我用下来的感觉确是如此,最大的问题是在于它太强大了有太多的库,貌似没有一个地方可以集中查看所有库的文档( 算吗?)。那Python究竟能做些什么?
还是先看一下官网上的说明:
The Python Package Index (PyPI) hosts thousands of third-party modules for Python. Both Python's standard library and the community-contributed modules allow for endless possibilities.
再看一下知乎上的回答,大家都用Python做什么?
看到Python的功能强大了吧。现在工作需要的一些网络数据抓取,我都用Python处理了。对于一个小白来说学习Python要注意些什么,哪些是重点,如果自学Python找一份开发的工作,重点又该是什么?
还是用数据说话,我用Python写了一段代码,把51JOB上上海地区Python职位的要求爬取下来,看看公司里对Python开发的要求是什么,这样你学习起来才更有针对性。
一共抓取了194个Python开发岗位
一、自学中一个最大的问题是,你没有找到应用的场景
大多数同学在自学一门编程语言时,是没有应用的场景感。就是不知道学了做什么用,讲不出具体、合理的应用。如果是有老师教,老师带着你学,是没有关系的。因为每一阶段做什么练习,做什么项目,知识点学到什么程度,老师都会帮你规划好。自学不一样,最好每个技能点都要有明确的应用场景感,这样学习起来目标、目的更强,不会出现看不到进步,自我否定而放弃。
学习Python,比较好快速找到应用的场景。如果马上可以找到解决工作生活中的问题,用Python来实现,学习的效果和效率就会立马得到提升。这种学习方法,采铜称之为“设计式操练”。
还是回到刚才知乎上的回答,有的人拿Python写了一个12306余票检测脚本;有的人用Python爬取图片和电影资源... ... 这些就是具体应用的场景感,然后分解功能,一步一步完成,Python可以用最少的代码来实现。
二、当我们学Python,我们学什么
1)如果学Python是想了解编程语言,做一些实用小工具来提高效率,那学习的主要内容应该是Python的网络访问(urllib, urllib2, requests),爬虫相关的库,正则表达式, BeautifulSoup,XPath,Excel,数据库MySQLdb模块等,了解html网页。
这些知识熟练应用,从网络上抓取数据,再进行分析处理,完全没有问题。
2)如果你想学习Python语言找一份开发的工作,那看企业的岗位中有哪些要求。(一共194个Python开发岗位)
再看一下岗位需求量,我把Java的也列出来作一个对比:
城市Python岗位数量(个)Java岗位数量(个)
上海
287
9993
西安
10
1309
武汉
23
2018
乌鲁木齐
0
55
北京
347
12235
结论:
Python语言作为工作中效率提升的工具,非常好用的。
Python好用易学,但作为程序员主力开发语言,要求比较高,大多需要其他语言的使用经验。Python作为程序猿的想扩展的新语言非常合适。
如果没有编程语言基础,想学习Python后从事开发,要求偏高。重点要放在Web学习,框架学习上。打好Linux基础,多了解一些Java还是比较好。
文/向右奔跑(简书作者)
原文链接:
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 查看全部
当我们学Python时,我们学什么?
很多朋友学习Python一段时间后,觉得有点入门了,但是不知道接下来该怎么做。如果其中有人是为了找工作而学习的Python,那么你其实很容易就可以找到自己学习的方向和目标。
这也是我为什么要分享今天这篇来自简书的文章的原因(已获作者授权)。文中作者爬取了大量Python岗位的职位要求,对于你该学哪些东西有很好的参考价值。
以下是正文,作者信息见文末,希望对你有所帮助:
虽然有时觉得Python简单得不像编程语言,知乎上也有人说,“requests 好用的让人想哭”。但当我们学习一门编程语言时,要学习哪些内容,怎么学习,还是很值得深入探究的。
先看一下Python官网上的说明:
powerful, fast, easy, 对,这就是赤果果的广告。不过我用下来的感觉确是如此,最大的问题是在于它太强大了有太多的库,貌似没有一个地方可以集中查看所有库的文档( 算吗?)。那Python究竟能做些什么?
还是先看一下官网上的说明:
The Python Package Index (PyPI) hosts thousands of third-party modules for Python. Both Python's standard library and the community-contributed modules allow for endless possibilities.
再看一下知乎上的回答,大家都用Python做什么?
看到Python的功能强大了吧。现在工作需要的一些网络数据抓取,我都用Python处理了。对于一个小白来说学习Python要注意些什么,哪些是重点,如果自学Python找一份开发的工作,重点又该是什么?
还是用数据说话,我用Python写了一段代码,把51JOB上上海地区Python职位的要求爬取下来,看看公司里对Python开发的要求是什么,这样你学习起来才更有针对性。
一共抓取了194个Python开发岗位
一、自学中一个最大的问题是,你没有找到应用的场景
大多数同学在自学一门编程语言时,是没有应用的场景感。就是不知道学了做什么用,讲不出具体、合理的应用。如果是有老师教,老师带着你学,是没有关系的。因为每一阶段做什么练习,做什么项目,知识点学到什么程度,老师都会帮你规划好。自学不一样,最好每个技能点都要有明确的应用场景感,这样学习起来目标、目的更强,不会出现看不到进步,自我否定而放弃。
学习Python,比较好快速找到应用的场景。如果马上可以找到解决工作生活中的问题,用Python来实现,学习的效果和效率就会立马得到提升。这种学习方法,采铜称之为“设计式操练”。
还是回到刚才知乎上的回答,有的人拿Python写了一个12306余票检测脚本;有的人用Python爬取图片和电影资源... ... 这些就是具体应用的场景感,然后分解功能,一步一步完成,Python可以用最少的代码来实现。
二、当我们学Python,我们学什么
1)如果学Python是想了解编程语言,做一些实用小工具来提高效率,那学习的主要内容应该是Python的网络访问(urllib, urllib2, requests),爬虫相关的库,正则表达式, BeautifulSoup,XPath,Excel,数据库MySQLdb模块等,了解html网页。
这些知识熟练应用,从网络上抓取数据,再进行分析处理,完全没有问题。
2)如果你想学习Python语言找一份开发的工作,那看企业的岗位中有哪些要求。(一共194个Python开发岗位)
再看一下岗位需求量,我把Java的也列出来作一个对比:
城市Python岗位数量(个)Java岗位数量(个)
上海
287
9993
西安
10
1309
武汉
23
2018
乌鲁木齐
0
55
北京
347
12235
结论:
Python语言作为工作中效率提升的工具,非常好用的。
Python好用易学,但作为程序员主力开发语言,要求比较高,大多需要其他语言的使用经验。Python作为程序猿的想扩展的新语言非常合适。
如果没有编程语言基础,想学习Python后从事开发,要求偏高。重点要放在Web学习,框架学习上。打好Linux基础,多了解一些Java还是比较好。
文/向右奔跑(简书作者)
原文链接:
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
Python 爬虫超详细讲解(零基础入门,老年人都看的懂)
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-06-23 01:48
讲解我们的爬虫之前,先概述关于爬虫的简单概念(毕竟是零基础教程)
爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做。
为什么我们要使用爬虫
互联网大数据时代,给予我们的是生活的便利以及海量数据爆炸式的出现在网络中。
过去,我们通过书籍、报纸、电视、广播或许信息,这些信息数量有限,且是经过一定的筛选,信息相对而言比较有效,但是缺点则是信息面太过于狭窄了。不对称的信息传导,以致于我们视野受限,无法了解到更多的信息和知识。
互联网大数据时代,我们突然间,信息获取自由了,我们得到了海量的信息,但是大多数都是无效的垃圾信息。
例如新浪微博,一天产生数亿条的状态更新,而在百度搜索引擎中,随意搜一条——减肥100,000,000条信息。
在如此海量的信息碎片中,我们如何获取对自己有用的信息呢?
答案是筛选!
通过某项技术将相关的内容收集起来,在分析删选才能得到我们真正需要的信息。
这个信息收集分析整合的工作,可应用的范畴非常的广泛,无论是生活服务、出行旅行、金融投资、各类制造业的产品市场需求等等……都能够借助这个技术获取更精准有效的信息加以利用。
网络爬虫技术,虽说有个诡异的名字,让能第一反应是那种软软的蠕动的生物,但它却是一个可以在虚拟世界里,无往不前的利器。
爬虫准备工作
我们平时都说Python爬虫,其实这里可能有个误解,爬虫并不是Python独有的,可以做爬虫的语言有很多例如:PHP,JAVA,C#,C++,Python,选择Python做爬虫是因为Python相对来说比较简单,而且功能比较齐全。
首先我们需要下载python,我下载的是官方最新的版本 3.8.3
其次我们需要一个运行Python的环境,我用的是pychram
也可以从官方下载,
我们还需要一些库来支持爬虫的运行(有些库Python可能自带了)
差不多就是这几个库了,良心的我已经在后面写好注释了
(爬虫运行过程中,不一定就只需要上面几个库,看你爬虫的一个具体写法了,反正需要库的话我们可以直接在setting里面安装)
爬虫项目讲解
我做的是爬取豆瓣评分电影Top250的爬虫代码
我们要爬取的就是这个网站:
这边我已经爬取完毕,给大家看下效果图,我是将爬取到的内容存到xls中
我们的爬取的内容是:电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,相关信息。
代码分析
先把代码发放上来,然后我根据代码逐步解析
# -*- codeing = utf-8 -*-from bs4 import BeautifulSoup # 网页解析,获取数据import re # 正则表达式,进行文字匹配`import urllib.request, urllib.error # 制定URL,获取网页数据import xlwt # 进行excel操作#import sqlite3 # 进行SQLite数据库操作<br />findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,标售规则 影片详情链接的规则findImgSrc = re.compile(r', re.S)findTitle = re.compile(r'(.*)')findRating = re.compile(r'(.*)')findJudge = re.compile(r'(\d*)人评价')findInq = re.compile(r'(.*)')findBd = re.compile(r'<p class="">(.*?)', re.S)<br /><br /><br /><br />def main(): baseurl = "https://movie.douban.com/top250?start=" #要爬取的网页链接 # 1.爬取网页 datalist = getData(baseurl) savepath = "豆瓣电影Top250.xls" #当前目录新建XLS,存储进去 # dbpath = "movie.db" #当前目录新建数据库,存储进去 # 3.保存数据 saveData(datalist,savepath) #2种存储方式可以只选择一种 # saveData2DB(datalist,dbpath)<br /><br /><br /># 爬取网页def getData(baseurl): datalist = [] #用来存储爬取的网页信息 for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25) html = askURL(url) # 保存获取到的网页源码 # 2.逐一解析数据 soup = BeautifulSoup(html, "html.parser") for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串 data = [] # 保存一部电影所有信息 item = str(item) link = re.findall(findLink, item)[0] # 通过正则表达式查找 data.append(link) imgSrc = re.findall(findImgSrc, item)[0] data.append(imgSrc) titles = re.findall(findTitle, item) if (len(titles) == 2): ctitle = titles[0] data.append(ctitle) otitle = titles[1].replace("/", "") #消除转义字符 data.append(otitle) else: data.append(titles[0]) data.append(' ') rating = re.findall(findRating, item)[0] data.append(rating) judgeNum = re.findall(findJudge, item)[0] data.append(judgeNum) inq = re.findall(findInq, item) if len(inq) != 0: inq = inq[0].replace("。", "") data.append(inq) else: data.append(" ") bd = re.findall(findBd, item)[0] bd = re.sub('(\s+)?', "", bd) bd = re.sub('/', "", bd) data.append(bd.strip()) datalist.append(data)<br /> return datalist<br /><br /># 得到指定一个URL的网页内容def askURL(url): head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息 "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36" } # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)<br /> request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html<br /><br /># 保存数据到表格def saveData(datalist,savepath): print("save.......") book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象 sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息") for i in range(0,8): sheet.write(0,i,col[i]) #列名 for i in range(0,250): # print("第%d条" %(i+1)) #输出语句,用来测试 data = datalist[i] for j in range(0,8): sheet.write(i+1,j,data[j]) #数据 book.save(savepath) #保存<br /># def saveData2DB(datalist,dbpath):# init_db(dbpath)# conn = sqlite3.connect(dbpath)# cur = conn.cursor()# for data in datalist:# for index in range(len(data)):# if index == 4 or index == 5:# continue# data[index] = '"'+data[index]+'"'# sql = '''# insert into movie250(# info_link,pic_link,cname,ename,score,rated,instroduction,info)# values (%s)'''%",".join(data)# # print(sql) #输出查询语句,用来测试# cur.execute(sql)# conn.commit()# cur.close# conn.close()<br /><br /># def init_db(dbpath):# sql = '''# create table movie250(# id integer primary key autoincrement,# info_link text,# pic_link text,# cname varchar,# ename varchar ,# score numeric,# rated numeric,# instroduction text,# info text# )### ''' #创建数据表# conn = sqlite3.connect(dbpath)# cursor = conn.cursor()# cursor.execute(sql)# conn.commit()# conn.close()<br /># 保存数据到数据库<br /><br /><br /><br /><br /><br /><br />if __name__ == "__main__": # 当程序执行时 # 调用函数 main() # init_db("movietest.db") print("爬取完毕!")</p>
下面我根据代码,从下到下给大家讲解分析一遍
-- codeing = utf-8 --,开头的这个是设置编码为utf-8 ,写在开头,防止乱码。
然后下面import就是导入一些库,做做准备工作,(sqlite3这库我并没有用到所以我注释起来了)。
下面一些find开头的是正则表达式,是用来我们筛选信息的。
(正则表达式用到 re 库,也可以不用正则表达式,不是必须的。)
大体流程分三步走:
1. 爬取网页
2.逐一解析数据
3. 保存网页
先分析流程1,爬取网页,baseurl 就是我们要爬虫的网页网址,往下走,调用了 getData(baseurl) ,
我们来看 getData方法
for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25)
这段大家可能看不懂,其实是这样的:
因为电影评分Top250,每个页面只显示25个,所以我们需要访问页面10次,25*10=250。
baseurl = "https://movie.douban.com/top250?start="
我们只要在baseurl后面加上数字就会跳到相应页面,比如i=1时
我放上超链接,大家可以点击看看会跳到哪个页面,毕竟实践出真知。
然后又调用了askURL来请求网页,这个方法是请求网页的主体方法,
怕大家翻页麻烦,我再把代码复制一遍,让大家有个直观感受
def askURL(url): head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息 "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36" } # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)<br /> request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html
这个askURL就是用来向网页发送请求用的,那么这里就有老铁问了,为什么这里要写个head呢?
这是因为我们要是不写的话,访问某些网站的时候会被认出来爬虫,显示错误,错误代码
418
这是一个梗大家可以百度下,
418 I’m a teapot
The HTTP 418 I’m a teapot client error response code indicates that
the server refuses to brew coffee because it is a teapot. This error
is a reference to Hyper Text Coffee Pot Control Protocol which was an
April Fools’ joke in 1998.
我是一个茶壶
所以我们需要 “装” ,装成我们就是一个浏览器,这样就不会被认出来,
伪装一个身份。
来,我们继续往下走,
html = response.read().decode("utf-8")
这段就是我们读取网页的内容,设置编码为utf-8,目的就是为了防止乱码。
访问成功后,来到了第二个流程:
2.逐一解析数据
解析数据这里我们用到了 BeautifulSoup(靓汤) 这个库,这个库是几乎是做爬虫必备的库,无论你是什么写法。
下面就开始查找符合我们要求的数据,用BeautifulSoup的方法以及 re 库的
正则表达式去匹配,
findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,标售规则 影片详情链接的规则findImgSrc = re.compile(r', re.S)findTitle = re.compile(r'(.*)')findRating = re.compile(r'(.*)')findJudge = re.compile(r'(\d*)人评价')findInq = re.compile(r'(.*)')findBd = re.compile(r'(.*?)', re.S)</p>
匹配到符合我们要求的数据,然后存进dataList, 所以dataList里就存放着我们需要的数据了。
最后一个流程:
3.保存数据
# 3.保存数据 saveData(datalist,savepath) #2种存储方式可以只选择一种 # saveData2DB(datalist,dbpath)
保存数据可以选择保存到 xls 表, 需要(xlwt库支持)
也可以选择保存数据到 sqlite数据库, 需要(sqlite3库支持)
这里我选择保存到 xls 表 ,这也是为什么我注释了一大堆代码,注释的部分就是保存到 sqlite 数据库的代码,二者选一就行
保存到 xls 的主体方法是 saveData(下面的saveData2DB方法是保存到sqlite数据库):
def saveData(datalist,savepath): print("save.......") book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象 sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息") for i in range(0,8): sheet.write(0,i,col[i]) #列名 for i in range(0,250): # print("第%d条" %(i+1)) #输出语句,用来测试 data = datalist[i] for j in range(0,8): sheet.write(i+1,j,data[j]) #数据 book.save(savepath) #保存
创建工作表,创列(会在当前目录下创建),
sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
然后把 dataList里的数据一条条存进去就行。
最后运作成功后,会在左侧生成这么一个文件
打开之后看看是不是我们想要的结果
成了,成了!
如果我们需要以数据库方式存储,可以先生成 xls 文件,再把 xls 文件导入数据库中,就可以啦
本篇文章讲解到这里啦,我感觉我讲的还算细致吧,爬虫我也是最近才可以学,对这个比较有兴趣,我肯定有讲的不好的地方,欢迎各位大佬来指正我 。
我也在不断的学习中,学到新东西第一时间会跟大家分享
大家可以动动小手,点波关注不迷路。
如果关于本篇文章有不懂的地方,欢迎大家下面留言,我知道的都会给大家一 一解答。
白嫖不好,创作不易。各位的点赞就是我创作的最大动力,如果我有哪里写的不对,欢迎评论区留言进行指正。
老铁,如果有收获,请点个免费的赞鼓励一下博主呗
查看全部
Python 爬虫超详细讲解(零基础入门,老年人都看的懂)
讲解我们的爬虫之前,先概述关于爬虫的简单概念(毕竟是零基础教程)
爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做。
为什么我们要使用爬虫
互联网大数据时代,给予我们的是生活的便利以及海量数据爆炸式的出现在网络中。
过去,我们通过书籍、报纸、电视、广播或许信息,这些信息数量有限,且是经过一定的筛选,信息相对而言比较有效,但是缺点则是信息面太过于狭窄了。不对称的信息传导,以致于我们视野受限,无法了解到更多的信息和知识。
互联网大数据时代,我们突然间,信息获取自由了,我们得到了海量的信息,但是大多数都是无效的垃圾信息。
例如新浪微博,一天产生数亿条的状态更新,而在百度搜索引擎中,随意搜一条——减肥100,000,000条信息。
在如此海量的信息碎片中,我们如何获取对自己有用的信息呢?
答案是筛选!
通过某项技术将相关的内容收集起来,在分析删选才能得到我们真正需要的信息。
这个信息收集分析整合的工作,可应用的范畴非常的广泛,无论是生活服务、出行旅行、金融投资、各类制造业的产品市场需求等等……都能够借助这个技术获取更精准有效的信息加以利用。
网络爬虫技术,虽说有个诡异的名字,让能第一反应是那种软软的蠕动的生物,但它却是一个可以在虚拟世界里,无往不前的利器。
爬虫准备工作
我们平时都说Python爬虫,其实这里可能有个误解,爬虫并不是Python独有的,可以做爬虫的语言有很多例如:PHP,JAVA,C#,C++,Python,选择Python做爬虫是因为Python相对来说比较简单,而且功能比较齐全。
首先我们需要下载python,我下载的是官方最新的版本 3.8.3
其次我们需要一个运行Python的环境,我用的是pychram
也可以从官方下载,
我们还需要一些库来支持爬虫的运行(有些库Python可能自带了)
差不多就是这几个库了,良心的我已经在后面写好注释了
(爬虫运行过程中,不一定就只需要上面几个库,看你爬虫的一个具体写法了,反正需要库的话我们可以直接在setting里面安装)
爬虫项目讲解
我做的是爬取豆瓣评分电影Top250的爬虫代码
我们要爬取的就是这个网站:
这边我已经爬取完毕,给大家看下效果图,我是将爬取到的内容存到xls中
我们的爬取的内容是:电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,相关信息。
代码分析
先把代码发放上来,然后我根据代码逐步解析
# -*- codeing = utf-8 -*-from bs4 import BeautifulSoup # 网页解析,获取数据import re # 正则表达式,进行文字匹配`import urllib.request, urllib.error # 制定URL,获取网页数据import xlwt # 进行excel操作#import sqlite3 # 进行SQLite数据库操作<br />findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,标售规则 影片详情链接的规则findImgSrc = re.compile(r', re.S)findTitle = re.compile(r'(.*)')findRating = re.compile(r'(.*)')findJudge = re.compile(r'(\d*)人评价')findInq = re.compile(r'(.*)')findBd = re.compile(r'<p class="">(.*?)', re.S)<br /><br /><br /><br />def main(): baseurl = "https://movie.douban.com/top250?start=" #要爬取的网页链接 # 1.爬取网页 datalist = getData(baseurl) savepath = "豆瓣电影Top250.xls" #当前目录新建XLS,存储进去 # dbpath = "movie.db" #当前目录新建数据库,存储进去 # 3.保存数据 saveData(datalist,savepath) #2种存储方式可以只选择一种 # saveData2DB(datalist,dbpath)<br /><br /><br /># 爬取网页def getData(baseurl): datalist = [] #用来存储爬取的网页信息 for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25) html = askURL(url) # 保存获取到的网页源码 # 2.逐一解析数据 soup = BeautifulSoup(html, "html.parser") for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串 data = [] # 保存一部电影所有信息 item = str(item) link = re.findall(findLink, item)[0] # 通过正则表达式查找 data.append(link) imgSrc = re.findall(findImgSrc, item)[0] data.append(imgSrc) titles = re.findall(findTitle, item) if (len(titles) == 2): ctitle = titles[0] data.append(ctitle) otitle = titles[1].replace("/", "") #消除转义字符 data.append(otitle) else: data.append(titles[0]) data.append(' ') rating = re.findall(findRating, item)[0] data.append(rating) judgeNum = re.findall(findJudge, item)[0] data.append(judgeNum) inq = re.findall(findInq, item) if len(inq) != 0: inq = inq[0].replace("。", "") data.append(inq) else: data.append(" ") bd = re.findall(findBd, item)[0] bd = re.sub('(\s+)?', "", bd) bd = re.sub('/', "", bd) data.append(bd.strip()) datalist.append(data)<br /> return datalist<br /><br /># 得到指定一个URL的网页内容def askURL(url): head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息 "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36" } # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)<br /> request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html<br /><br /># 保存数据到表格def saveData(datalist,savepath): print("save.......") book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象 sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息") for i in range(0,8): sheet.write(0,i,col[i]) #列名 for i in range(0,250): # print("第%d条" %(i+1)) #输出语句,用来测试 data = datalist[i] for j in range(0,8): sheet.write(i+1,j,data[j]) #数据 book.save(savepath) #保存<br /># def saveData2DB(datalist,dbpath):# init_db(dbpath)# conn = sqlite3.connect(dbpath)# cur = conn.cursor()# for data in datalist:# for index in range(len(data)):# if index == 4 or index == 5:# continue# data[index] = '"'+data[index]+'"'# sql = '''# insert into movie250(# info_link,pic_link,cname,ename,score,rated,instroduction,info)# values (%s)'''%",".join(data)# # print(sql) #输出查询语句,用来测试# cur.execute(sql)# conn.commit()# cur.close# conn.close()<br /><br /># def init_db(dbpath):# sql = '''# create table movie250(# id integer primary key autoincrement,# info_link text,# pic_link text,# cname varchar,# ename varchar ,# score numeric,# rated numeric,# instroduction text,# info text# )### ''' #创建数据表# conn = sqlite3.connect(dbpath)# cursor = conn.cursor()# cursor.execute(sql)# conn.commit()# conn.close()<br /># 保存数据到数据库<br /><br /><br /><br /><br /><br /><br />if __name__ == "__main__": # 当程序执行时 # 调用函数 main() # init_db("movietest.db") print("爬取完毕!")</p>
下面我根据代码,从下到下给大家讲解分析一遍
-- codeing = utf-8 --,开头的这个是设置编码为utf-8 ,写在开头,防止乱码。
然后下面import就是导入一些库,做做准备工作,(sqlite3这库我并没有用到所以我注释起来了)。
下面一些find开头的是正则表达式,是用来我们筛选信息的。
(正则表达式用到 re 库,也可以不用正则表达式,不是必须的。)
大体流程分三步走:
1. 爬取网页
2.逐一解析数据
3. 保存网页
先分析流程1,爬取网页,baseurl 就是我们要爬虫的网页网址,往下走,调用了 getData(baseurl) ,
我们来看 getData方法
for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25)
这段大家可能看不懂,其实是这样的:
因为电影评分Top250,每个页面只显示25个,所以我们需要访问页面10次,25*10=250。
baseurl = "https://movie.douban.com/top250?start="
我们只要在baseurl后面加上数字就会跳到相应页面,比如i=1时
我放上超链接,大家可以点击看看会跳到哪个页面,毕竟实践出真知。
然后又调用了askURL来请求网页,这个方法是请求网页的主体方法,
怕大家翻页麻烦,我再把代码复制一遍,让大家有个直观感受
def askURL(url): head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息 "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36" } # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)<br /> request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html
这个askURL就是用来向网页发送请求用的,那么这里就有老铁问了,为什么这里要写个head呢?
这是因为我们要是不写的话,访问某些网站的时候会被认出来爬虫,显示错误,错误代码
418
这是一个梗大家可以百度下,
418 I’m a teapot
The HTTP 418 I’m a teapot client error response code indicates that
the server refuses to brew coffee because it is a teapot. This error
is a reference to Hyper Text Coffee Pot Control Protocol which was an
April Fools’ joke in 1998.
我是一个茶壶
所以我们需要 “装” ,装成我们就是一个浏览器,这样就不会被认出来,
伪装一个身份。
来,我们继续往下走,
html = response.read().decode("utf-8")
这段就是我们读取网页的内容,设置编码为utf-8,目的就是为了防止乱码。
访问成功后,来到了第二个流程:
2.逐一解析数据
解析数据这里我们用到了 BeautifulSoup(靓汤) 这个库,这个库是几乎是做爬虫必备的库,无论你是什么写法。
下面就开始查找符合我们要求的数据,用BeautifulSoup的方法以及 re 库的
正则表达式去匹配,
findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,标售规则 影片详情链接的规则findImgSrc = re.compile(r', re.S)findTitle = re.compile(r'(.*)')findRating = re.compile(r'(.*)')findJudge = re.compile(r'(\d*)人评价')findInq = re.compile(r'(.*)')findBd = re.compile(r'(.*?)', re.S)</p>
匹配到符合我们要求的数据,然后存进dataList, 所以dataList里就存放着我们需要的数据了。
最后一个流程:
3.保存数据
# 3.保存数据 saveData(datalist,savepath) #2种存储方式可以只选择一种 # saveData2DB(datalist,dbpath)
保存数据可以选择保存到 xls 表, 需要(xlwt库支持)
也可以选择保存数据到 sqlite数据库, 需要(sqlite3库支持)
这里我选择保存到 xls 表 ,这也是为什么我注释了一大堆代码,注释的部分就是保存到 sqlite 数据库的代码,二者选一就行
保存到 xls 的主体方法是 saveData(下面的saveData2DB方法是保存到sqlite数据库):
def saveData(datalist,savepath): print("save.......") book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象 sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息") for i in range(0,8): sheet.write(0,i,col[i]) #列名 for i in range(0,250): # print("第%d条" %(i+1)) #输出语句,用来测试 data = datalist[i] for j in range(0,8): sheet.write(i+1,j,data[j]) #数据 book.save(savepath) #保存
创建工作表,创列(会在当前目录下创建),
sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
然后把 dataList里的数据一条条存进去就行。
最后运作成功后,会在左侧生成这么一个文件
打开之后看看是不是我们想要的结果
成了,成了!
如果我们需要以数据库方式存储,可以先生成 xls 文件,再把 xls 文件导入数据库中,就可以啦
本篇文章讲解到这里啦,我感觉我讲的还算细致吧,爬虫我也是最近才可以学,对这个比较有兴趣,我肯定有讲的不好的地方,欢迎各位大佬来指正我 。
我也在不断的学习中,学到新东西第一时间会跟大家分享
大家可以动动小手,点波关注不迷路。
如果关于本篇文章有不懂的地方,欢迎大家下面留言,我知道的都会给大家一 一解答。
白嫖不好,创作不易。各位的点赞就是我创作的最大动力,如果我有哪里写的不对,欢迎评论区留言进行指正。
老铁,如果有收获,请点个免费的赞鼓励一下博主呗
网络安全自学篇(十七)| Python攻防之构建Web目录扫描器及ip代理池(
网站优化 • 优采云 发表了文章 • 0 个评论 • 512 次浏览 • 2022-06-20 13:41
加入安全+ 交流群 和大佬们一起交流安全技术
作者介绍:杨秀璋
自幼受贵州大山的熏陶,养成了诚实质朴的性格。经过寒窗苦读,考入BIT,为完成自己的教师梦,放弃IT、航天等工作,成为贵财一名大学教师,并想把自己所学所感真心传授给自己的学生,帮助更多陌生人。
一.Web目录扫描思路
1.网站目录和敏感文件扫描
网站目录和敏感文件扫描是网站测试中最基本的手段之一。如果通过该方法发现了网站后台,可以尝试暴库、SQL注入等方式进行安全测试;如果发现敏感目录或敏感文件,能帮我们获取如php环境变量、robots.txt、网站指纹等信息;如果扫描出了一些上传的文件,我们甚至可能通过上传功能(一句话恶意代码)获取网站的权限。
2.原理
在Web目录扫描中,字典是非常重要的,一个好的字典能帮助我们的程序更好地发现漏洞和目标。那么,如何通过Python代码实现Web目录扫描呢?或者Web目录扫描器的原理是什么呢?
其原理是通过请求返回的信息来判断当前目录或文件是否真实存在。网站后台扫描工具都是利用目录字典进行爆破扫描,字典越多,扫描到的结果也越多。常见的Web目录扫描工具包括:御剑1.5、DirBuster、Dirsearch、Webdirscan、Cansina、Dirmap等。涉及的常用功能包括:能使用字典、支持纯爆破、并发引擎、能爬取页面动态生成字典、能fuzz扫描、能自定义请求(代理)、自定义响应结果及响应状态等。
3.工具介绍
DirBuster
Kali Linux提供的目录扫描工具DirBuster支持全部的Web目录扫描方式。它既支持网页爬虫方式扫描,也支持基于字典暴力扫描,还支持纯暴力扫描。该工具使用Java语言编写,提供命令行(Headless)和图形界面(GUI)两种模式。其中,图形界面模式功能更为强大。用户不仅可以指定纯暴力扫描的字符规则,还可以设置以URL模糊方式构建网页路径。同时,用户还对网页解析方式进行各种定制,提高网址解析效率。
御剑
御剑系列的web工具一直是比较顺手的工具。这款御剑也是很好用的网站后台扫描工具,图形化页面,使用起来简单上手,因此也被大多数人所喜好。其作者可能是“御剑孤独”。
Webdirscan
webdirscan是一个很简单的多线程Web目录扫描工具,它是使用Python语言编写的,主要调用了requests第三方库实现。大家可以看看它Github上面的代码,和本篇博客原理较为相似。
源代码:
我们将代码下载至本地,再进行扫描目标网站。
将CMD命令行打开,进入webdirscan路径下,指定扫描任务。
Dirmap
它是一个高级web目录扫描工具,功能将会强于DirBuster、Dirsearch、cansina、御剑。详见:
注意:工具的使用方法这里就不进行详细介绍了,希望读者下来自行学习,本文主要分享Python代码是如何实现Web目录扫描的。
二.Python构建Web目录扫描器
该程序主要实现以下3个功能:
判断Web目录或文件是否存在。通过requests发送请求实现,获取status_code状态码,状态码200表示成功。
通过读取文件后去 asp、aspx、jsp、php 常见目录,对其进行扫描。
由于很多安全产品能识别出你的恶意攻击请求,这里需要设置多线程调用,从而避免安全软件识别。
下面是Python实现Web目录扫描的代码,其中本地存在一个 asp.txt 文件(源自御剑),涉及了常见的网站目录。如下图所示:
.完整代码:
作者通过浏览器搜索 “inurl:asp”,寻找某网站为例,接着调用程序获取它的目录。
其扫描结果如下图所示,通过访问这些链接发现它们是真实存在的。
写到这里,一个简单的Web目录扫描器就实现了,希望对大家有所帮助 。后续如果将我们的程序扩展到BurpSuite工具,就能更好地进行抓包分析及安全测试,你可以去试试~
三.ip代理池
某些网站会对我们发送的请求进行有效拦截,这里可以尝试设置一个ip代理池,无论是网络爬虫还是请求发送,都能很好地解决这些问题。下面简单讲解一个获取IP代理的代码,但遗憾的是,作者想把它移植到上面那段代码中,但验证的IP地址多数无法访问,导致失败。
国内IP代理网站为:
其基本思路如下,通过Python爬虫获取IP地址、端口和协议类型,其代码的基本思路如下:
下面是对应的HTML源代码,需要抓取的是tr值,每行代表一个IP地址。
完整代码:
输出结果如下图所示,IP地址和端口成功抓取,但是很多无法使用,读者可以自行试试。
获取IP地址之后,通过如下设置可以使用代理IP地址进行访问。 查看全部
网络安全自学篇(十七)| Python攻防之构建Web目录扫描器及ip代理池(
加入安全+ 交流群 和大佬们一起交流安全技术
作者介绍:杨秀璋
自幼受贵州大山的熏陶,养成了诚实质朴的性格。经过寒窗苦读,考入BIT,为完成自己的教师梦,放弃IT、航天等工作,成为贵财一名大学教师,并想把自己所学所感真心传授给自己的学生,帮助更多陌生人。
一.Web目录扫描思路
1.网站目录和敏感文件扫描
网站目录和敏感文件扫描是网站测试中最基本的手段之一。如果通过该方法发现了网站后台,可以尝试暴库、SQL注入等方式进行安全测试;如果发现敏感目录或敏感文件,能帮我们获取如php环境变量、robots.txt、网站指纹等信息;如果扫描出了一些上传的文件,我们甚至可能通过上传功能(一句话恶意代码)获取网站的权限。
2.原理
在Web目录扫描中,字典是非常重要的,一个好的字典能帮助我们的程序更好地发现漏洞和目标。那么,如何通过Python代码实现Web目录扫描呢?或者Web目录扫描器的原理是什么呢?
其原理是通过请求返回的信息来判断当前目录或文件是否真实存在。网站后台扫描工具都是利用目录字典进行爆破扫描,字典越多,扫描到的结果也越多。常见的Web目录扫描工具包括:御剑1.5、DirBuster、Dirsearch、Webdirscan、Cansina、Dirmap等。涉及的常用功能包括:能使用字典、支持纯爆破、并发引擎、能爬取页面动态生成字典、能fuzz扫描、能自定义请求(代理)、自定义响应结果及响应状态等。
3.工具介绍
DirBuster
Kali Linux提供的目录扫描工具DirBuster支持全部的Web目录扫描方式。它既支持网页爬虫方式扫描,也支持基于字典暴力扫描,还支持纯暴力扫描。该工具使用Java语言编写,提供命令行(Headless)和图形界面(GUI)两种模式。其中,图形界面模式功能更为强大。用户不仅可以指定纯暴力扫描的字符规则,还可以设置以URL模糊方式构建网页路径。同时,用户还对网页解析方式进行各种定制,提高网址解析效率。
御剑
御剑系列的web工具一直是比较顺手的工具。这款御剑也是很好用的网站后台扫描工具,图形化页面,使用起来简单上手,因此也被大多数人所喜好。其作者可能是“御剑孤独”。
Webdirscan
webdirscan是一个很简单的多线程Web目录扫描工具,它是使用Python语言编写的,主要调用了requests第三方库实现。大家可以看看它Github上面的代码,和本篇博客原理较为相似。
源代码:
我们将代码下载至本地,再进行扫描目标网站。
将CMD命令行打开,进入webdirscan路径下,指定扫描任务。
Dirmap
它是一个高级web目录扫描工具,功能将会强于DirBuster、Dirsearch、cansina、御剑。详见:
注意:工具的使用方法这里就不进行详细介绍了,希望读者下来自行学习,本文主要分享Python代码是如何实现Web目录扫描的。
二.Python构建Web目录扫描器
该程序主要实现以下3个功能:
判断Web目录或文件是否存在。通过requests发送请求实现,获取status_code状态码,状态码200表示成功。
通过读取文件后去 asp、aspx、jsp、php 常见目录,对其进行扫描。
由于很多安全产品能识别出你的恶意攻击请求,这里需要设置多线程调用,从而避免安全软件识别。
下面是Python实现Web目录扫描的代码,其中本地存在一个 asp.txt 文件(源自御剑),涉及了常见的网站目录。如下图所示:
.完整代码:
作者通过浏览器搜索 “inurl:asp”,寻找某网站为例,接着调用程序获取它的目录。
其扫描结果如下图所示,通过访问这些链接发现它们是真实存在的。
写到这里,一个简单的Web目录扫描器就实现了,希望对大家有所帮助 。后续如果将我们的程序扩展到BurpSuite工具,就能更好地进行抓包分析及安全测试,你可以去试试~
三.ip代理池
某些网站会对我们发送的请求进行有效拦截,这里可以尝试设置一个ip代理池,无论是网络爬虫还是请求发送,都能很好地解决这些问题。下面简单讲解一个获取IP代理的代码,但遗憾的是,作者想把它移植到上面那段代码中,但验证的IP地址多数无法访问,导致失败。
国内IP代理网站为:
其基本思路如下,通过Python爬虫获取IP地址、端口和协议类型,其代码的基本思路如下:
下面是对应的HTML源代码,需要抓取的是tr值,每行代表一个IP地址。
完整代码:
输出结果如下图所示,IP地址和端口成功抓取,但是很多无法使用,读者可以自行试试。
获取IP地址之后,通过如下设置可以使用代理IP地址进行访问。
php用正则表达抓取网页中文章 [Python从零到壹] 十
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-06-20 13:40
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。
Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上共同成长。
前一篇文章讲述了Selenium基础技术,涉及基础入门、元素定位、常用方法和属性、鼠标操作、键盘操作和导航控制。本文将结合具体实例进行深入地分析,通过三个基于Selenium技术的爬虫,爬取Wikipedia、百度百科和互动百科消息盒的例子,从实际应用出发来学习利用。基础性文章,希望对您有所帮助。
在线百科是基于Wiki技术的、动态的、免费的、可自由访问和编辑的多语言百科全书的Web2.0知识库系统。它是互联网中公开的、最大数量的用户生成的知识库,并且具有知识面覆盖度广、结构化程度高、信息更新速度快和开放性好等优势。其中被广泛使用的三大在线百科包括Wikipedia、百度百科和互动百科。
文章目录:
下载地址:
作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。
一.三大在线百科
随着互联网和大数据的飞速发展,我们需要从海量信息中挖掘出有价值的信息,而在收集这些海量信息过程中,通常都会涉及到底层数据的抓取构建工作,比如多源知识库融合、知识图谱构建、计算引擎建立等。其中具有代表性的知识图谱应用包括谷歌公司的Knowledge Graph、Facebook推出的实体搜索服务(Graph Search)、百度公司的百度知心、搜狗公司的搜狗知立方等。这些应用的技术可能会有所区别,但相同的是它们在构建过程中都利用了Wikipedia、百度百科、互动百科等在线百科知识。所以本章将教大家分别爬取这三大在线百科。
百科是指天文、地理、自然、人文、宗教、信仰、文学等全部学科的知识的总称,它可以是综合性的,包含所有领域的相关内容;也可以是面向专业性的。接下来将介绍常见的三大在线百科,它们是信息抽取研究的重要语料库之一。
1.Wikipedia
“Wikipedia is a free online encyclopedia with the aim to allow anyone to edit articles.” 这是Wikipedia的官方介绍。Wikipedia是一个基于维基技术的多语言百科全书协作计划,用多种语言编写的网络百科全书。Wikipedia一词取自于该网站核心技术“Wiki”以及具有百科全书之意的“encyclopedia”共同创造出来的新混成词“Wikipedia”,接受任何人编辑。
在所有在线百科中,Wikipedia知识准确性最好,结构化最好,但是Wikipedia本以英文知识为主,涉及的中文知识很少。在线百科页面通常包括:Title(标题)、Description(摘要描述)、InfoBox(消息盒)、Categories(实体类别)、Crosslingual Links(跨语言链接)等。Wikipedia中实体“黄果树瀑布”的中文页面信息如图1所示。
图1所示的Wikipedia信息主要包括:
2.百度百科
百度百科是百度公司推出的一部内容开放、自由的网络百科全书平台。截至2017年4月,百度百科已经收录了超过1432万的词条,参与词条编辑的网友超过610万人,几乎涵盖了所有已知的知识领域。
百度百科旨在创造一个涵盖各领域知识的中文信息收集平台。百度百科强调用户的参与和奉献精神,充分调动互联网用户的力量,汇聚广大用户的头脑智慧,积极进行交流和分享。同时,百度百科实现与百度搜索、百度知道的结合,从不同的层次上满足用户对信息的需求。
与Wikipedia相比,百度百科所包含中文知识最多最广,但是准确性相对较差。百度百科页面也包括:Title(标题)、Description(摘要描述)、InfoBox(消息盒)、Categories(实体类别)、Crosslingual Links(跨语言链接)等。图2为百度百科“Python”网页知识,该网页的消息盒为中间部分,采用键值对(Key-value Pair)的形式,比如“外文名”对应的值为“Python”,“经典教材”对应的值为“Head First Python”等。
3.互动百科
互动百科()是中文百科网站的开拓与领军者,致力于为数亿中文用户免费提供海量、全面、及时的百科信息,并通过全新的维基平台不断改善用户对信息的创作、获取和共享方式。截止到2016年年底,互动百科已经发展成为由超过1100万用户共同打造的拥有1600万词条、2000万张图片、5万个微百科的百科网站,新媒体覆盖人群1000余万人,手机APP用户超2000万。
相对于百度百科而言,互动百科的准确性更高、结构化更好,在专业领域上知识质量较高,故研究者通常会选择互动百科作为主要语料之一。图3显示的是互动百科的首页。
互动百科的信息分为两种形式存储,一种是百科中结构化的信息盒,另一种是百科正文的自由文本。对于百科中的词条文章来说,只有少数词条含有结构化信息盒,但所有词条均含有自由文本。信息盒是采用结构化方式展现词条信息的形式,一个典型的百科信息盒展示例子如图4,显示了Python的InfoBox信息,采用键值对的形式呈现,比如Python的“设计人”为“Guido van Rossum”。
下面分别讲解Selenium技术爬取三大在线百科的消息盒,三大百科的分析方法略有不同。Wikipedia先从列表页面分别获取20国集团(简称G20)各国家的链接,再依次进行网页分析和信息爬取;百度百科调用Selenium自动操作,输入各种编程语言名,再进行访问定位爬取;互动百科采用分析网页的链接url,再去到不同的景点进行分析及信息抓取。
二.Selenium爬取百度百科知识
百度百科作为最大的中文在线百科或中文知识平台,它提供了各行各业的知识,可以供研究者从事各方面的研究。虽然词条的准确率不是最好,但依然可以为从事数据挖掘、知识图谱、自然语言处理、大数据等领域的学者提供很好的知识平台。
1.网页分析
本小节将详细讲解Selenium爬取百度百科消息盒的例子,爬取的主题为10个国家5A级景区,其中景区的名单定义在TXT文件中,然后再定向爬取它们的消息盒信息。其中网页分析的核心步骤如下:
(1) 调用Selenium自动搜索百科关键词
首先,调用Selenium技术访问百度百科首页,网址为:
图5为百度百科首页,其顶部为搜索框,输入相关词条如“故宫”,点击“进入词条”,可以得到故宫词条的详细信息。
然后,在浏览器鼠标选中“进入词条”按钮,右键鼠标点击“审查元素”,可以查看该按钮对应的HTML源代码,如图6所示。注意,不同浏览器查看网页控件或内容对应源代码的称呼是不同的,图中使用的是360安全浏览器,称呼为“审查元素”,而Chrome浏览器称为“检查”,QQ浏览器称为“检查”等。
“进入词条”对应的HTML核心代码如下所示:
调用Selenium函数可以获取输入框input控件。
然后自动输入“故宫”,获取按钮“进入词条”并自动点击,这里采用的方法是在键盘上输入回车键即可访问“故宫”界面,核心代码如下所示:
driver.get("http://baike.baidu.com/") <br />elem_inp=driver.find_element_by_xpath("//form[@id='searchForm']/input") <br />elem_inp.send_keys(name) <br />elem_inp.send_keys(Keys.RETURN) <br />
(2) 调用Selenium访问“故宫”页面并定位消息盒
第一步完成后,进入“故宫”页面然后找到中间消息盒InfoBox部分,右键鼠标并点击“审查元素”,返回结果如图7所示。
消息盒核心代码如下:
消息盒主要采用的形式存储,详细概括了“故宫”实体的信息。例如,属性“中文名称”对应值为“北京故宫”,属性“外文名称”对应值为“Fobidden City”。对应的HTML部分源代码如下。
整个消息盒位于< div class=“basic-info J-basic-info cmn-clearfix” >标签中,接下来是< dl >、< dt >、< dd >一组合HTML标签,其中消息盒div布局共包括两个< dl >…布局,一个是记录消息盒左边部分的内容,另一个< dl >记录了消息盒右部分的内容,每个< dl >标签里再定义属性和属性值,如图8所示。
注意:使用dt、dd最外层必须使用dl包裹,< dl >标签定义了定义列表(Definition List),< dt >标签定义列表中的项目,< dd >标签描述列表中的项目,此组合标签叫做表格标签,与table表格组合标签类似。
接下来调用Selenium扩展包的find_elements_by_xpath()函数分别定位属性和属性值,该函数返回多个属性及属性值集合,再通过for循环输出已定位的多个元素值。代码如下:
elem_name=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dt") <br />elem_value=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dd")<br />for e in elem_name:<br /> print(e.text)<br />for e in elem_value:<br /> print(e.text)<br />
此时,使用Selenium技术爬取百度百科国家5A级景区的分析方法就讲解完了,下面是这部分完整的代码及一些难点。
2.代码实现
注意,接下来我们尝试定义多个Python文件相互调用实现爬虫功能。完整代码包括两个文件,即:
test10_01_baidu.py
# -*- coding: utf-8 -*-<br />"""<br />test10_01_baidu.py<br /> 定义了主函数main并调用getinfo.py文件<br />By:Eastmount CSDN 2021-06-23<br />"""<br />import codecs <br />import getinfo #引用模块<br /><br />#主函数 <br />def main():<br /> #文件读取景点信息 <br /> source = open('data.txt','r',encoding='utf-8') <br /> for name in source: <br /> print(name)<br /> getinfo.getInfobox(name) <br /> print('End Read Files!') <br /> source.close()<br />if __name__ == '__main__':<br /> main()<br />
在代码中调用“import getinfo”代码导入getinfo.py文件,导入之后就可以在main函数中调用getinfo.py文件中的函数和属性,接着我们调用getinfo.py文件中的getInfobox()函数,执行爬取消息盒的操作。
getinfo.py
# coding=utf-8<br /><br />"""<br />getinfo.py:获取信息<br />By:Eastmount CSDN 2021-06-23<br />"""<br />import os <br />import codecs<br />import time<br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys<br /><br />#getInfobox函数: 获取国家5A级景区消息盒 <br />def getInfobox(name): <br /> try: <br /> #访问百度百科并自动搜索<br /> driver = webdriver.Firefox() <br /> driver.get("http://baike.baidu.com/") <br /> elem_inp = driver.find_element_by_xpath("//form[@id='searchForm']/input") <br /> elem_inp.send_keys(name) <br /> elem_inp.send_keys(Keys.RETURN) <br /> time.sleep(1)<br /> print(driver.current_url)<br /> print(driver.title)<br /> <br /> #爬取消息盒InfoBox内容<br /> elem_name=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dt") <br /> elem_value=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dd")<br /> """<br /> for e in elem_name:<br /> print(e.text)<br /> for e in elem_value:<br /> print(e.text)<br /> """<br /><br /> #构建字段成对输出<br /> elem_dic = dict(zip(elem_name,elem_value)) <br /> for key in elem_dic: <br /> print(key.text,elem_dic[key].text)<br /> time.sleep(5)<br /> return<br /> <br /> except Exception as e: <br /> print("Error: ",e)<br /> finally: <br /> print('\n')<br /> driver.close() <br /><br />
比如爬取过程Firefox浏览器会自动搜索“故宫”页面,如下图所示:
最终输出结果如下图所示:
内容如下:
https://baike.baidu.com/item/北京故宫<br />北京故宫_百度百科<br />https://baike.baidu.com/item/% ... %3Bbr />北京故宫_百度百科<br />中文名 北京故宫<br />地理位置 北京市东城区景山前街4号 [91] <br />开放时间 4.1-10.31:08:20-17:00(停止售票16:00,最晚入园16:10) ;11.1-3.31:08:30-16:30(停止售票15:30,最晚入园15:40) ;除法定节假日外每周一闭馆 [6] [91] <br />景点级别 AAAAA级<br />门票价格 60元旺季/40元淡季 [7] <br />占地面积 72万平方米(建筑面积约15万平方米)<br />保护级别 世界文化遗产;第一批全国重点文物保护单位<br />批准单位 联合国教科文组织;中华人民共和国国务院<br />批 号 III-100<br />主要藏品 清明上河图、乾隆款金瓯永固杯、酗亚方樽<br />别 名 紫禁城 [8] <br />官方电话 010-85007057 [92]<br />
Python运行结果如下所示,其中data.txt文件中包括了常见的几个景点。
上述代码属性和属性值通过字典进行组合输出的,核心代码如下:
elem_dic = dict(zip(elem_name,elem_value)) <br />for key in elem_dic: <br /> print(key.text,elem_dic[key].text)<br />
同时,读者可以尝试调用本地的无界面浏览器PhantomJS进行爬取的,调用方法如下:
webdriver.PhantomJS(executable_path="C:\...\phantomjs.exe")<br />
课程作业:
三.Selenium爬取Wikipedia
在线百科是互联网中存在公开的最大数据量的用户生成数据集合,这些数据具有一定的结构,属于半结构化数据,最知名的三大在线百科包括Wikipedia 、百度百科、互动百科。首先,作者将介绍Selenium爬取Wikipedia的实例。
1.网页分析
第一个实例作者将详细讲解Selenium爬取20国家集团(G20)的第一段摘要信息,具体步骤如下:
(1) 从G20列表页面中获取各国超链接
20国集团列表网址如下,Wikipedia采用国家英文单词首写字母进行排序,比如“Japan”、“Italy”、“Brazil”等,每个国家都采用超链接的形式进行跳转。
首先,需要获取20个国家的超链接,然后再去到具体的页面进行爬取。选中一个国家的超链接,比如“China”,右键鼠标并点击“检查”按钮,可以获取对应的HTML源代码,如下所示。
其中超链接位于< div class=“mw-category-group” >布局的< ul >< li >< a >节点下,对应代码:
调用Selenium的find_elements_by_xpath()函数获取节点class属性为“mw-category-group”的超链接,它将返回多个元素。定位超链接的核心代码如下:
driver.get("https://en.wikipedia.org/wiki/ ... 6quot;) <br />elem=driver.find_elements_by_xpath("//div[@class='mw-category-group']/ul/li/a") <br />for e in elem:<br /> print(e.text)<br /> print(e.get_attribute("href"))<br />
函数find_elements_by_xpth()先解析HTML的DOM树形结构并定位到指定节点,并获取其元素。然后定义一个for循环,依次获取节点的内容和href属性,其中e.text表示节点的内容,例如下面节点之间的内容为China。
China<br />
同时,e.get_attribute(“href”)表示获取节点属性href对应的属性值,即“/wiki/China”,同理,e.get_attribute(“title”)可以获取标题title属性,得到值“China”。
此时将获取的超链接存储至变量中如下图,再依次定位到每个国家并获取所需内容。
(2) 调用Selenium定位并爬取各国页面消息盒
接下来开始访问具体的页面,比如中国:
如图所示,可以看到页面的URL、标题、摘要、内容、消息盒等,其中消息盒在途中右部分,包括国家全称、位置等。
下面采用对的形式进行描述,很简明精准地概括了一个网页实体,比如、等信息。通常获取这些信息之后,需要进行预处理操作,之后才能进行数据分析,后面章节将详细讲解。
访问到每个国家的页面后,接下来需要获取每个国家的第一段介绍,本小节讲解的爬虫内容可能比较简单,但是讲解的方法非常重要,包括如何定位节点及爬取知识。详情页面对应的HTML核心部分代码如下:
浏览器审查元素方法如图所示。
正文内容位于属性class为“mw-parser-output”的< div >节点下。在HTML中,< P >标签表示段落,通常用于标识正文,< b >标签表示加粗。获取第一段内容即定位第一个< p >节点即可。核心代码如下:
driver.get("https://en.wikipedia.org/wiki/China") <br />elem=driver.find_element_by_xpath("//div[@class='mw-parser-output']/p[2]").text <br />print elem<br />
注意,正文第一段内容位于第二个< p >段落,故获取p[2]即可。同时,如果读者想从源代码中获取消息盒,则需获取消息盒的位置并抓取数据,消息盒(InfoBox)内容在HTML对应为如下节点,记录了网页实体的核心信息。
...<br />
2.代码实现
完整代码参考文件test10_02.py,如下所示:
# coding=utf-8<br />#By:Eastmount CSDN 2021-06-23<br />import time <br />import re <br />import os <br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys <br /><br />driver = webdriver.Firefox() <br />driver.get("https://en.wikipedia.org/wiki/ ... 6quot;) <br />elem = driver.find_elements_by_xpath("//div[@class='mw-category-group']/ul/li/a")<br />name = [] #国家名<br />urls = [] #国家超链接<br /><br />#爬取链接<br />for e in elem:<br /> print(e.text)<br /> print(e.get_attribute("href"))<br /> name.append(e.text)<br /> urls.append(e.get_attribute("href"))<br />print(name)<br />print(urls)<br /><br />#爬取内容<br />for url in urls:<br /> driver.get(url) <br /> elem = driver.find_element_by_xpath("//div[@class='mw-parser-output']/p[1]").text <br /> print(elem)<br />
其中,爬取的信息如图所示。
PS:该部分大家简单尝试即可,更推荐爬取百度百科、互动百科和搜狗百科。
四.Selenium爬取互动百科
几年过去,互动百科变成了快懂百科,但还好网页结构未变化。
1.网页分析
目前,在线百科已经发展为众多科研工作者从事语义分析、知识图谱构建、自然语言处理、搜索引擎和人工智能等领域的重要语料来源。互动百科作为最热门的在线百科之一,为研究者提供了强大的语料支持。
本小节将讲解一个爬取互动百科最热门的十个编程语言页面的摘要信息,通过该实例加深读者使用Selenium爬虫技术的印象,更加深入地剖析网络数据爬取的分析技巧。不同于Wikipedia先爬取词条列表超链接再爬取所需信息、百度百科输入词条进入相关页面再进行定向爬取,互动百科采用的方法是:
由于互动百科搜索不同词条对应的超链接是存在一定规律的,即采用“常用url+搜索的词条名”方式进行跳转,这里我们通过该方法设置不同的词条网页。具体步骤如下:
(1) 调用Selenium分析URL并搜索互动百科词条
我们首先分析互动百科搜索词条的一些规则,比如搜索人物“贵州”,对应的超链为:
对应页面如图所示,从图中可以看到,顶部的超链接URL、词条为“贵州”、第一段为“贵州”的摘要信息、“右边为对应的图片等信息。
同理,搜索编程语言“Python”,对应的超链接为:
可以得出一个简单的规则,即:
可以搜索对应的知识,如编程语言“Java”对应为:
(2) 访问热门Top10编程语言并爬取摘要
2016年,Github根据各语言过去12个月提交的PR数量进行排名,得出最受欢迎的Top10编程语言分别是:JavaScript、Java、Python、Ruby、PHP、C++、CSS、C#、C和GO语言。
然后,需要分布获取这十门语言的摘要信息。在浏览器中选中摘要部分,右键鼠标点击“审查元素”返回结果如图所示,可以在底部看到摘要部分对应的HTML源代码。
新版本的“快懂百科”内容如下图所示:
“Java”词条摘要部分对应的HTML核心代码如下所示:
调用Selenium的find_element_by_xpath()函数,可以获取摘要段落信息,核心代码如下。
driver = webdriver.Firefox()<br />url = "http://www.baike.com/wiki/" + name<br />driver.get(url)<br />elem = driver.find_element_by_xpath("//div[@class='summary']/div/span") <br />print(elem.text)<br />
这段代码的基本步骤是:
下面是完整的代码及详细讲解。
2.代码实现
完整代码为blog10_03.py如下所示,主函数main()中循环调用getgetAbstract()函数爬取Top10编程语言的摘要信息。
# coding=utf-8 <br />#By:Eastmount CSDN 2021-06-23 <br />import os <br />import codecs<br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys <br /><br />driver = webdriver.Firefox()<br /><br />#获取摘要信息<br />def getAbstract(name): <br /> try:<br /> #新建文件夹及文件<br /> basePathDirectory = "Hudong_Coding" <br /> if not os.path.exists(basePathDirectory): <br /> os.makedirs(basePathDirectory) <br /> baiduFile = os.path.join(basePathDirectory,"HudongSpider.txt")<br /> #文件不存在新建,存在则追加写入<br /> if not os.path.exists(baiduFile): <br /> info = codecs.open(baiduFile,'w','utf-8') <br /> else: <br /> info = codecs.open(baiduFile,'a','utf-8') <br /><br /> url = "http://www.baike.com/wiki/" + name<br /> print(url)<br /> driver.get(url) <br /> elem = driver.find_elements_by_xpath("//div[@class='summary']/div/span")<br /> content = ""<br /> for e in elem:<br /> content += e.text<br /> print(content)<br /> info.writelines(content+'\r\n') <br /> <br /> except Exception as e: <br /> print("Error: ",e) <br /> finally: <br /> print('\n') <br /> info.write('\r\n') <br /> <br />#主函数 <br />def main():<br /> languages = ["JavaScript", "Java", "Python", "Ruby", "PHP",<br /> "C++", "CSS", "C#", "C", "GO"]<br /> print('开始爬取')<br /> for lg in languages: <br /> print(lg)<br /> getAbstract(lg) <br /> print('结束爬取')<br /><br />if __name__ == '__main__':<br /> main() <br />
其中“JavaScript”和“Java”编程语言的抓取结果如图所示,该段代码爬取了热门十门语言在互动百科中的摘要信息。
程序成功抓取了各个编程语言的摘要信息,如下图所示:
同时将数据存储至本地TXT文件中,这将有效为NLP和文本挖掘进行一步分析提供支撑。
写到这里,几种常见的百科数据抓取方法就介绍完毕了,希望您喜欢。
五.总结
在线百科被广泛应用于科研工作、知识图谱和搜索引擎构建、大小型公司数据集成、Web2.0知识库系统中,由于其公开、动态、可自由访问和编辑、拥有多语言版本等特点,它深受科研工作者和公司开发人员的喜爱,常见的在线百科包括Wikipedia、百度百科和互动百科等。
本文结合Selenium技术分别爬取了Wikipedia的段落内容、百度百科的消息盒和互动百科的摘要信息,并采用了三种分析方法,希望读者通过该章节的案例掌握Selenium技术爬取网页的方法。
Selenium用得更广泛的领域是自动化测试,它直接运行在浏览器中(如Firefox、Chrome、IE等),就像真实用户操作一样,对开发的网页进行各式各样的测试,它更是自动化测试方向的必备工具。希望读者能掌握这种技术的爬取方法,尤其是目标网页需要验证登录等情形。
该系列所有代码下载地址:
感谢在求学路上的同行者,不负遇见,勿忘初心。这周的留言感慨~
(By:娜璋 2021-08-20夜于景怡)
前文赏析:
第一部分 基础语法
第二部分 网络爬虫
参考文献 查看全部
php用正则表达抓取网页中文章 [Python从零到壹] 十
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。
Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上共同成长。
前一篇文章讲述了Selenium基础技术,涉及基础入门、元素定位、常用方法和属性、鼠标操作、键盘操作和导航控制。本文将结合具体实例进行深入地分析,通过三个基于Selenium技术的爬虫,爬取Wikipedia、百度百科和互动百科消息盒的例子,从实际应用出发来学习利用。基础性文章,希望对您有所帮助。
在线百科是基于Wiki技术的、动态的、免费的、可自由访问和编辑的多语言百科全书的Web2.0知识库系统。它是互联网中公开的、最大数量的用户生成的知识库,并且具有知识面覆盖度广、结构化程度高、信息更新速度快和开放性好等优势。其中被广泛使用的三大在线百科包括Wikipedia、百度百科和互动百科。
文章目录:
下载地址:
作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。
一.三大在线百科
随着互联网和大数据的飞速发展,我们需要从海量信息中挖掘出有价值的信息,而在收集这些海量信息过程中,通常都会涉及到底层数据的抓取构建工作,比如多源知识库融合、知识图谱构建、计算引擎建立等。其中具有代表性的知识图谱应用包括谷歌公司的Knowledge Graph、Facebook推出的实体搜索服务(Graph Search)、百度公司的百度知心、搜狗公司的搜狗知立方等。这些应用的技术可能会有所区别,但相同的是它们在构建过程中都利用了Wikipedia、百度百科、互动百科等在线百科知识。所以本章将教大家分别爬取这三大在线百科。
百科是指天文、地理、自然、人文、宗教、信仰、文学等全部学科的知识的总称,它可以是综合性的,包含所有领域的相关内容;也可以是面向专业性的。接下来将介绍常见的三大在线百科,它们是信息抽取研究的重要语料库之一。
1.Wikipedia
“Wikipedia is a free online encyclopedia with the aim to allow anyone to edit articles.” 这是Wikipedia的官方介绍。Wikipedia是一个基于维基技术的多语言百科全书协作计划,用多种语言编写的网络百科全书。Wikipedia一词取自于该网站核心技术“Wiki”以及具有百科全书之意的“encyclopedia”共同创造出来的新混成词“Wikipedia”,接受任何人编辑。
在所有在线百科中,Wikipedia知识准确性最好,结构化最好,但是Wikipedia本以英文知识为主,涉及的中文知识很少。在线百科页面通常包括:Title(标题)、Description(摘要描述)、InfoBox(消息盒)、Categories(实体类别)、Crosslingual Links(跨语言链接)等。Wikipedia中实体“黄果树瀑布”的中文页面信息如图1所示。
图1所示的Wikipedia信息主要包括:
2.百度百科
百度百科是百度公司推出的一部内容开放、自由的网络百科全书平台。截至2017年4月,百度百科已经收录了超过1432万的词条,参与词条编辑的网友超过610万人,几乎涵盖了所有已知的知识领域。
百度百科旨在创造一个涵盖各领域知识的中文信息收集平台。百度百科强调用户的参与和奉献精神,充分调动互联网用户的力量,汇聚广大用户的头脑智慧,积极进行交流和分享。同时,百度百科实现与百度搜索、百度知道的结合,从不同的层次上满足用户对信息的需求。
与Wikipedia相比,百度百科所包含中文知识最多最广,但是准确性相对较差。百度百科页面也包括:Title(标题)、Description(摘要描述)、InfoBox(消息盒)、Categories(实体类别)、Crosslingual Links(跨语言链接)等。图2为百度百科“Python”网页知识,该网页的消息盒为中间部分,采用键值对(Key-value Pair)的形式,比如“外文名”对应的值为“Python”,“经典教材”对应的值为“Head First Python”等。
3.互动百科
互动百科()是中文百科网站的开拓与领军者,致力于为数亿中文用户免费提供海量、全面、及时的百科信息,并通过全新的维基平台不断改善用户对信息的创作、获取和共享方式。截止到2016年年底,互动百科已经发展成为由超过1100万用户共同打造的拥有1600万词条、2000万张图片、5万个微百科的百科网站,新媒体覆盖人群1000余万人,手机APP用户超2000万。
相对于百度百科而言,互动百科的准确性更高、结构化更好,在专业领域上知识质量较高,故研究者通常会选择互动百科作为主要语料之一。图3显示的是互动百科的首页。
互动百科的信息分为两种形式存储,一种是百科中结构化的信息盒,另一种是百科正文的自由文本。对于百科中的词条文章来说,只有少数词条含有结构化信息盒,但所有词条均含有自由文本。信息盒是采用结构化方式展现词条信息的形式,一个典型的百科信息盒展示例子如图4,显示了Python的InfoBox信息,采用键值对的形式呈现,比如Python的“设计人”为“Guido van Rossum”。
下面分别讲解Selenium技术爬取三大在线百科的消息盒,三大百科的分析方法略有不同。Wikipedia先从列表页面分别获取20国集团(简称G20)各国家的链接,再依次进行网页分析和信息爬取;百度百科调用Selenium自动操作,输入各种编程语言名,再进行访问定位爬取;互动百科采用分析网页的链接url,再去到不同的景点进行分析及信息抓取。
二.Selenium爬取百度百科知识
百度百科作为最大的中文在线百科或中文知识平台,它提供了各行各业的知识,可以供研究者从事各方面的研究。虽然词条的准确率不是最好,但依然可以为从事数据挖掘、知识图谱、自然语言处理、大数据等领域的学者提供很好的知识平台。
1.网页分析
本小节将详细讲解Selenium爬取百度百科消息盒的例子,爬取的主题为10个国家5A级景区,其中景区的名单定义在TXT文件中,然后再定向爬取它们的消息盒信息。其中网页分析的核心步骤如下:
(1) 调用Selenium自动搜索百科关键词
首先,调用Selenium技术访问百度百科首页,网址为:
图5为百度百科首页,其顶部为搜索框,输入相关词条如“故宫”,点击“进入词条”,可以得到故宫词条的详细信息。
然后,在浏览器鼠标选中“进入词条”按钮,右键鼠标点击“审查元素”,可以查看该按钮对应的HTML源代码,如图6所示。注意,不同浏览器查看网页控件或内容对应源代码的称呼是不同的,图中使用的是360安全浏览器,称呼为“审查元素”,而Chrome浏览器称为“检查”,QQ浏览器称为“检查”等。
“进入词条”对应的HTML核心代码如下所示:
调用Selenium函数可以获取输入框input控件。
然后自动输入“故宫”,获取按钮“进入词条”并自动点击,这里采用的方法是在键盘上输入回车键即可访问“故宫”界面,核心代码如下所示:
driver.get("http://baike.baidu.com/") <br />elem_inp=driver.find_element_by_xpath("//form[@id='searchForm']/input") <br />elem_inp.send_keys(name) <br />elem_inp.send_keys(Keys.RETURN) <br />
(2) 调用Selenium访问“故宫”页面并定位消息盒
第一步完成后,进入“故宫”页面然后找到中间消息盒InfoBox部分,右键鼠标并点击“审查元素”,返回结果如图7所示。
消息盒核心代码如下:
消息盒主要采用的形式存储,详细概括了“故宫”实体的信息。例如,属性“中文名称”对应值为“北京故宫”,属性“外文名称”对应值为“Fobidden City”。对应的HTML部分源代码如下。
整个消息盒位于< div class=“basic-info J-basic-info cmn-clearfix” >标签中,接下来是< dl >、< dt >、< dd >一组合HTML标签,其中消息盒div布局共包括两个< dl >…布局,一个是记录消息盒左边部分的内容,另一个< dl >记录了消息盒右部分的内容,每个< dl >标签里再定义属性和属性值,如图8所示。
注意:使用dt、dd最外层必须使用dl包裹,< dl >标签定义了定义列表(Definition List),< dt >标签定义列表中的项目,< dd >标签描述列表中的项目,此组合标签叫做表格标签,与table表格组合标签类似。
接下来调用Selenium扩展包的find_elements_by_xpath()函数分别定位属性和属性值,该函数返回多个属性及属性值集合,再通过for循环输出已定位的多个元素值。代码如下:
elem_name=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dt") <br />elem_value=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dd")<br />for e in elem_name:<br /> print(e.text)<br />for e in elem_value:<br /> print(e.text)<br />
此时,使用Selenium技术爬取百度百科国家5A级景区的分析方法就讲解完了,下面是这部分完整的代码及一些难点。
2.代码实现
注意,接下来我们尝试定义多个Python文件相互调用实现爬虫功能。完整代码包括两个文件,即:
test10_01_baidu.py
# -*- coding: utf-8 -*-<br />"""<br />test10_01_baidu.py<br /> 定义了主函数main并调用getinfo.py文件<br />By:Eastmount CSDN 2021-06-23<br />"""<br />import codecs <br />import getinfo #引用模块<br /><br />#主函数 <br />def main():<br /> #文件读取景点信息 <br /> source = open('data.txt','r',encoding='utf-8') <br /> for name in source: <br /> print(name)<br /> getinfo.getInfobox(name) <br /> print('End Read Files!') <br /> source.close()<br />if __name__ == '__main__':<br /> main()<br />
在代码中调用“import getinfo”代码导入getinfo.py文件,导入之后就可以在main函数中调用getinfo.py文件中的函数和属性,接着我们调用getinfo.py文件中的getInfobox()函数,执行爬取消息盒的操作。
getinfo.py
# coding=utf-8<br /><br />"""<br />getinfo.py:获取信息<br />By:Eastmount CSDN 2021-06-23<br />"""<br />import os <br />import codecs<br />import time<br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys<br /><br />#getInfobox函数: 获取国家5A级景区消息盒 <br />def getInfobox(name): <br /> try: <br /> #访问百度百科并自动搜索<br /> driver = webdriver.Firefox() <br /> driver.get("http://baike.baidu.com/") <br /> elem_inp = driver.find_element_by_xpath("//form[@id='searchForm']/input") <br /> elem_inp.send_keys(name) <br /> elem_inp.send_keys(Keys.RETURN) <br /> time.sleep(1)<br /> print(driver.current_url)<br /> print(driver.title)<br /> <br /> #爬取消息盒InfoBox内容<br /> elem_name=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dt") <br /> elem_value=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dd")<br /> """<br /> for e in elem_name:<br /> print(e.text)<br /> for e in elem_value:<br /> print(e.text)<br /> """<br /><br /> #构建字段成对输出<br /> elem_dic = dict(zip(elem_name,elem_value)) <br /> for key in elem_dic: <br /> print(key.text,elem_dic[key].text)<br /> time.sleep(5)<br /> return<br /> <br /> except Exception as e: <br /> print("Error: ",e)<br /> finally: <br /> print('\n')<br /> driver.close() <br /><br />
比如爬取过程Firefox浏览器会自动搜索“故宫”页面,如下图所示:
最终输出结果如下图所示:
内容如下:
https://baike.baidu.com/item/北京故宫<br />北京故宫_百度百科<br />https://baike.baidu.com/item/% ... %3Bbr />北京故宫_百度百科<br />中文名 北京故宫<br />地理位置 北京市东城区景山前街4号 [91] <br />开放时间 4.1-10.31:08:20-17:00(停止售票16:00,最晚入园16:10) ;11.1-3.31:08:30-16:30(停止售票15:30,最晚入园15:40) ;除法定节假日外每周一闭馆 [6] [91] <br />景点级别 AAAAA级<br />门票价格 60元旺季/40元淡季 [7] <br />占地面积 72万平方米(建筑面积约15万平方米)<br />保护级别 世界文化遗产;第一批全国重点文物保护单位<br />批准单位 联合国教科文组织;中华人民共和国国务院<br />批 号 III-100<br />主要藏品 清明上河图、乾隆款金瓯永固杯、酗亚方樽<br />别 名 紫禁城 [8] <br />官方电话 010-85007057 [92]<br />
Python运行结果如下所示,其中data.txt文件中包括了常见的几个景点。
上述代码属性和属性值通过字典进行组合输出的,核心代码如下:
elem_dic = dict(zip(elem_name,elem_value)) <br />for key in elem_dic: <br /> print(key.text,elem_dic[key].text)<br />
同时,读者可以尝试调用本地的无界面浏览器PhantomJS进行爬取的,调用方法如下:
webdriver.PhantomJS(executable_path="C:\...\phantomjs.exe")<br />
课程作业:
三.Selenium爬取Wikipedia
在线百科是互联网中存在公开的最大数据量的用户生成数据集合,这些数据具有一定的结构,属于半结构化数据,最知名的三大在线百科包括Wikipedia 、百度百科、互动百科。首先,作者将介绍Selenium爬取Wikipedia的实例。
1.网页分析
第一个实例作者将详细讲解Selenium爬取20国家集团(G20)的第一段摘要信息,具体步骤如下:
(1) 从G20列表页面中获取各国超链接
20国集团列表网址如下,Wikipedia采用国家英文单词首写字母进行排序,比如“Japan”、“Italy”、“Brazil”等,每个国家都采用超链接的形式进行跳转。
首先,需要获取20个国家的超链接,然后再去到具体的页面进行爬取。选中一个国家的超链接,比如“China”,右键鼠标并点击“检查”按钮,可以获取对应的HTML源代码,如下所示。
其中超链接位于< div class=“mw-category-group” >布局的< ul >< li >< a >节点下,对应代码:
调用Selenium的find_elements_by_xpath()函数获取节点class属性为“mw-category-group”的超链接,它将返回多个元素。定位超链接的核心代码如下:
driver.get("https://en.wikipedia.org/wiki/ ... 6quot;) <br />elem=driver.find_elements_by_xpath("//div[@class='mw-category-group']/ul/li/a") <br />for e in elem:<br /> print(e.text)<br /> print(e.get_attribute("href"))<br />
函数find_elements_by_xpth()先解析HTML的DOM树形结构并定位到指定节点,并获取其元素。然后定义一个for循环,依次获取节点的内容和href属性,其中e.text表示节点的内容,例如下面节点之间的内容为China。
China<br />
同时,e.get_attribute(“href”)表示获取节点属性href对应的属性值,即“/wiki/China”,同理,e.get_attribute(“title”)可以获取标题title属性,得到值“China”。
此时将获取的超链接存储至变量中如下图,再依次定位到每个国家并获取所需内容。
(2) 调用Selenium定位并爬取各国页面消息盒
接下来开始访问具体的页面,比如中国:
如图所示,可以看到页面的URL、标题、摘要、内容、消息盒等,其中消息盒在途中右部分,包括国家全称、位置等。
下面采用对的形式进行描述,很简明精准地概括了一个网页实体,比如、等信息。通常获取这些信息之后,需要进行预处理操作,之后才能进行数据分析,后面章节将详细讲解。
访问到每个国家的页面后,接下来需要获取每个国家的第一段介绍,本小节讲解的爬虫内容可能比较简单,但是讲解的方法非常重要,包括如何定位节点及爬取知识。详情页面对应的HTML核心部分代码如下:
浏览器审查元素方法如图所示。
正文内容位于属性class为“mw-parser-output”的< div >节点下。在HTML中,< P >标签表示段落,通常用于标识正文,< b >标签表示加粗。获取第一段内容即定位第一个< p >节点即可。核心代码如下:
driver.get("https://en.wikipedia.org/wiki/China") <br />elem=driver.find_element_by_xpath("//div[@class='mw-parser-output']/p[2]").text <br />print elem<br />
注意,正文第一段内容位于第二个< p >段落,故获取p[2]即可。同时,如果读者想从源代码中获取消息盒,则需获取消息盒的位置并抓取数据,消息盒(InfoBox)内容在HTML对应为如下节点,记录了网页实体的核心信息。
...<br />
2.代码实现
完整代码参考文件test10_02.py,如下所示:
# coding=utf-8<br />#By:Eastmount CSDN 2021-06-23<br />import time <br />import re <br />import os <br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys <br /><br />driver = webdriver.Firefox() <br />driver.get("https://en.wikipedia.org/wiki/ ... 6quot;) <br />elem = driver.find_elements_by_xpath("//div[@class='mw-category-group']/ul/li/a")<br />name = [] #国家名<br />urls = [] #国家超链接<br /><br />#爬取链接<br />for e in elem:<br /> print(e.text)<br /> print(e.get_attribute("href"))<br /> name.append(e.text)<br /> urls.append(e.get_attribute("href"))<br />print(name)<br />print(urls)<br /><br />#爬取内容<br />for url in urls:<br /> driver.get(url) <br /> elem = driver.find_element_by_xpath("//div[@class='mw-parser-output']/p[1]").text <br /> print(elem)<br />
其中,爬取的信息如图所示。
PS:该部分大家简单尝试即可,更推荐爬取百度百科、互动百科和搜狗百科。
四.Selenium爬取互动百科
几年过去,互动百科变成了快懂百科,但还好网页结构未变化。
1.网页分析
目前,在线百科已经发展为众多科研工作者从事语义分析、知识图谱构建、自然语言处理、搜索引擎和人工智能等领域的重要语料来源。互动百科作为最热门的在线百科之一,为研究者提供了强大的语料支持。
本小节将讲解一个爬取互动百科最热门的十个编程语言页面的摘要信息,通过该实例加深读者使用Selenium爬虫技术的印象,更加深入地剖析网络数据爬取的分析技巧。不同于Wikipedia先爬取词条列表超链接再爬取所需信息、百度百科输入词条进入相关页面再进行定向爬取,互动百科采用的方法是:
由于互动百科搜索不同词条对应的超链接是存在一定规律的,即采用“常用url+搜索的词条名”方式进行跳转,这里我们通过该方法设置不同的词条网页。具体步骤如下:
(1) 调用Selenium分析URL并搜索互动百科词条
我们首先分析互动百科搜索词条的一些规则,比如搜索人物“贵州”,对应的超链为:
对应页面如图所示,从图中可以看到,顶部的超链接URL、词条为“贵州”、第一段为“贵州”的摘要信息、“右边为对应的图片等信息。
同理,搜索编程语言“Python”,对应的超链接为:
可以得出一个简单的规则,即:
可以搜索对应的知识,如编程语言“Java”对应为:
(2) 访问热门Top10编程语言并爬取摘要
2016年,Github根据各语言过去12个月提交的PR数量进行排名,得出最受欢迎的Top10编程语言分别是:JavaScript、Java、Python、Ruby、PHP、C++、CSS、C#、C和GO语言。
然后,需要分布获取这十门语言的摘要信息。在浏览器中选中摘要部分,右键鼠标点击“审查元素”返回结果如图所示,可以在底部看到摘要部分对应的HTML源代码。
新版本的“快懂百科”内容如下图所示:
“Java”词条摘要部分对应的HTML核心代码如下所示:
调用Selenium的find_element_by_xpath()函数,可以获取摘要段落信息,核心代码如下。
driver = webdriver.Firefox()<br />url = "http://www.baike.com/wiki/" + name<br />driver.get(url)<br />elem = driver.find_element_by_xpath("//div[@class='summary']/div/span") <br />print(elem.text)<br />
这段代码的基本步骤是:
下面是完整的代码及详细讲解。
2.代码实现
完整代码为blog10_03.py如下所示,主函数main()中循环调用getgetAbstract()函数爬取Top10编程语言的摘要信息。
# coding=utf-8 <br />#By:Eastmount CSDN 2021-06-23 <br />import os <br />import codecs<br />from selenium import webdriver <br />from selenium.webdriver.common.keys import Keys <br /><br />driver = webdriver.Firefox()<br /><br />#获取摘要信息<br />def getAbstract(name): <br /> try:<br /> #新建文件夹及文件<br /> basePathDirectory = "Hudong_Coding" <br /> if not os.path.exists(basePathDirectory): <br /> os.makedirs(basePathDirectory) <br /> baiduFile = os.path.join(basePathDirectory,"HudongSpider.txt")<br /> #文件不存在新建,存在则追加写入<br /> if not os.path.exists(baiduFile): <br /> info = codecs.open(baiduFile,'w','utf-8') <br /> else: <br /> info = codecs.open(baiduFile,'a','utf-8') <br /><br /> url = "http://www.baike.com/wiki/" + name<br /> print(url)<br /> driver.get(url) <br /> elem = driver.find_elements_by_xpath("//div[@class='summary']/div/span")<br /> content = ""<br /> for e in elem:<br /> content += e.text<br /> print(content)<br /> info.writelines(content+'\r\n') <br /> <br /> except Exception as e: <br /> print("Error: ",e) <br /> finally: <br /> print('\n') <br /> info.write('\r\n') <br /> <br />#主函数 <br />def main():<br /> languages = ["JavaScript", "Java", "Python", "Ruby", "PHP",<br /> "C++", "CSS", "C#", "C", "GO"]<br /> print('开始爬取')<br /> for lg in languages: <br /> print(lg)<br /> getAbstract(lg) <br /> print('结束爬取')<br /><br />if __name__ == '__main__':<br /> main() <br />
其中“JavaScript”和“Java”编程语言的抓取结果如图所示,该段代码爬取了热门十门语言在互动百科中的摘要信息。
程序成功抓取了各个编程语言的摘要信息,如下图所示:
同时将数据存储至本地TXT文件中,这将有效为NLP和文本挖掘进行一步分析提供支撑。
写到这里,几种常见的百科数据抓取方法就介绍完毕了,希望您喜欢。
五.总结
在线百科被广泛应用于科研工作、知识图谱和搜索引擎构建、大小型公司数据集成、Web2.0知识库系统中,由于其公开、动态、可自由访问和编辑、拥有多语言版本等特点,它深受科研工作者和公司开发人员的喜爱,常见的在线百科包括Wikipedia、百度百科和互动百科等。
本文结合Selenium技术分别爬取了Wikipedia的段落内容、百度百科的消息盒和互动百科的摘要信息,并采用了三种分析方法,希望读者通过该章节的案例掌握Selenium技术爬取网页的方法。
Selenium用得更广泛的领域是自动化测试,它直接运行在浏览器中(如Firefox、Chrome、IE等),就像真实用户操作一样,对开发的网页进行各式各样的测试,它更是自动化测试方向的必备工具。希望读者能掌握这种技术的爬取方法,尤其是目标网页需要验证登录等情形。
该系列所有代码下载地址:
感谢在求学路上的同行者,不负遇见,勿忘初心。这周的留言感慨~
(By:娜璋 2021-08-20夜于景怡)
前文赏析:
第一部分 基础语法
第二部分 网络爬虫
参考文献
牛逼操作!我用Python做了一个编程语言20年的动态排行榜!
网站优化 • 优采云 发表了文章 • 0 个评论 • 91 次浏览 • 2022-05-29 16:35
在编程语言的舞台上,一直有着谁是最好的语言的竞争,小编虽然一直用着几种编程语言,但是感觉个人的想法不能代表着大家的想法。虽然关于最好语言的争论从未停止过,但是关于编程语言的热度排名,我们可以从TIOBE 编程语言排行榜上进行探索。
今天,小编就带领大家爬取一下,自2001年5月至今,TIOBE 编程语言排行榜上编程语言的变化情况,看一下在接近20年的时间里,编程语言的热度是如何变化的。
01.编程语言资料获取
首先我们是进行的是资料的获取,我们打开链接,就可以看到TIOBE编程语言的排行榜,通过查看其网页源代码,可以发现,我们想要爬取的资料,都显示在网页源代码里,如下图所示:
接下来就可以直接利用爬虫来获取网页源代码,并利用正则表达式来匹配我们需要的关键字内容,部分程序如下图所示:
上述程序中,我们对于抓取到的数据,进行正则表达式匹配,然后提取各个编程语言在不同时间段的热度数值,并保存到本地的文件中。
02.清洗数据
接下来,我们要完成的就是利用动态可视化的柱状图来观察各种编程语言随着时间的热度变化。我们先对数据进行清洗,获取编程语言的名字一起设置一个嵌套的字典,程序如下图所示:
上述程序中的嵌套字典含义为每一个月份下的每种编程语言的热度值,其结构格式如下所示:
{“2020-1-12”:{“Java”:16, “C++”:14, “python”:10,…}, “2020-2-13”:{“Java”:16.3, “C++”:15.6, …},…}。
03.设置柱状图的颜色
为了在可视化过程中区分每一种编程语言,需要为柱状图中的每一柱都设置不同的颜色,同时,将嵌套字典按照月份的顺序进行排序,程序如下所示:
04.大功告成,动态显示
最后,我们便可以对数据进行可视化的展示,程序如下图所示:
上述程序中,首先需要清除figure 中的活动轴,我们对于嵌套字典的每一个月份,将每一个月份中的编程语言,按照其热度值进行从小到大的排序,然后将排序号的编程语言,关联其对应的柱状图颜色。
05.动态现实图
接下来就可以画出我们的柱状图,然后暂停显示结果,并不断循环,从而达到动态柱状图的功能,其效果如下图所示:
06.更炫酷的动态图
如果大家觉得图做的不够优美,大家可以利用js进行数据渲染制作,这里小编也为大家利用Flourish制作了一个更加好看的界面,如下图所示:
从上面的可视化动图可以看出,Java和C语言一直是牢牢地掌控着编程语言热度前两名的宝座,而python语言,凭借着人工智能的热潮,逐渐的从排名末尾,一路追赶,排名在第三位,并逐渐拉开了与第四名的差距,可谓是编程语言界的逆袭王者。
而像是C++和PHP,其热度却逐渐的走低。虽然编程语言热度有高有低,但是不可否认的是,每一门编程语言,都有其应用的价值,能够在编程语言的历史长河中历经洗礼,而没有被淘汰,只要好好掌握一门语言,都会有用武之地。
感谢阅读<p style="max-width: 100%;min-height: 1em;box-sizing: border-box !important;overflow-wrap: break-word !important;">推荐阅读:
1:真实的上海IT圈:张江男vs漕河泾男
2:真实的北京IT圈:后厂村姑 vs 后厂村花?
3:为什么你的提问没人解答?
4:Python爱好者社区历史文章合集
<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
重磅!Python交流群已成立<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />公众号运营至今,离不开小伙伴们的支持。<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />为了给小伙伴们提供一个互相交流的技术平台,特地开通了Python交流群。群里有不少技术大神,不时会分享一些技术要点,更有一些资源收藏爱好者不时分享一些优质的学习资料。(免费,不卖课!)
需要进群的朋友,可长按扫描下方二维码。
<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
▲长按扫码</p> 查看全部
牛逼操作!我用Python做了一个编程语言20年的动态排行榜!
在编程语言的舞台上,一直有着谁是最好的语言的竞争,小编虽然一直用着几种编程语言,但是感觉个人的想法不能代表着大家的想法。虽然关于最好语言的争论从未停止过,但是关于编程语言的热度排名,我们可以从TIOBE 编程语言排行榜上进行探索。
今天,小编就带领大家爬取一下,自2001年5月至今,TIOBE 编程语言排行榜上编程语言的变化情况,看一下在接近20年的时间里,编程语言的热度是如何变化的。
01.编程语言资料获取
首先我们是进行的是资料的获取,我们打开链接,就可以看到TIOBE编程语言的排行榜,通过查看其网页源代码,可以发现,我们想要爬取的资料,都显示在网页源代码里,如下图所示:
接下来就可以直接利用爬虫来获取网页源代码,并利用正则表达式来匹配我们需要的关键字内容,部分程序如下图所示:
上述程序中,我们对于抓取到的数据,进行正则表达式匹配,然后提取各个编程语言在不同时间段的热度数值,并保存到本地的文件中。
02.清洗数据
接下来,我们要完成的就是利用动态可视化的柱状图来观察各种编程语言随着时间的热度变化。我们先对数据进行清洗,获取编程语言的名字一起设置一个嵌套的字典,程序如下图所示:
上述程序中的嵌套字典含义为每一个月份下的每种编程语言的热度值,其结构格式如下所示:
{“2020-1-12”:{“Java”:16, “C++”:14, “python”:10,…}, “2020-2-13”:{“Java”:16.3, “C++”:15.6, …},…}。
03.设置柱状图的颜色
为了在可视化过程中区分每一种编程语言,需要为柱状图中的每一柱都设置不同的颜色,同时,将嵌套字典按照月份的顺序进行排序,程序如下所示:
04.大功告成,动态显示
最后,我们便可以对数据进行可视化的展示,程序如下图所示:
上述程序中,首先需要清除figure 中的活动轴,我们对于嵌套字典的每一个月份,将每一个月份中的编程语言,按照其热度值进行从小到大的排序,然后将排序号的编程语言,关联其对应的柱状图颜色。
05.动态现实图
接下来就可以画出我们的柱状图,然后暂停显示结果,并不断循环,从而达到动态柱状图的功能,其效果如下图所示:
06.更炫酷的动态图
如果大家觉得图做的不够优美,大家可以利用js进行数据渲染制作,这里小编也为大家利用Flourish制作了一个更加好看的界面,如下图所示:
从上面的可视化动图可以看出,Java和C语言一直是牢牢地掌控着编程语言热度前两名的宝座,而python语言,凭借着人工智能的热潮,逐渐的从排名末尾,一路追赶,排名在第三位,并逐渐拉开了与第四名的差距,可谓是编程语言界的逆袭王者。
而像是C++和PHP,其热度却逐渐的走低。虽然编程语言热度有高有低,但是不可否认的是,每一门编程语言,都有其应用的价值,能够在编程语言的历史长河中历经洗礼,而没有被淘汰,只要好好掌握一门语言,都会有用武之地。
感谢阅读
1:真实的上海IT圈:张江男vs漕河泾男
2:真实的北京IT圈:后厂村姑 vs 后厂村花?
3:为什么你的提问没人解答?
4:Python爱好者社区历史文章合集
<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
重磅!Python交流群已成立<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />公众号运营至今,离不开小伙伴们的支持。<br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />为了给小伙伴们提供一个互相交流的技术平台,特地开通了Python交流群。群里有不少技术大神,不时会分享一些技术要点,更有一些资源收藏爱好者不时分享一些优质的学习资料。(免费,不卖课!)
需要进群的朋友,可长按扫描下方二维码。
▲长按扫码</p>
php用正则表达抓取网页中文章对于php和python程序员来说
网站优化 • 优采云 发表了文章 • 0 个评论 • 94 次浏览 • 2022-05-21 15:01
php用正则表达抓取网页中文章对于php和python程序员来说,有个抓取网页中文章的方法。google正则表达式引擎可以自动判断文章中的某个字符是否可以用正则表达式表示出来。你可以利用这个自动找到该字符所对应的正则表达式。正则表达式引擎用于匹配网页中所有可用正则表达式字符,但正则表达式引擎只是找到用作正则表达式匹配的字符,而且只能匹配到php的文章。
常用正则表达式有:匹配html字符串,匹配正则表达式,匹配php中任意字符,如:匹配html文本第一个字符第二个字符不可匹配:其他正则表达式匹配php中任意一个字符bashb格式正则表达式大多都以包含行开头,一些常用正则表达式中会包含空行,来避免字符串空格对正则表达式所造成的额外影响。在re和grep引擎中,正则表达式引擎是必要的。
正则表达式中第一个字符必须用正则表达式表示,即只能匹配字符串的开头,并以一个正则表达式开头,如下表所示。正则表达式必须匹配特定的字符,大家可以用正则表达式库来验证一下,如:site.text例子中(text)中,(00。
0)代表正则表达式(000
0)正确,而不是上面表格第四个字符的错误。然后,我们需要将正则表达式传递给grep和re模块进行匹配查找,如下所示:re库正则表达式匹配000000-255555,然后我们可以得到正则表达式,end。
(-255555
5)---(000000
1)---(000000
2)---(000000
3)---(000000
4)正则表达式模块匹配11111111。 查看全部
php用正则表达抓取网页中文章对于php和python程序员来说
php用正则表达抓取网页中文章对于php和python程序员来说,有个抓取网页中文章的方法。google正则表达式引擎可以自动判断文章中的某个字符是否可以用正则表达式表示出来。你可以利用这个自动找到该字符所对应的正则表达式。正则表达式引擎用于匹配网页中所有可用正则表达式字符,但正则表达式引擎只是找到用作正则表达式匹配的字符,而且只能匹配到php的文章。
常用正则表达式有:匹配html字符串,匹配正则表达式,匹配php中任意字符,如:匹配html文本第一个字符第二个字符不可匹配:其他正则表达式匹配php中任意一个字符bashb格式正则表达式大多都以包含行开头,一些常用正则表达式中会包含空行,来避免字符串空格对正则表达式所造成的额外影响。在re和grep引擎中,正则表达式引擎是必要的。
正则表达式中第一个字符必须用正则表达式表示,即只能匹配字符串的开头,并以一个正则表达式开头,如下表所示。正则表达式必须匹配特定的字符,大家可以用正则表达式库来验证一下,如:site.text例子中(text)中,(00。
0)代表正则表达式(000
0)正确,而不是上面表格第四个字符的错误。然后,我们需要将正则表达式传递给grep和re模块进行匹配查找,如下所示:re库正则表达式匹配000000-255555,然后我们可以得到正则表达式,end。
(-255555
5)---(000000
1)---(000000
2)---(000000
3)---(000000
4)正则表达式模块匹配11111111。
php用正则表达抓取网页中文章信息中文分词器抓取
网站优化 • 优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2022-05-13 15:01
php用正则表达抓取网页中文章信息中文分词器qpanda抓取百度首页贴吧抓取爱奇艺视频分享链接抓取网易云音乐歌单快搜。用户正在抓取一个分享请求或者一个翻页请求分享你自己的爬虫或者解析你爬虫用户用户属性值,如id,注册id等。当一个用户发布一个内容发布一个好友,搜索,推荐时都可以用到分词器技术或者正则表达下限制如果你要抓取一个链接长度(类似一页)也可以用正则表达下抓取。
比如下面是我的爬虫。一个带分词器的爬虫爬取百度首页抓取百度贴吧搜索结果抓取爱奇艺视频观看链接抓取快搜当然下面的除外。php正则表达其他爬虫正则表达获取关键字如果使用正则表达获取一个页面的,你可以从网页的第一个元素开始。比如,你可以从你的首页开始抓取以便获取其所有的链接。1.给爬虫取个标题你可以得到这样一个页面。
php,urllib,mysql等等这个会爬虫才能获取,如果不会,可以学习下。2.给一个首页分段php用requests将整个页面分段,每一段爬取需要抓取的部分。php-gpl,因为requests是gpl。requests很好用的~然后分段爬取每一页,也可以分段获取每一个id的爬取,比如以json的形式抓取,有时候也可以分段抓取所有id的抓取。
这个我有写爬虫demo。php中文分词器抓取百度首页贴吧抓取百度音乐分享链接抓取网易云音乐歌单抓取爱奇艺视频分享链接抓取快搜当然下面的除外。php正则表达:正则表达form1form2__form__(){if(page=='no'){return'no';}//javascript}form1__form__(){//比如某个页面page='4094'}php用正则处理url的部分,如果首页不是正则表达,就调用正则表达。
4.准备需要的库javascript-soupcss-soup这两个是正则的事情。这些我都在爬虫中写demo,有时间一定更新。 查看全部
php用正则表达抓取网页中文章信息中文分词器抓取
php用正则表达抓取网页中文章信息中文分词器qpanda抓取百度首页贴吧抓取爱奇艺视频分享链接抓取网易云音乐歌单快搜。用户正在抓取一个分享请求或者一个翻页请求分享你自己的爬虫或者解析你爬虫用户用户属性值,如id,注册id等。当一个用户发布一个内容发布一个好友,搜索,推荐时都可以用到分词器技术或者正则表达下限制如果你要抓取一个链接长度(类似一页)也可以用正则表达下抓取。
比如下面是我的爬虫。一个带分词器的爬虫爬取百度首页抓取百度贴吧搜索结果抓取爱奇艺视频观看链接抓取快搜当然下面的除外。php正则表达其他爬虫正则表达获取关键字如果使用正则表达获取一个页面的,你可以从网页的第一个元素开始。比如,你可以从你的首页开始抓取以便获取其所有的链接。1.给爬虫取个标题你可以得到这样一个页面。
php,urllib,mysql等等这个会爬虫才能获取,如果不会,可以学习下。2.给一个首页分段php用requests将整个页面分段,每一段爬取需要抓取的部分。php-gpl,因为requests是gpl。requests很好用的~然后分段爬取每一页,也可以分段获取每一个id的爬取,比如以json的形式抓取,有时候也可以分段抓取所有id的抓取。
这个我有写爬虫demo。php中文分词器抓取百度首页贴吧抓取百度音乐分享链接抓取网易云音乐歌单抓取爱奇艺视频分享链接抓取快搜当然下面的除外。php正则表达:正则表达form1form2__form__(){if(page=='no'){return'no';}//javascript}form1__form__(){//比如某个页面page='4094'}php用正则处理url的部分,如果首页不是正则表达,就调用正则表达。
4.准备需要的库javascript-soupcss-soup这两个是正则的事情。这些我都在爬虫中写demo,有时间一定更新。
资源推荐 | 五十种最好用的开源爬虫软件
网站优化 • 优采云 发表了文章 • 0 个评论 • 265 次浏览 • 2022-05-12 12:05
网络爬虫是一种自动化程序或脚本,根据设定的数据爬取索引系统地爬取 Web 网页。整个过程称为 Web 数据采集(Crawling)或爬取(Spidering)。
人们通常将用于爬取的工具称为爬虫(Web Spider)、Web 数据抽取软件或 Web 网站采集工具。
当前 Web 爬取应用广受关注,一个重要的原因在于它们从多个方面上推进了业务的加速增长。这些应用非常便于在数据驱动的大环境中使用。它们从多个公开的网站采集信息和内容,并按统一可管理的方式提供。在这些应用的帮助下,我们可以一窥遍布全球的海量信息,例如新闻、社会媒体、图片、文章,甚至是竞争对手的情况。
为更好地采用各种爬取应用,我们需要做好调研,了解各种应用的不同功能和相同特性。我们将在本文中介绍多种不同的开源 Web 爬取软件库和工具。本文有助于读者实现爬取、采集网站数据并分析数据。
我们全面地总结了一些最好的开源 Web 爬取软件库和工具,并按实现语言的不同进行了分类。
Python 编写的开源 Web 爬虫1. Scrapy
简介
特性
2. Cola简介
特性
3. Crawley简介
特性
4. MechanicalSoup简介
特性
5. PySpider简介
特性
6. Portia简介
特性
7. Beautifulsoup简介
特性
8. Spidy 爬虫简介
特性
9. Garb简介
特性
Java 编写的开源 Web 爬虫10. Apache Nutch
简介特性:11. Heritrix简介:
在使用 Java 编写的免费开源 Web 爬虫中,Heritrix 是其中一种得到广泛使用的工具。事实上,它是一种可扩展、Web 规模、存档质量(archival-quality)的 Web 爬取项目。Heritrix 是一种扩展能力和性能很好的解决方案,支持用户即刻爬取并归档一组网站。此外,它在设计上考虑了 robots.txt 禁止规则和 META 机器人标签。Heritrix 可运行在 Linux/Unix 和 Windows 系统上。
特性:12. ACHE 爬虫简介:
ACHE 是一种专用于特定用途的 Web 爬虫。ACHE 爬取满足特定标准的 Web 页面。例如,属于特定领域并包含用户指定模式的页面。不同于通用爬虫,ACHE 使用页面分类器遴选特定领域中的相关和无关页面。页面分类器可以是基本的正则表达式(例如,匹配所有包含给定单词的页面),也可以基于机器学习的分类模型。ACHE 也可以自动学习如何对链接做优先处理,实现高效地定位相关内容,避免检索无关的页面内容。
特性:13. Crawler4j简介:14. Gecco简介:
Gecco 是一种使用 Java 开发的轻量级 Web 爬虫,易于使用。Gecco 集成了 jsoup、httpclient、fastjson、spring、htmlunit、redission 等优秀框架。用户只需要配置一系列 jQuery 风格选择器,就能很快地建立一个爬虫。Gecco 框架具有优秀的扩展能力。框架基于一些开放式和封闭式设计原则,对改进封闭,对扩展开放。
特性:15. BUbiNG简介:
BUbiNG 令人惊喜,它可称为下一代的开源 Web 爬虫。BUbiNG 是一种 Java 开发的完全分布式爬虫(无需中央协调),每秒可爬取数千个网页,并支持采集大规模数据集。BUbiNG 的分布式是基于高速协议实现的,因此可以获得非常高的通量。BUbiNG 提供对海量数据的大规模爬取。它完全可配置、易于扩展,并可集成垃圾信息检测。
特性:16. Narconex简介:
对于寻求可满足企业级需求的开源 Web 爬虫的用户而言,Narconex 是一种很好的工具。Norconex 支持用户爬取任何 Web 内容。用户可以独立运行这种全功能数据采集器,或是将其集成在自己的应用中。支持所有操作系统。可在具有一般容量的单体服务器上爬取数百万信息。此外,Narconex 提供多种内容和元数据操作特性,还可以抽取页面中特定的图像。
特性:17. WebSPHINX简介:
WebSphinix 是一种非常易于使用的可定制 Web 爬虫。它设计用于高级 Web 用户和 Java 编程人员,支持他们自动爬取小部分 Web。WebSphinix 数据抽取解决方案也提供了一种全面的 Java 类库和交互式软件开发环境。WebSphinix 包括两部分:爬虫基准测试(Crawler Workbench),WebSPHINX 类库。爬虫基准测试提供了很好的用户图形接口,支持用户配置并控制定制的 Web 爬虫。WebSPHINX 类库为使用 Java 编写 Web 爬虫提供支持。WebSphinix 支持运行在 Windows、Linux、Mac 和 Android IOS 上。
特性:18. Spiderman简介:
Spiderman 是一种 Java 开源 Web 数据抽取工具。它采集特定的 Web 页面,并从中抽取有用数据。Spiderman 主要使用 XPath 和正则表达式等技术抽取实际数据。
特性:19. WebCollector :简介:
WebCollector 是一种基于 Java 的开源 Web 爬虫框架。它为实现 Web 爬取功能提供了一下基本的接口。用户可以使用它在五分钟内建立起一个多线程爬虫。
特性:20. Webmagic简介:
WebMagic 是一种可扩展的爬虫框架。WebMagic 涵盖了爬虫的整个生命周期,包括下载、URL 管理、内容抽取和持久化。可用于简化一些特定爬虫的开发。
特性:21. StormCrawler简介:
StormCrawler 是一种基于 Apache Storm 构架分布式 Web 爬虫的开源 SDK。StormCrawler 为开发人员构建爬虫提供了软件库和一系列资源。StormCrawler 完全适用于以数据流提供需获取和解析的 URL 的情况,也非常适用于大规模递归性爬取,尤其是需要低延迟的情况。
特性:JavaScript 编写的开源 Web 爬虫22. NodeCrawler简介:
NodeCrawler 是一种广为使用的 Web 爬虫,它基于 NodeJS 实现,具有非常快的爬取速度。Nodecrawler 非常适用于偏爱使用 JavaScript 编程或者致力于 JavaScript 项目的开发人员。其安装也非常简单。JSDOM 和 Cheerio(用于 HTML 解析)实现服务器端渲染。其中,JSDOM 更为稳定。
特性:23. Simplecrawler简介:
Simplecrawler 设计提供基本的、灵活且稳定的网站爬取 API。Simplecrawler 在实现上考虑了针对特大型 Web 站点的归档、分析和搜索。它可爬取上百万页面,并毫无问题地向磁盘写入数十 GB 数据。
特性:24. Js-crawler :简介:25. Webster简介:26. Node-osmosis简介:
一种使用 NodeJS 实现的 HTML/XML 解析器和 Web 爬虫。
特性:27. Supercrawler简介:
Supercrawler 是一种使用 NodeJS 实现的 Web 爬虫,在设计上支持高度可配置和易用性。一旦成功爬取一个网页(可以是图像、文本文档或其他任何文件),Supercrawler 将会触发用户自定义的内容类型(content-type)处理器,处理页面解析、保存数据以及其它一些用户定义的功能。
特性:28. Web scraper 的 Chrome 扩展简介:
Web Scraper 是一种 Chrome 浏览器扩展,构建用于从 Web 页面抽取数据。用户可以使用该扩展创建计划(站点地图),定义如何遍历一个 Web 网站,以及如何从中抽取数据。Web Scraper 使用站点地图相应地遍历网站,并从中抽取数据。支持以 CSV 格式导出所抽取的数据。
特性:29. Headless Chrome 爬虫简介:
使用基本 HTML 文件请求的爬虫,通常速度很快。但这样的爬虫往往会抽取到空白内容,尤其是在爬取使用 AngularJS、React 和 Vue.js 等现代前端框架构建的网站时。
特性:30. X-ray特性:C 编写的开源 Web 爬虫31. Httrack简介:
HTTracks 是一项免费(GPL、Libre/ 自由软件)且易于使用的离线浏览器功能。支持用户将 Web 站点下载到本地目录,递归构建全部目录,以及获取 HTML、图像和其它文件到本地计算机。HTTrack 会维持原站点的相对链接结构。用户可以用浏览器打开本地的“镜像”页面,并逐个链接浏览,与在线浏览无异。HTTrack 也支持对已有镜像站点的更新,以及从中断点恢复下载。HTTrack 高度可配置,并提供帮助文档。
特性:32. GNU Wget简介:
GNU Wget 是一种免费软件包,它使用 HTTP、HTTPS、FTP、FTPS 等广为使用的互联网协议检索文件。Wget 是一种非交互式命令行工具,易于从脚本、Cron 任务、不具有 X 窗口支持的终端等处调用。
特性:C++ 编写的开源 Web 爬虫33. gigablast简介:
Gigablast 是一种开源的 Web 和企业搜索引擎,也是一种爬虫。Gigablast 是自身维护数十亿页面检索索引的数家美国搜索引擎之一。
特性:C# 编写的开源 Web 爬虫34. 简介:
适用于寻求开源 Web 爬虫的 C# 开发人员。 软件类库从因特网下载内容、对内容做索引,并对过程做定制。用户可使用该工具做个人内容聚合,也可用于将下载的内容抽取、采集和解析为多个表单。 索引所发现的内容,并存储在 Lucene.NET 索引中。 非常适用于文本挖掘,也适用于学习高级爬取技术。
特性:35. Abot简介:
Abot 是一种 C# 实现的开源 Web 爬虫,主要侧重于速度和灵活性。Abot 在实现中考虑了底层技术细节,包括多线程、HTTP 请求、调度、链接解析等。用户只需注册事件,就可以处理分页数据。支持用户插入自己的核心接口实现,实现对整个爬取过程的完全控制。
特性:36. Hawk简介:
HAWK 无需用户做任何编程,提供图形可视化数据获取和清理工具,并以 GPL 协议开源。
特性:37. SkyScraper简介:.NET 编写的 Web 爬虫38. DotnetSpider简介:PHP 编写的开源 Web 爬虫39. Goutte简介:40. Dom-crawler简介:41. Pspider简介:42. Php-spider简介:
一种可配置、可扩展的 Web 爬虫。
特性:43. Spatie / Crawler简介:Ruby 实现的开源 Web 爬虫44. Mechanize简介:GO 编写的开源 Web 爬虫45. Colly简介:
为 Go 爱好者提供了一种快速且适用的爬取框架。Colly 提供了非常清晰的接口,可用于编写任何类型的爬虫和数据获取工具。Colly 使得用户可以轻易地从站点抽取结构化数据。这些数据适用于大范围的应用,例如数据挖掘、数据处理和归档。
特性:46. Gopa特性:47. Pholcus简介:
Pholcus 是一种完全使用 Go 语言实现的高并发性、重量级爬虫软件。它针对因特网数据采集,为只具有基本 Go 或 JavaScript 编程基础的用户提供了一种只需要关注自定义功能的特性。规则简单灵活,并发批处理任务,提供丰富的输出方式,包括 MySQL、MongoDB、Kafka、CSV、Exvel 等。用户共享了大量的演示。此外,Pholcus 支持两种水平和垂直爬取模式,支持模拟登陆、暂停任务、取消任务等一系列高级特性。
特性:R 编写的开源 Web 爬虫48. Rvest简介:Scala 编写的开源 Web 爬虫49. Sparkler简介:
Web 爬虫是一种机器人程序,它从 Web 网站采集资源,用于构建搜索引擎、知识库等应用。Sparkler(“Spark-Crawler”的缩写)是一种新型的 Web 爬虫,它通过整合 Spark、Kafka、Lucene/Solr、Tika、pf4j 等多种 Apache 项目,使用了分布式计算和信息检索领域的最新进展。
特性:Perl 编写的开源 Web 爬虫50. Web-scraper简介:总 结
开源 Web 爬取应用纷繁多样,在此难以一一枚举。每种爬取应用分别各具特长,适用于不同用户的需求。
用户可根据自己的需求和技术要求选取适用的工具。也许用户会从上述工具中做出选择,也许会选择本文列表之外的工具。在实践中,用户只需根据任务的不同做出一个合理的选择,这完全取决于最终用户。其中至关重要的是,用户必须要了解每种工具的独特优势,并利用这些优势服务于用户自身的业务,或是自身所承担的其它任何任务。
欢迎与我们就此开展交流!
查看英文原文:
如果你喜欢这篇文章,或希望看到更多类似优质报道,记得给我留言和点赞哦! 查看全部
资源推荐 | 五十种最好用的开源爬虫软件
网络爬虫是一种自动化程序或脚本,根据设定的数据爬取索引系统地爬取 Web 网页。整个过程称为 Web 数据采集(Crawling)或爬取(Spidering)。
人们通常将用于爬取的工具称为爬虫(Web Spider)、Web 数据抽取软件或 Web 网站采集工具。
当前 Web 爬取应用广受关注,一个重要的原因在于它们从多个方面上推进了业务的加速增长。这些应用非常便于在数据驱动的大环境中使用。它们从多个公开的网站采集信息和内容,并按统一可管理的方式提供。在这些应用的帮助下,我们可以一窥遍布全球的海量信息,例如新闻、社会媒体、图片、文章,甚至是竞争对手的情况。
为更好地采用各种爬取应用,我们需要做好调研,了解各种应用的不同功能和相同特性。我们将在本文中介绍多种不同的开源 Web 爬取软件库和工具。本文有助于读者实现爬取、采集网站数据并分析数据。
我们全面地总结了一些最好的开源 Web 爬取软件库和工具,并按实现语言的不同进行了分类。
Python 编写的开源 Web 爬虫1. Scrapy
简介
特性
2. Cola简介
特性
3. Crawley简介
特性
4. MechanicalSoup简介
特性
5. PySpider简介
特性
6. Portia简介
特性
7. Beautifulsoup简介
特性
8. Spidy 爬虫简介
特性
9. Garb简介
特性
Java 编写的开源 Web 爬虫10. Apache Nutch
简介特性:11. Heritrix简介:
在使用 Java 编写的免费开源 Web 爬虫中,Heritrix 是其中一种得到广泛使用的工具。事实上,它是一种可扩展、Web 规模、存档质量(archival-quality)的 Web 爬取项目。Heritrix 是一种扩展能力和性能很好的解决方案,支持用户即刻爬取并归档一组网站。此外,它在设计上考虑了 robots.txt 禁止规则和 META 机器人标签。Heritrix 可运行在 Linux/Unix 和 Windows 系统上。
特性:12. ACHE 爬虫简介:
ACHE 是一种专用于特定用途的 Web 爬虫。ACHE 爬取满足特定标准的 Web 页面。例如,属于特定领域并包含用户指定模式的页面。不同于通用爬虫,ACHE 使用页面分类器遴选特定领域中的相关和无关页面。页面分类器可以是基本的正则表达式(例如,匹配所有包含给定单词的页面),也可以基于机器学习的分类模型。ACHE 也可以自动学习如何对链接做优先处理,实现高效地定位相关内容,避免检索无关的页面内容。
特性:13. Crawler4j简介:14. Gecco简介:
Gecco 是一种使用 Java 开发的轻量级 Web 爬虫,易于使用。Gecco 集成了 jsoup、httpclient、fastjson、spring、htmlunit、redission 等优秀框架。用户只需要配置一系列 jQuery 风格选择器,就能很快地建立一个爬虫。Gecco 框架具有优秀的扩展能力。框架基于一些开放式和封闭式设计原则,对改进封闭,对扩展开放。
特性:15. BUbiNG简介:
BUbiNG 令人惊喜,它可称为下一代的开源 Web 爬虫。BUbiNG 是一种 Java 开发的完全分布式爬虫(无需中央协调),每秒可爬取数千个网页,并支持采集大规模数据集。BUbiNG 的分布式是基于高速协议实现的,因此可以获得非常高的通量。BUbiNG 提供对海量数据的大规模爬取。它完全可配置、易于扩展,并可集成垃圾信息检测。
特性:16. Narconex简介:
对于寻求可满足企业级需求的开源 Web 爬虫的用户而言,Narconex 是一种很好的工具。Norconex 支持用户爬取任何 Web 内容。用户可以独立运行这种全功能数据采集器,或是将其集成在自己的应用中。支持所有操作系统。可在具有一般容量的单体服务器上爬取数百万信息。此外,Narconex 提供多种内容和元数据操作特性,还可以抽取页面中特定的图像。
特性:17. WebSPHINX简介:
WebSphinix 是一种非常易于使用的可定制 Web 爬虫。它设计用于高级 Web 用户和 Java 编程人员,支持他们自动爬取小部分 Web。WebSphinix 数据抽取解决方案也提供了一种全面的 Java 类库和交互式软件开发环境。WebSphinix 包括两部分:爬虫基准测试(Crawler Workbench),WebSPHINX 类库。爬虫基准测试提供了很好的用户图形接口,支持用户配置并控制定制的 Web 爬虫。WebSPHINX 类库为使用 Java 编写 Web 爬虫提供支持。WebSphinix 支持运行在 Windows、Linux、Mac 和 Android IOS 上。
特性:18. Spiderman简介:
Spiderman 是一种 Java 开源 Web 数据抽取工具。它采集特定的 Web 页面,并从中抽取有用数据。Spiderman 主要使用 XPath 和正则表达式等技术抽取实际数据。
特性:19. WebCollector :简介:
WebCollector 是一种基于 Java 的开源 Web 爬虫框架。它为实现 Web 爬取功能提供了一下基本的接口。用户可以使用它在五分钟内建立起一个多线程爬虫。
特性:20. Webmagic简介:
WebMagic 是一种可扩展的爬虫框架。WebMagic 涵盖了爬虫的整个生命周期,包括下载、URL 管理、内容抽取和持久化。可用于简化一些特定爬虫的开发。
特性:21. StormCrawler简介:
StormCrawler 是一种基于 Apache Storm 构架分布式 Web 爬虫的开源 SDK。StormCrawler 为开发人员构建爬虫提供了软件库和一系列资源。StormCrawler 完全适用于以数据流提供需获取和解析的 URL 的情况,也非常适用于大规模递归性爬取,尤其是需要低延迟的情况。
特性:JavaScript 编写的开源 Web 爬虫22. NodeCrawler简介:
NodeCrawler 是一种广为使用的 Web 爬虫,它基于 NodeJS 实现,具有非常快的爬取速度。Nodecrawler 非常适用于偏爱使用 JavaScript 编程或者致力于 JavaScript 项目的开发人员。其安装也非常简单。JSDOM 和 Cheerio(用于 HTML 解析)实现服务器端渲染。其中,JSDOM 更为稳定。
特性:23. Simplecrawler简介:
Simplecrawler 设计提供基本的、灵活且稳定的网站爬取 API。Simplecrawler 在实现上考虑了针对特大型 Web 站点的归档、分析和搜索。它可爬取上百万页面,并毫无问题地向磁盘写入数十 GB 数据。
特性:24. Js-crawler :简介:25. Webster简介:26. Node-osmosis简介:
一种使用 NodeJS 实现的 HTML/XML 解析器和 Web 爬虫。
特性:27. Supercrawler简介:
Supercrawler 是一种使用 NodeJS 实现的 Web 爬虫,在设计上支持高度可配置和易用性。一旦成功爬取一个网页(可以是图像、文本文档或其他任何文件),Supercrawler 将会触发用户自定义的内容类型(content-type)处理器,处理页面解析、保存数据以及其它一些用户定义的功能。
特性:28. Web scraper 的 Chrome 扩展简介:
Web Scraper 是一种 Chrome 浏览器扩展,构建用于从 Web 页面抽取数据。用户可以使用该扩展创建计划(站点地图),定义如何遍历一个 Web 网站,以及如何从中抽取数据。Web Scraper 使用站点地图相应地遍历网站,并从中抽取数据。支持以 CSV 格式导出所抽取的数据。
特性:29. Headless Chrome 爬虫简介:
使用基本 HTML 文件请求的爬虫,通常速度很快。但这样的爬虫往往会抽取到空白内容,尤其是在爬取使用 AngularJS、React 和 Vue.js 等现代前端框架构建的网站时。
特性:30. X-ray特性:C 编写的开源 Web 爬虫31. Httrack简介:
HTTracks 是一项免费(GPL、Libre/ 自由软件)且易于使用的离线浏览器功能。支持用户将 Web 站点下载到本地目录,递归构建全部目录,以及获取 HTML、图像和其它文件到本地计算机。HTTrack 会维持原站点的相对链接结构。用户可以用浏览器打开本地的“镜像”页面,并逐个链接浏览,与在线浏览无异。HTTrack 也支持对已有镜像站点的更新,以及从中断点恢复下载。HTTrack 高度可配置,并提供帮助文档。
特性:32. GNU Wget简介:
GNU Wget 是一种免费软件包,它使用 HTTP、HTTPS、FTP、FTPS 等广为使用的互联网协议检索文件。Wget 是一种非交互式命令行工具,易于从脚本、Cron 任务、不具有 X 窗口支持的终端等处调用。
特性:C++ 编写的开源 Web 爬虫33. gigablast简介:
Gigablast 是一种开源的 Web 和企业搜索引擎,也是一种爬虫。Gigablast 是自身维护数十亿页面检索索引的数家美国搜索引擎之一。
特性:C# 编写的开源 Web 爬虫34. 简介:
适用于寻求开源 Web 爬虫的 C# 开发人员。 软件类库从因特网下载内容、对内容做索引,并对过程做定制。用户可使用该工具做个人内容聚合,也可用于将下载的内容抽取、采集和解析为多个表单。 索引所发现的内容,并存储在 Lucene.NET 索引中。 非常适用于文本挖掘,也适用于学习高级爬取技术。
特性:35. Abot简介:
Abot 是一种 C# 实现的开源 Web 爬虫,主要侧重于速度和灵活性。Abot 在实现中考虑了底层技术细节,包括多线程、HTTP 请求、调度、链接解析等。用户只需注册事件,就可以处理分页数据。支持用户插入自己的核心接口实现,实现对整个爬取过程的完全控制。
特性:36. Hawk简介:
HAWK 无需用户做任何编程,提供图形可视化数据获取和清理工具,并以 GPL 协议开源。
特性:37. SkyScraper简介:.NET 编写的 Web 爬虫38. DotnetSpider简介:PHP 编写的开源 Web 爬虫39. Goutte简介:40. Dom-crawler简介:41. Pspider简介:42. Php-spider简介:
一种可配置、可扩展的 Web 爬虫。
特性:43. Spatie / Crawler简介:Ruby 实现的开源 Web 爬虫44. Mechanize简介:GO 编写的开源 Web 爬虫45. Colly简介:
为 Go 爱好者提供了一种快速且适用的爬取框架。Colly 提供了非常清晰的接口,可用于编写任何类型的爬虫和数据获取工具。Colly 使得用户可以轻易地从站点抽取结构化数据。这些数据适用于大范围的应用,例如数据挖掘、数据处理和归档。
特性:46. Gopa特性:47. Pholcus简介:
Pholcus 是一种完全使用 Go 语言实现的高并发性、重量级爬虫软件。它针对因特网数据采集,为只具有基本 Go 或 JavaScript 编程基础的用户提供了一种只需要关注自定义功能的特性。规则简单灵活,并发批处理任务,提供丰富的输出方式,包括 MySQL、MongoDB、Kafka、CSV、Exvel 等。用户共享了大量的演示。此外,Pholcus 支持两种水平和垂直爬取模式,支持模拟登陆、暂停任务、取消任务等一系列高级特性。
特性:R 编写的开源 Web 爬虫48. Rvest简介:Scala 编写的开源 Web 爬虫49. Sparkler简介:
Web 爬虫是一种机器人程序,它从 Web 网站采集资源,用于构建搜索引擎、知识库等应用。Sparkler(“Spark-Crawler”的缩写)是一种新型的 Web 爬虫,它通过整合 Spark、Kafka、Lucene/Solr、Tika、pf4j 等多种 Apache 项目,使用了分布式计算和信息检索领域的最新进展。
特性:Perl 编写的开源 Web 爬虫50. Web-scraper简介:总 结
开源 Web 爬取应用纷繁多样,在此难以一一枚举。每种爬取应用分别各具特长,适用于不同用户的需求。
用户可根据自己的需求和技术要求选取适用的工具。也许用户会从上述工具中做出选择,也许会选择本文列表之外的工具。在实践中,用户只需根据任务的不同做出一个合理的选择,这完全取决于最终用户。其中至关重要的是,用户必须要了解每种工具的独特优势,并利用这些优势服务于用户自身的业务,或是自身所承担的其它任何任务。
欢迎与我们就此开展交流!
查看英文原文:
如果你喜欢这篇文章,或希望看到更多类似优质报道,记得给我留言和点赞哦!
视频下载器你知道吧?那你听说过文章下载器吗?Python来实现!
网站优化 • 优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2022-05-10 13:03
进群:548377875 即可获取数十套PDF哦!还有源码呢!
工具需求:
输入:给定公众号ID,和用户需要获取的公众号文章目录页码数(小于已发布最大收录页数)
( 输出Ⅰ:每个公众号历史文章信息csv文件(链接+标题)
输出Ⅱ: wkhtmltopdf和pdfkit将html转换成PDF文件或者图片文件(初稿)
现有方案
之前在网上也搜索了些爬取微信公众号的资料,大概有如下几种
selenium爬取流程
安装python selenium自动模块,通过selenium中的webdriver驱动浏览器获取Cookie登录微信公众号后台;
使用webdriver功能需要安装对应浏览器的驱动插件
注意:谷歌浏览器版本和chromedriver需要对应,否则会导致启动时报错。
微信公众号登陆地址:
微信公众号文章接口地址可以在微信公众号后台中新建图文消息,超链接功能中获取:
搜索公众号名称
获取要爬取的公众号的fakeid
选定要爬取的公众号,获取文章接口地址
文章列表翻页及内容获取
AnyProxy代理批量采集
Fiddler设置代理和抓包
通过对多个账号进行抓包分析,可以确定:
步骤:
1,写按键精灵脚本,在手机上自动点击公号文章列表页,也就是“查看历史消息”;
2,使用fiddler代理劫持手机端的访问,将网址转发到本地用php写的网页;
3,在php网页上将接收到的网址备份到数据库;
4,用python从数据库取出网址,然后进行正常的爬取。
可能存在的问题:
如果只是想爬取文章内容,似乎并没有访问频率限制,但如果想抓取阅读数、点赞数,超过一定频率后,返回就会变为空值。
付费平台
例如清博 新榜,如果只是想看数据的话,直接看每天的榜单就可以了,还不用花钱,如果需要接入自己的系统的话,他们也提供api接口
3项目步骤
3.1基本原理
目标爬取网站收录了微信平台大部分的优质微信公众号文章,会定期更新,经测试发现对爬虫较为友好。
1、网站页面布局排版规律,不同公众号通过链接中的account区分
2、一个公众号合集下的文章翻页也有规律:id号每翻一页+12
所以流程思路就是
3.5自动跳转页面
以下代码通过循环递增赋值,改变url中的页码参数
3.8生成的PDF结果
4结果展示
5 完整代码
由于考虑到转pdf的稳定性,我在发布版的代码中没有加转PDF的函数。预留了一个粗糙的py源文件,如果感兴趣,读者可以在此基础上自行调整修改。
源码就单独私信,我一个个给你们发! 查看全部
视频下载器你知道吧?那你听说过文章下载器吗?Python来实现!
进群:548377875 即可获取数十套PDF哦!还有源码呢!
工具需求:
输入:给定公众号ID,和用户需要获取的公众号文章目录页码数(小于已发布最大收录页数)
( 输出Ⅰ:每个公众号历史文章信息csv文件(链接+标题)
输出Ⅱ: wkhtmltopdf和pdfkit将html转换成PDF文件或者图片文件(初稿)
现有方案
之前在网上也搜索了些爬取微信公众号的资料,大概有如下几种
selenium爬取流程
安装python selenium自动模块,通过selenium中的webdriver驱动浏览器获取Cookie登录微信公众号后台;
使用webdriver功能需要安装对应浏览器的驱动插件
注意:谷歌浏览器版本和chromedriver需要对应,否则会导致启动时报错。
微信公众号登陆地址:
微信公众号文章接口地址可以在微信公众号后台中新建图文消息,超链接功能中获取:
搜索公众号名称
获取要爬取的公众号的fakeid
选定要爬取的公众号,获取文章接口地址
文章列表翻页及内容获取
AnyProxy代理批量采集
Fiddler设置代理和抓包
通过对多个账号进行抓包分析,可以确定:
步骤:
1,写按键精灵脚本,在手机上自动点击公号文章列表页,也就是“查看历史消息”;
2,使用fiddler代理劫持手机端的访问,将网址转发到本地用php写的网页;
3,在php网页上将接收到的网址备份到数据库;
4,用python从数据库取出网址,然后进行正常的爬取。
可能存在的问题:
如果只是想爬取文章内容,似乎并没有访问频率限制,但如果想抓取阅读数、点赞数,超过一定频率后,返回就会变为空值。
付费平台
例如清博 新榜,如果只是想看数据的话,直接看每天的榜单就可以了,还不用花钱,如果需要接入自己的系统的话,他们也提供api接口
3项目步骤
3.1基本原理
目标爬取网站收录了微信平台大部分的优质微信公众号文章,会定期更新,经测试发现对爬虫较为友好。
1、网站页面布局排版规律,不同公众号通过链接中的account区分
2、一个公众号合集下的文章翻页也有规律:id号每翻一页+12
所以流程思路就是
3.5自动跳转页面
以下代码通过循环递增赋值,改变url中的页码参数
3.8生成的PDF结果
4结果展示
5 完整代码
由于考虑到转pdf的稳定性,我在发布版的代码中没有加转PDF的函数。预留了一个粗糙的py源文件,如果感兴趣,读者可以在此基础上自行调整修改。
源码就单独私信,我一个个给你们发!
对网站进行归档 | Linux 中国
网站优化 • 优采云 发表了文章 • 0 个评论 • 213 次浏览 • 2022-05-10 12:55
本文介绍了对传统网站进行归档的过程,并阐述在面对最新流行单页面应用程序(SPA)的现代网站时,它有哪些不足。-- Anarcat
有用的原文链接请访问文末的“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。
致谢编译自|
作者|Anarcat
译者|fuowang 共计翻译:12.0篇 贡献时间:763 天
我最近深入研究了网站归档,因为有些朋友担心遇到糟糕的系统管理或恶意删除时失去对放在网上的内容的控制权。这使得网站归档成为系统管理员工具箱中的重要工具。事实证明,有些网站比其他网站更难归档。本文介绍了对传统网站进行归档的过程,并阐述在面对最新流行单页面应用程序(SPA)的现代网站时,它有哪些不足。
转换为简单网站
手动编码 HTML 网站的日子早已不复存在。现在的网站是动态的,并使用最新的 JavaScript、PHP 或 Python 框架即时构建。结果,这些网站更加脆弱:数据库崩溃、升级出错或者未修复的漏洞都可能使数据丢失。在我以前是一名 Web 开发人员时,我不得不接受客户这样的想法:希望网站基本上可以永久工作。这种期望与 web 开发“快速行动和破除陈规”的理念不相符。在这方面,使用Drupal[1]内容管理系统(CMS)尤其具有挑战性,因为重大更新会破坏与第三方模块的兼容性,这意味着客户很少承担的起高昂的升级成本。解决方案是将这些网站归档:以实时动态的网站为基础,将其转换为任何 web 服务器可以永久服务的纯 HTML 文件。此过程对你自己的动态网站非常有用,也适用于你想保护但无法控制的第三方网站。
对于简单的静态网站,古老的Wget[2]程序就可以胜任。然而镜像保存一个完整网站的命令却是错综复杂的:
<p>$ nice wget --mirror --execute robots=off --no-verbose --convert-links \
--backup-converted --page-requisites --adjust-extension \
--base=./ --directory-prefix=./ --span-hosts \
--domains=www.example.com,example.com http://www.example.com/</p>
以上命令下载了网页的内容,也抓取了指定域名中的所有内容。在对你喜欢的网站执行此操作之前,请考虑此类抓取可能对网站产生的影响。上面的命令故意忽略了robots.txt规则,就像现在归档者的习惯做法[3],并以尽可能快的速度归档网站。大多数抓取工具都可以选择在两次抓取间暂停并限制带宽使用,以避免使网站瘫痪。
上面的命令还将获取 “页面所需(LCTT 译注:单页面所需的所有元素)”,如样式表(CSS)、图像和脚本等。下载的页面内容将会被修改,以便链接也指向本地副本。任何 web 服务器均可托管生成的文件集,从而生成原始网站的静态副本。
以上所述是事情一切顺利的时候。任何使用过计算机的人都知道事情的进展很少如计划那样;各种各样的事情可以使程序以有趣的方式脱离正轨。比如,在网站上有一段时间很流行日历块。内容管理系统会动态生成这些内容,这会使爬虫程序陷入死循环以尝试检索所有页面。灵巧的归档者可以使用正则表达式(例如 Wget 有一个--reject-regex选项)来忽略有问题的资源。如果可以访问网站的管理界面,另一个方法是禁用日历、登录表单、评论表单和其他动态区域。一旦网站变成静态的,(那些动态区域)也肯定会停止工作,因此从原始网站中移除这些杂乱的东西也不是全无意义。
JavaScript 噩梦
很不幸,有些网站不仅仅是纯 HTML 文件构建的。比如,在单页面网站中,web 浏览器通过执行一个小的 JavaScript 程序来构建内容。像 Wget 这样的简单用户代理将难以重建这些网站的有意义的静态副本,因为它根本不支持 JavaScript。理论上,网站应该使用渐进增强[4]技术,在不使用 JavaScript 的情况下提供内容和实现功能,但这些指引很少被人遵循 —— 使用过NoScript[5]或uMatrix[6]等插件的人都知道。
传统的归档方法有时会以最愚蠢的方式失败。在尝试为一个本地报纸网站(pamplemousse.ca[7])创建备份时,我发现 WordPress 在包含 的 JavaScript 末尾添加了查询字符串(例如:?ver=1.12.4)。这会使提供归档服务的 web 服务器不能正确进行内容类型检测,因为其靠文件扩展名来发送正确的Content-Type头部信息。在 web 浏览器加载此类归档时,这些脚本会加载失败,导致动态网站受损。
随着 web 向使用浏览器作为执行任意代码的虚拟机转化,依赖于纯 HTML 文件解析的归档方法也需要随之适应。这个问题的解决方案是在抓取时记录(以及重现)服务器提供的 HTTP 头部信息,实际上专业的归档者就使用这种方法。
创建和显示 WARC 文件
在互联网档案馆Internet Archive[8]网站,Brewster Kahle 和 Mike Burner 在 1996 年设计了ARC[9](即 “ARChive”)文件格式,以提供一种聚合其归档工作所产生的百万个小文件的方法。该格式最终标准化为 WARC(“Web ARChive”)规范[10],并在 2009 年作为 ISO 标准发布,2017 年修订。标准化工作由国际互联网保护联盟International Internet Preservation Consortium[11](IIPC)领导,据维基百科称,这是一个“为了协调为未来而保护互联网内容的努力而成立的国际图书馆组织和其他组织”;它的成员包括美国国会图书馆US Library of Congress和互联网档案馆等。后者在其基于 Java 的Heritrix crawler[12](LCTT 译注:一种爬虫程序)内部使用了 WARC 格式。
WARC 在单个压缩文件中聚合了多种资源,像 HTTP 头部信息、文件内容,以及其他元数据。方便的是,Wget 实际上提供了--warc参数来支持 WARC 格式。不幸的是,web 浏览器不能直接显示 WARC 文件,所以为了访问归档文件,一个查看器或某些格式转换是很有必要的。我所发现的最简单的查看器是pywb[13],它以 Python 包的形式运行一个简单的 web 服务器提供一个像“时光倒流机网站Wayback Machine”的界面,来浏览 WARC 文件的内容。执行以下命令将会在:8080/地址显示 WARC 文件的内容:
<p>$ pip install pywb
$ wb-manager init example
$ wb-manager add example crawl.warc.gz
$ wayback</p>
顺便说一句,这个工具是由Webrecorder[14]服务提供者建立的,Webrecoder 服务可以使用 web 浏览器保存动态页面的内容。
很不幸,pywb 无法加载 Wget 生成的 WARC 文件,因为它遵循[15]的1.0 规范不一致[16],1.1 规范修复了此问题[16]。就算 Wget 或 pywb 修复了这些问题,Wget 生成的 WARC 文件对我的使用来说不够可靠,所以我找了其他的替代品。引起我注意的爬虫程序简称crawl[17]。以下是它的调用方式:
<p>$ crawl https://example.com/</p>
(它的 README 文件说“非常简单”。)该程序支持一些命令行参数选项,但大多数默认值都是最佳的:它会从其他域获取页面所需(除非使用-exclude-related参数),但肯定不会递归出域。默认情况下,它会与远程站点建立十个并发连接,这个值可以使用-c参数更改。但是,最重要的是,生成的 WARC 文件可以使用 pywb 完美加载。
未来的工作和替代方案
这里还有更多有关使用 WARC 文件的资源[18]。特别要提的是,这里有一个专门用来归档网站的 Wget 的直接替代品,叫做Wpull[19]。它实验性地支持了PhantomJS[20]和youtube-dl[21]的集成,即允许分别下载更复杂的 JavaScript 页面以及流媒体。该程序是一个叫做ArchiveBot[22]的复杂归档工具的基础,ArchiveBot 被那些在ArchiveTeam[23]的“零散离群的归档者、程序员、作家以及演说家”使用,他们致力于“在历史永远丢失之前保存它们”。集成 PhantomJS 好像并没有如团队期望的那样良好工作,所以 ArchiveTeam 也用其它零散的工具来镜像保存更复杂的网站。例如,snscrape[24]将抓取一个社交媒体配置文件以生成要发送到 ArchiveBot 的页面列表。该团队使用的另一个工具是crocoite[25],它使用无头模式的 Chrome 浏览器来归档 JavaScript 较多的网站。
如果没有提到称做“网站复制者”的HTTrack[26]项目,那么这篇文章算不上完整。它工作方式和 Wget 相似,HTTrack 可以对远程站点创建一个本地的副本,但是不幸的是它不支持输出 WRAC 文件。对于不熟悉命令行的小白用户来说,它在人机交互方面显得更有价值。
同样,在我的研究中,我发现了叫做Wget2[27]的 Wget 的完全重制版本,它支持多线程操作,这可能使它比前身更快。和 Wget 相比,它舍弃了一些功能[28],但是最值得注意的是拒绝模式、WARC 输出以及 FTP 支持,并增加了 RSS、DNS 缓存以及改进的 TLS 支持。
最后,我个人对这些工具的愿景是将它们与我现有的书签系统集成起来。目前我在Wallabag[29]中保留了一些有趣的链接,这是一种自托管式的“稍后阅读”服务,意在成为Pocket[30](现在由 Mozilla 拥有)的免费替代品。但是 Wallabag 在设计上只保留了文章的“可读”副本,而不是一个完整的拷贝。在某些情况下,“可读版本”实际上不可读[31],并且 Wallabag 有时无法解析文章[32]。恰恰相反,像bookmark-archiver[33]或reminiscence[34]这样其他的工具会保存页面的屏幕截图以及完整的 HTML 文件,但遗憾的是,它没有 WRAC 文件所以没有办法更可信的重现网页内容。
我所经历的有关镜像保存和归档的悲剧就是死数据。幸运的是,业余的归档者可以利用工具将有趣的内容保存到网上。对于那些不想麻烦的人来说,“互联网档案馆”看起来仍然在那里,并且 ArchiveTeam 显然正在为互联网档案馆本身做备份[35]。
via:
作者:Anarcat[37]选题:lujun9972译者:fuowang校对:wxy
本文由LCTT原创编译,Linux中国荣誉推出 查看全部
对网站进行归档 | Linux 中国
本文介绍了对传统网站进行归档的过程,并阐述在面对最新流行单页面应用程序(SPA)的现代网站时,它有哪些不足。-- Anarcat
有用的原文链接请访问文末的“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。
致谢编译自|
作者|Anarcat
译者|fuowang 共计翻译:12.0篇 贡献时间:763 天
我最近深入研究了网站归档,因为有些朋友担心遇到糟糕的系统管理或恶意删除时失去对放在网上的内容的控制权。这使得网站归档成为系统管理员工具箱中的重要工具。事实证明,有些网站比其他网站更难归档。本文介绍了对传统网站进行归档的过程,并阐述在面对最新流行单页面应用程序(SPA)的现代网站时,它有哪些不足。
转换为简单网站
手动编码 HTML 网站的日子早已不复存在。现在的网站是动态的,并使用最新的 JavaScript、PHP 或 Python 框架即时构建。结果,这些网站更加脆弱:数据库崩溃、升级出错或者未修复的漏洞都可能使数据丢失。在我以前是一名 Web 开发人员时,我不得不接受客户这样的想法:希望网站基本上可以永久工作。这种期望与 web 开发“快速行动和破除陈规”的理念不相符。在这方面,使用Drupal[1]内容管理系统(CMS)尤其具有挑战性,因为重大更新会破坏与第三方模块的兼容性,这意味着客户很少承担的起高昂的升级成本。解决方案是将这些网站归档:以实时动态的网站为基础,将其转换为任何 web 服务器可以永久服务的纯 HTML 文件。此过程对你自己的动态网站非常有用,也适用于你想保护但无法控制的第三方网站。
对于简单的静态网站,古老的Wget[2]程序就可以胜任。然而镜像保存一个完整网站的命令却是错综复杂的:
<p>$ nice wget --mirror --execute robots=off --no-verbose --convert-links \
--backup-converted --page-requisites --adjust-extension \
--base=./ --directory-prefix=./ --span-hosts \
--domains=www.example.com,example.com http://www.example.com/</p>
以上命令下载了网页的内容,也抓取了指定域名中的所有内容。在对你喜欢的网站执行此操作之前,请考虑此类抓取可能对网站产生的影响。上面的命令故意忽略了robots.txt规则,就像现在归档者的习惯做法[3],并以尽可能快的速度归档网站。大多数抓取工具都可以选择在两次抓取间暂停并限制带宽使用,以避免使网站瘫痪。
上面的命令还将获取 “页面所需(LCTT 译注:单页面所需的所有元素)”,如样式表(CSS)、图像和脚本等。下载的页面内容将会被修改,以便链接也指向本地副本。任何 web 服务器均可托管生成的文件集,从而生成原始网站的静态副本。
以上所述是事情一切顺利的时候。任何使用过计算机的人都知道事情的进展很少如计划那样;各种各样的事情可以使程序以有趣的方式脱离正轨。比如,在网站上有一段时间很流行日历块。内容管理系统会动态生成这些内容,这会使爬虫程序陷入死循环以尝试检索所有页面。灵巧的归档者可以使用正则表达式(例如 Wget 有一个--reject-regex选项)来忽略有问题的资源。如果可以访问网站的管理界面,另一个方法是禁用日历、登录表单、评论表单和其他动态区域。一旦网站变成静态的,(那些动态区域)也肯定会停止工作,因此从原始网站中移除这些杂乱的东西也不是全无意义。
JavaScript 噩梦
很不幸,有些网站不仅仅是纯 HTML 文件构建的。比如,在单页面网站中,web 浏览器通过执行一个小的 JavaScript 程序来构建内容。像 Wget 这样的简单用户代理将难以重建这些网站的有意义的静态副本,因为它根本不支持 JavaScript。理论上,网站应该使用渐进增强[4]技术,在不使用 JavaScript 的情况下提供内容和实现功能,但这些指引很少被人遵循 —— 使用过NoScript[5]或uMatrix[6]等插件的人都知道。
传统的归档方法有时会以最愚蠢的方式失败。在尝试为一个本地报纸网站(pamplemousse.ca[7])创建备份时,我发现 WordPress 在包含 的 JavaScript 末尾添加了查询字符串(例如:?ver=1.12.4)。这会使提供归档服务的 web 服务器不能正确进行内容类型检测,因为其靠文件扩展名来发送正确的Content-Type头部信息。在 web 浏览器加载此类归档时,这些脚本会加载失败,导致动态网站受损。
随着 web 向使用浏览器作为执行任意代码的虚拟机转化,依赖于纯 HTML 文件解析的归档方法也需要随之适应。这个问题的解决方案是在抓取时记录(以及重现)服务器提供的 HTTP 头部信息,实际上专业的归档者就使用这种方法。
创建和显示 WARC 文件
在互联网档案馆Internet Archive[8]网站,Brewster Kahle 和 Mike Burner 在 1996 年设计了ARC[9](即 “ARChive”)文件格式,以提供一种聚合其归档工作所产生的百万个小文件的方法。该格式最终标准化为 WARC(“Web ARChive”)规范[10],并在 2009 年作为 ISO 标准发布,2017 年修订。标准化工作由国际互联网保护联盟International Internet Preservation Consortium[11](IIPC)领导,据维基百科称,这是一个“为了协调为未来而保护互联网内容的努力而成立的国际图书馆组织和其他组织”;它的成员包括美国国会图书馆US Library of Congress和互联网档案馆等。后者在其基于 Java 的Heritrix crawler[12](LCTT 译注:一种爬虫程序)内部使用了 WARC 格式。
WARC 在单个压缩文件中聚合了多种资源,像 HTTP 头部信息、文件内容,以及其他元数据。方便的是,Wget 实际上提供了--warc参数来支持 WARC 格式。不幸的是,web 浏览器不能直接显示 WARC 文件,所以为了访问归档文件,一个查看器或某些格式转换是很有必要的。我所发现的最简单的查看器是pywb[13],它以 Python 包的形式运行一个简单的 web 服务器提供一个像“时光倒流机网站Wayback Machine”的界面,来浏览 WARC 文件的内容。执行以下命令将会在:8080/地址显示 WARC 文件的内容:
<p>$ pip install pywb
$ wb-manager init example
$ wb-manager add example crawl.warc.gz
$ wayback</p>
顺便说一句,这个工具是由Webrecorder[14]服务提供者建立的,Webrecoder 服务可以使用 web 浏览器保存动态页面的内容。
很不幸,pywb 无法加载 Wget 生成的 WARC 文件,因为它遵循[15]的1.0 规范不一致[16],1.1 规范修复了此问题[16]。就算 Wget 或 pywb 修复了这些问题,Wget 生成的 WARC 文件对我的使用来说不够可靠,所以我找了其他的替代品。引起我注意的爬虫程序简称crawl[17]。以下是它的调用方式:
<p>$ crawl https://example.com/</p>
(它的 README 文件说“非常简单”。)该程序支持一些命令行参数选项,但大多数默认值都是最佳的:它会从其他域获取页面所需(除非使用-exclude-related参数),但肯定不会递归出域。默认情况下,它会与远程站点建立十个并发连接,这个值可以使用-c参数更改。但是,最重要的是,生成的 WARC 文件可以使用 pywb 完美加载。
未来的工作和替代方案
这里还有更多有关使用 WARC 文件的资源[18]。特别要提的是,这里有一个专门用来归档网站的 Wget 的直接替代品,叫做Wpull[19]。它实验性地支持了PhantomJS[20]和youtube-dl[21]的集成,即允许分别下载更复杂的 JavaScript 页面以及流媒体。该程序是一个叫做ArchiveBot[22]的复杂归档工具的基础,ArchiveBot 被那些在ArchiveTeam[23]的“零散离群的归档者、程序员、作家以及演说家”使用,他们致力于“在历史永远丢失之前保存它们”。集成 PhantomJS 好像并没有如团队期望的那样良好工作,所以 ArchiveTeam 也用其它零散的工具来镜像保存更复杂的网站。例如,snscrape[24]将抓取一个社交媒体配置文件以生成要发送到 ArchiveBot 的页面列表。该团队使用的另一个工具是crocoite[25],它使用无头模式的 Chrome 浏览器来归档 JavaScript 较多的网站。
如果没有提到称做“网站复制者”的HTTrack[26]项目,那么这篇文章算不上完整。它工作方式和 Wget 相似,HTTrack 可以对远程站点创建一个本地的副本,但是不幸的是它不支持输出 WRAC 文件。对于不熟悉命令行的小白用户来说,它在人机交互方面显得更有价值。
同样,在我的研究中,我发现了叫做Wget2[27]的 Wget 的完全重制版本,它支持多线程操作,这可能使它比前身更快。和 Wget 相比,它舍弃了一些功能[28],但是最值得注意的是拒绝模式、WARC 输出以及 FTP 支持,并增加了 RSS、DNS 缓存以及改进的 TLS 支持。
最后,我个人对这些工具的愿景是将它们与我现有的书签系统集成起来。目前我在Wallabag[29]中保留了一些有趣的链接,这是一种自托管式的“稍后阅读”服务,意在成为Pocket[30](现在由 Mozilla 拥有)的免费替代品。但是 Wallabag 在设计上只保留了文章的“可读”副本,而不是一个完整的拷贝。在某些情况下,“可读版本”实际上不可读[31],并且 Wallabag 有时无法解析文章[32]。恰恰相反,像bookmark-archiver[33]或reminiscence[34]这样其他的工具会保存页面的屏幕截图以及完整的 HTML 文件,但遗憾的是,它没有 WRAC 文件所以没有办法更可信的重现网页内容。
我所经历的有关镜像保存和归档的悲剧就是死数据。幸运的是,业余的归档者可以利用工具将有趣的内容保存到网上。对于那些不想麻烦的人来说,“互联网档案馆”看起来仍然在那里,并且 ArchiveTeam 显然正在为互联网档案馆本身做备份[35]。
via:
作者:Anarcat[37]选题:lujun9972译者:fuowang校对:wxy
本文由LCTT原创编译,Linux中国荣誉推出
【分享吧】基于GO语言的爬虫框架在互联网项目中的应用
网站优化 • 优采云 发表了文章 • 0 个评论 • 116 次浏览 • 2022-05-08 22:04
产品的爬虫框架设计之初,仅仅是为了爬取资讯。但是随着产品覆盖信息的扩大,爬虫的目标范围和需要支持的功能也在不断地进行扩展和复杂化。截至目前我们产品中的爬虫系统已经具备了高并发,高可用和高可扩展性的特点,可以利用很小的开发成本,就完成所有新增的需求。本文我们从基本概念为切入点,简单介绍一下目前主流的爬虫框架及特点,最终将项目中使用的爬虫框架结构,以及做了哪些优化和定制介绍给大家。希望能够让大家对网络爬虫有一个清楚的认识。
一、什么是爬虫
1
概念
网络爬虫是一种按照一定的规则,自动地抓取万维网(www)信息的程序或者脚本。是搜索引擎的一个重要组成部分。
通过爬虫软件更新自身的网站内容或其他网站的索引。网络爬虫可以将自己所访问的页面保存下来,以便搜索引擎事后生成索引供用户搜索。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件;定向爬虫则可以根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。以此来避免重复及不相关的页面被搜索到。
图1-1 工作原理
2
分类和目前主流爬虫
网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型(实际的网络爬虫系统通常是几种爬虫技术相结合实现的):
① 通用爬虫:爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低;
② 定向爬虫:选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求;
③ 增量爬虫:对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度;
④ 深层爬虫:对深层网页的爬取。深层网页是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。例如那些用户注册后内容才可见的网页就属于这个范畴。
网络爬虫诞生之初,大都是由解释型脚本语言编写(主要是python)。但随着互联网的高速发展,各主流开发语言基本都出现了一些出色的爬虫框架。整理了目前业内比较有名的框架如下:
✱ Scrapy(Python):一个快速、高效且易扩展的爬虫框架。可快速整合到python主流的web应用框架,并且能够使用redis等中间件快速搭建起分布式集群;
✱ Pyspider(Python):功能强大的爬虫框架,有自己的web UI;
✱ Apache Nutch(Java):灵活及高可扩展的爬虫框架;
✱ Crawler4j(Java):简单易用、轻量级的网络爬虫;
✱ Scraperjs(JS):高可用,功能强大的网络爬虫;
✱ node-crawler(JS):封装了简单易用的API;
✱ Goutte(PHP):可快速整合到Laravel引用框架;
✱ Pholcus(GO):分布式、高并发的强大爬虫,可通过web UI配置爬取策略(扩展性较差);
✱ go_spider(GO):一个出色,并且支持高并发的爬虫。扩展性强。
二、我们的爬虫
1
技术选型
文章开头的时候我们提到过产品的爬虫功能原始需求,主要是抓取新闻资讯。这样就要求爬虫必须具备以下功能:
1. 增量提取(已抓取的资讯不能重复抓取);
2. 页面指纹去重(存在url不同,但是内容完全相同的资讯,要识别出这部分资讯,避免重复抓取);
3. 翻页递归提取(资讯都是分页展示,要支持翻页抓取);
4. 定时提取(常驻内存爬虫进程浪费资源,需要能够定时运行爬虫)。
根据以上需求,项目的爬虫初版选用scrapy框架来实现,可以很好地满足业务需要。但是考虑到项目组成员熟悉python的比例不高,并且scrapy也需要一定的学习成本,新的开发人员无法快速熟悉代码并开发新功能。从2.0版本开始,重构采用go语言来实现爬虫系统。我们选择的就是上面提到的go_spider框架,主要考虑到的也是它的高可扩展性,方便我们做个性化开发及优化。从目前的效果来看还是很不错的,它的框架原型功能结构如下图:
图2-1 go_spider框架原型
2
定制化开发与优化
从上图中可以看到,go_spider框架本身优雅地分解了爬虫中各个模块,每部分只要专注自己的工作,最后由框架整合到一起完成爬虫功能。它本身支持高并发。但是结合上面的需求来看,通用的go_spider框架并不能满足我们的全部需求,比如增量和翻页抓取等功能都无法完全自动化来实现。所以,我们根据实际需求做了如下的扩展(蓝色部分为扩展与优化的功能点):
图2-2扩展优化后的框架
1. 规则引擎
参照业内应用最广泛,且表现出色的Python Scrapy框架的规则设计理念。自主开发了规则解析引擎,最大程度抽象出业务以外的代码处理。每新增一个爬虫的时候,理论上我们只需要配置相应的规则及页面解析代码,框架就可以自动去实现递归爬取相应链接、解析内容、提交入库等操作。支持的规则配置项包括但不限于:
✱ Allow:正则表达式,当匹配到元素时,发起新的请求,进入下一次递归;
✱ Callback:回调函数名,当匹配到相应元素,就将该页面的DOM传递给回调函数,进行页面内容的抓取;
✱ Restrict_selector:HTML选择器,当前页面中要匹配的元素(一般这个元素都是包含href属性,可以交给Deny或Allow进行匹配的);
✱ Attrs:一般默认我们都是访问元素的href属性,当配置了这个内容以后,可以从指定的属性中读取属性值;
✱ IsResource:bool,特殊配置,针对那些指向的内容为资源文件的链接抓取。(如XLSX、PDF、PPT和视频等);
✱ Method:默认发起的网络请求都是GET方式,但针对一些深层页面,需要支持表单提交后返回。这里可以通过制定该属性的值为“POST”来实现表单提交;
✱ PostData:当指定POST表单请求时,可以通过该属性设定表单的值。
图2-3规则配置样例
2. 增量提取
在scheduler将网页请求插入请求队列以前,需要识别该请求是否已经抓取过。典型的key-value应用场景,但是每个爬虫要发起的网页请求可能达到几千甚至上万,所以该识别处理的运行速度一定要快,而且需要持久化处理。go_spider框架的任务队列默认是在内存中维护的,没有持久化操作,在异常退出或是重启时无法记录之前的爬取位置。为了保证该部分内存管理的高可用及稳定性,我们选择了成熟的内存数据库中间件redis来保存这些已经爬取的状态数据。Key就是页面请求的url、Value为数字1,可以实现随机访问,且避免了因为递归层级增多而导致的内存泄漏问题。
3. 指纹去重
已经具备上述url增量前提下,基本上不会出现重复爬取情况的出现。但是在实际过程中,确实存在url不同,但是内容却完全相同的网页。所以对我们就提出了一个全新的要求,就是如何快速识别出每一个网页的唯一标识呢?我们采取的主要是以下两种方式:
✱ “资讯标题+发布时间”转换成MD5编码;
✱ 页面全文转换成MD5编码;
实际使用中前者的比例会更高。MD5编码也是业内最常用的内容校验编码方式之一,在转码速度和内存消耗上有一个很好的平衡。指纹的生成策略方式是完全开放给开发者的,它是通过规则引擎的“FingerInput”属性来指定的,可以传入一个函数名,框架会自动调用该函数来获取指纹的定义。同样它也会被保存到redis中来使用。
图2-4指纹配置样例
4. 其他优化
针对既有框架,以及不断增加的业务需求,做了很多框架优化的工作。举例如下:
✱ 数据库连接池:原型框架的官方文档给出的示例是在pipeline中创建数据库连接,执行DML之后,就直接释放该连接。在我们实际应用场景中单次执行的爬虫数量非常庞大,如果采用上面的方式就会造成很多资源的消耗,并且影响整体性能。所以这里引入数据库连接池,在整个框架中是以单例模式的实例被使用,在每次执行DML之后,会将该连接释放回连接池,其他爬虫可以继续使用;
✱ 数据库pipeline共享:高度抽象了SQL语句代码的生成及执行,对于开发者来说,我们只需要在创建爬虫时传入一个数据库表名,并且在callback函数中将想要插入的字段值通过Page.AddField函数设定到参数实例中。框架就可以自动生成SQL并将数据插入数据库。这样所有爬虫可以共用一个pipeline,而不需要重复编写该部分代码 。
✱ 命令模式:可以通过在启动爬虫应用程序时,传入不同的参数来控制爬虫的运行频率,以及开关增量爬取去重处理(针对发起POST请求的URL是不能插入到redis去重数据队列的,否则就只能请求一次,第二次以后都会被去重机制阻断)等操作。好处是通过参数配置可以运行一个行为完全不同的爬虫,避免了维护多个应用程序带来的高昂成本。
三、未来展望
任何一个好的产品都不是一蹴而就的,基本需要在一个原型基础上,通过不断的扩展和优化,使其功能和性能达到一个极致。我们的爬虫框架也经历了这样一个历程,从代码重构,到各种个性化的性能优化和框架改进,使该框架已经可以很好地为我们的产品服务。但这并不是终点,未来我们还要从以下几个方面继续推动爬虫框架的发展:
✱ 动态JS渲染:有些页面中的数据,是需要经过JS渲染后才能够显示。目前我们遇到类似的业务场景,也都是采取直接从数据源头进行解析,进而绕开了JS渲染的处理。在未来我们考虑引入“JS解释器”来融合到框架中来解决该问题,可以预想到需要解决的问题还有很多;
✱ 支持分布式:如果要实现一个功能强大的爬虫系统,分布式是必须要解决的问题,尤其是在大数据分析场景下。未来我们也考虑引用zookeeper中间件,并且选定一个合适的分布式文件系统来支持任务的水平和垂直拆分;
✱ 平台化:我们的远期目标是将爬虫系统的功能和性能做到极致,然后优化封装和接口的设计。使该框架可以快速整合到公司其他爬虫应用场景的项目中去。也希望有兴趣的同事能多给提出意见或者一起讨论。
[参照资料]
网络爬虫/
查看全部
【分享吧】基于GO语言的爬虫框架在互联网项目中的应用
产品的爬虫框架设计之初,仅仅是为了爬取资讯。但是随着产品覆盖信息的扩大,爬虫的目标范围和需要支持的功能也在不断地进行扩展和复杂化。截至目前我们产品中的爬虫系统已经具备了高并发,高可用和高可扩展性的特点,可以利用很小的开发成本,就完成所有新增的需求。本文我们从基本概念为切入点,简单介绍一下目前主流的爬虫框架及特点,最终将项目中使用的爬虫框架结构,以及做了哪些优化和定制介绍给大家。希望能够让大家对网络爬虫有一个清楚的认识。
一、什么是爬虫
1
概念
网络爬虫是一种按照一定的规则,自动地抓取万维网(www)信息的程序或者脚本。是搜索引擎的一个重要组成部分。
通过爬虫软件更新自身的网站内容或其他网站的索引。网络爬虫可以将自己所访问的页面保存下来,以便搜索引擎事后生成索引供用户搜索。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件;定向爬虫则可以根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。以此来避免重复及不相关的页面被搜索到。
图1-1 工作原理
2
分类和目前主流爬虫
网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型(实际的网络爬虫系统通常是几种爬虫技术相结合实现的):
① 通用爬虫:爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低;
② 定向爬虫:选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求;
③ 增量爬虫:对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度;
④ 深层爬虫:对深层网页的爬取。深层网页是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。例如那些用户注册后内容才可见的网页就属于这个范畴。
网络爬虫诞生之初,大都是由解释型脚本语言编写(主要是python)。但随着互联网的高速发展,各主流开发语言基本都出现了一些出色的爬虫框架。整理了目前业内比较有名的框架如下:
✱ Scrapy(Python):一个快速、高效且易扩展的爬虫框架。可快速整合到python主流的web应用框架,并且能够使用redis等中间件快速搭建起分布式集群;
✱ Pyspider(Python):功能强大的爬虫框架,有自己的web UI;
✱ Apache Nutch(Java):灵活及高可扩展的爬虫框架;
✱ Crawler4j(Java):简单易用、轻量级的网络爬虫;
✱ Scraperjs(JS):高可用,功能强大的网络爬虫;
✱ node-crawler(JS):封装了简单易用的API;
✱ Goutte(PHP):可快速整合到Laravel引用框架;
✱ Pholcus(GO):分布式、高并发的强大爬虫,可通过web UI配置爬取策略(扩展性较差);
✱ go_spider(GO):一个出色,并且支持高并发的爬虫。扩展性强。
二、我们的爬虫
1
技术选型
文章开头的时候我们提到过产品的爬虫功能原始需求,主要是抓取新闻资讯。这样就要求爬虫必须具备以下功能:
1. 增量提取(已抓取的资讯不能重复抓取);
2. 页面指纹去重(存在url不同,但是内容完全相同的资讯,要识别出这部分资讯,避免重复抓取);
3. 翻页递归提取(资讯都是分页展示,要支持翻页抓取);
4. 定时提取(常驻内存爬虫进程浪费资源,需要能够定时运行爬虫)。
根据以上需求,项目的爬虫初版选用scrapy框架来实现,可以很好地满足业务需要。但是考虑到项目组成员熟悉python的比例不高,并且scrapy也需要一定的学习成本,新的开发人员无法快速熟悉代码并开发新功能。从2.0版本开始,重构采用go语言来实现爬虫系统。我们选择的就是上面提到的go_spider框架,主要考虑到的也是它的高可扩展性,方便我们做个性化开发及优化。从目前的效果来看还是很不错的,它的框架原型功能结构如下图:
图2-1 go_spider框架原型
2
定制化开发与优化
从上图中可以看到,go_spider框架本身优雅地分解了爬虫中各个模块,每部分只要专注自己的工作,最后由框架整合到一起完成爬虫功能。它本身支持高并发。但是结合上面的需求来看,通用的go_spider框架并不能满足我们的全部需求,比如增量和翻页抓取等功能都无法完全自动化来实现。所以,我们根据实际需求做了如下的扩展(蓝色部分为扩展与优化的功能点):
图2-2扩展优化后的框架
1. 规则引擎
参照业内应用最广泛,且表现出色的Python Scrapy框架的规则设计理念。自主开发了规则解析引擎,最大程度抽象出业务以外的代码处理。每新增一个爬虫的时候,理论上我们只需要配置相应的规则及页面解析代码,框架就可以自动去实现递归爬取相应链接、解析内容、提交入库等操作。支持的规则配置项包括但不限于:
✱ Allow:正则表达式,当匹配到元素时,发起新的请求,进入下一次递归;
✱ Callback:回调函数名,当匹配到相应元素,就将该页面的DOM传递给回调函数,进行页面内容的抓取;
✱ Restrict_selector:HTML选择器,当前页面中要匹配的元素(一般这个元素都是包含href属性,可以交给Deny或Allow进行匹配的);
✱ Attrs:一般默认我们都是访问元素的href属性,当配置了这个内容以后,可以从指定的属性中读取属性值;
✱ IsResource:bool,特殊配置,针对那些指向的内容为资源文件的链接抓取。(如XLSX、PDF、PPT和视频等);
✱ Method:默认发起的网络请求都是GET方式,但针对一些深层页面,需要支持表单提交后返回。这里可以通过制定该属性的值为“POST”来实现表单提交;
✱ PostData:当指定POST表单请求时,可以通过该属性设定表单的值。
图2-3规则配置样例
2. 增量提取
在scheduler将网页请求插入请求队列以前,需要识别该请求是否已经抓取过。典型的key-value应用场景,但是每个爬虫要发起的网页请求可能达到几千甚至上万,所以该识别处理的运行速度一定要快,而且需要持久化处理。go_spider框架的任务队列默认是在内存中维护的,没有持久化操作,在异常退出或是重启时无法记录之前的爬取位置。为了保证该部分内存管理的高可用及稳定性,我们选择了成熟的内存数据库中间件redis来保存这些已经爬取的状态数据。Key就是页面请求的url、Value为数字1,可以实现随机访问,且避免了因为递归层级增多而导致的内存泄漏问题。
3. 指纹去重
已经具备上述url增量前提下,基本上不会出现重复爬取情况的出现。但是在实际过程中,确实存在url不同,但是内容却完全相同的网页。所以对我们就提出了一个全新的要求,就是如何快速识别出每一个网页的唯一标识呢?我们采取的主要是以下两种方式:
✱ “资讯标题+发布时间”转换成MD5编码;
✱ 页面全文转换成MD5编码;
实际使用中前者的比例会更高。MD5编码也是业内最常用的内容校验编码方式之一,在转码速度和内存消耗上有一个很好的平衡。指纹的生成策略方式是完全开放给开发者的,它是通过规则引擎的“FingerInput”属性来指定的,可以传入一个函数名,框架会自动调用该函数来获取指纹的定义。同样它也会被保存到redis中来使用。
图2-4指纹配置样例
4. 其他优化
针对既有框架,以及不断增加的业务需求,做了很多框架优化的工作。举例如下:
✱ 数据库连接池:原型框架的官方文档给出的示例是在pipeline中创建数据库连接,执行DML之后,就直接释放该连接。在我们实际应用场景中单次执行的爬虫数量非常庞大,如果采用上面的方式就会造成很多资源的消耗,并且影响整体性能。所以这里引入数据库连接池,在整个框架中是以单例模式的实例被使用,在每次执行DML之后,会将该连接释放回连接池,其他爬虫可以继续使用;
✱ 数据库pipeline共享:高度抽象了SQL语句代码的生成及执行,对于开发者来说,我们只需要在创建爬虫时传入一个数据库表名,并且在callback函数中将想要插入的字段值通过Page.AddField函数设定到参数实例中。框架就可以自动生成SQL并将数据插入数据库。这样所有爬虫可以共用一个pipeline,而不需要重复编写该部分代码 。
✱ 命令模式:可以通过在启动爬虫应用程序时,传入不同的参数来控制爬虫的运行频率,以及开关增量爬取去重处理(针对发起POST请求的URL是不能插入到redis去重数据队列的,否则就只能请求一次,第二次以后都会被去重机制阻断)等操作。好处是通过参数配置可以运行一个行为完全不同的爬虫,避免了维护多个应用程序带来的高昂成本。
三、未来展望
任何一个好的产品都不是一蹴而就的,基本需要在一个原型基础上,通过不断的扩展和优化,使其功能和性能达到一个极致。我们的爬虫框架也经历了这样一个历程,从代码重构,到各种个性化的性能优化和框架改进,使该框架已经可以很好地为我们的产品服务。但这并不是终点,未来我们还要从以下几个方面继续推动爬虫框架的发展:
✱ 动态JS渲染:有些页面中的数据,是需要经过JS渲染后才能够显示。目前我们遇到类似的业务场景,也都是采取直接从数据源头进行解析,进而绕开了JS渲染的处理。在未来我们考虑引入“JS解释器”来融合到框架中来解决该问题,可以预想到需要解决的问题还有很多;
✱ 支持分布式:如果要实现一个功能强大的爬虫系统,分布式是必须要解决的问题,尤其是在大数据分析场景下。未来我们也考虑引用zookeeper中间件,并且选定一个合适的分布式文件系统来支持任务的水平和垂直拆分;
✱ 平台化:我们的远期目标是将爬虫系统的功能和性能做到极致,然后优化封装和接口的设计。使该框架可以快速整合到公司其他爬虫应用场景的项目中去。也希望有兴趣的同事能多给提出意见或者一起讨论。
[参照资料]
网络爬虫/
是时候表演真正的技术了——观海技术部纳新啦~
网站优化 • 优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2022-05-08 21:26
获取到发送者的OpenID, 从数据库里查出之前绑定的学号和教务处密码,发送给在学校内的服务器。
校内的服务器用学号和密码去登陆选课系统。这种模拟用户行为,自动抓取信息的程序一般被叫做爬虫。
表面上选课系统是这个样子。
实际上,在我们看来是这样的。
这种代码叫超文本标记语言,简称HTML。浏览器收到这些代码后,就会在屏幕上画出两个输入框、确认提交按钮、重置按钮和对应的文字。图中第一行也告诉我们学号和密码会以POST方式发送到/pls/wwwbks/bks_login2.login。
于是我们用PHP的curl库来发送密码。
登录之后就可以在/pls/wwwbks/xk.CourseView这个地址看到课表了。
下一步是用正则表达式在网页中查找出课程名和上课的时间地点。
课表是个用HTML画的表格,所以(.|\n)*?可以匹配行,可以匹配列。这里用preg_match_all函数来执行正则表达式匹配。
获取到课表之后,我们会将课表转化为json格式,返回给观海在腾讯云上的服务器。在腾讯云上的服务器就会生成你所看到的页面。这里用到了jQuery和Bootstrap这两个前端框架。
这就是用微信查课表的大致过程了。
既然你都看到这里了,就不考虑一下我们观海听涛技术部的纳新嘛?
(不是所有人都能看到这里哦~)
观海听涛技术部负责维护观海听涛论坛以及微信后台,用代码使同学们的生活更加方便快捷、丰富多彩。现在我们正在招募PHP开发和Linux运维。
要求:
1、对计算机技术,尤其是PHP开发和Linux运维以及云计算有浓厚兴趣和热情。
2、有良好的学习能力和独立解决问题的能力,懂得“提问的智慧”。
3、有阅读中英文文档的能力。
4、课余时间比较充足。
5、计算机相关专业或有编程经验者加分,但其他专业或是没有经验的同学也可以报名。
其实半路出家的程序员也挺多的,比如腾讯著名网络安全专家tombkeeper,之前是学医的,所以他外号叫“妇科圣手”
待遇:
1、提供舒适的工作环境。
2、可以得到来自今日头条等大型互联网公司大佬的指导和内推机会。
3、写的代码在不造成安全隐患的情况下可以放到自己GitHub上。
报名方式:
发邮件到 。
邮件里面除了姓名QQ观海账号等联系方式,简短的自我介绍,也可以写写自己打算怎么学习PHP与Linux、找了哪些书籍教程学习资料、有什么学习计划。我们会在收到邮件后安排面试。
快来加入我们吧~
文案 | 专业核弹头喷漆
图片 |专业核弹头喷漆
查看全部
是时候表演真正的技术了——观海技术部纳新啦~
获取到发送者的OpenID, 从数据库里查出之前绑定的学号和教务处密码,发送给在学校内的服务器。
校内的服务器用学号和密码去登陆选课系统。这种模拟用户行为,自动抓取信息的程序一般被叫做爬虫。
表面上选课系统是这个样子。
实际上,在我们看来是这样的。
这种代码叫超文本标记语言,简称HTML。浏览器收到这些代码后,就会在屏幕上画出两个输入框、确认提交按钮、重置按钮和对应的文字。图中第一行也告诉我们学号和密码会以POST方式发送到/pls/wwwbks/bks_login2.login。
于是我们用PHP的curl库来发送密码。
登录之后就可以在/pls/wwwbks/xk.CourseView这个地址看到课表了。
下一步是用正则表达式在网页中查找出课程名和上课的时间地点。
课表是个用HTML画的表格,所以(.|\n)*?可以匹配行,可以匹配列。这里用preg_match_all函数来执行正则表达式匹配。
获取到课表之后,我们会将课表转化为json格式,返回给观海在腾讯云上的服务器。在腾讯云上的服务器就会生成你所看到的页面。这里用到了jQuery和Bootstrap这两个前端框架。
这就是用微信查课表的大致过程了。
既然你都看到这里了,就不考虑一下我们观海听涛技术部的纳新嘛?
(不是所有人都能看到这里哦~)
观海听涛技术部负责维护观海听涛论坛以及微信后台,用代码使同学们的生活更加方便快捷、丰富多彩。现在我们正在招募PHP开发和Linux运维。
要求:
1、对计算机技术,尤其是PHP开发和Linux运维以及云计算有浓厚兴趣和热情。
2、有良好的学习能力和独立解决问题的能力,懂得“提问的智慧”。
3、有阅读中英文文档的能力。
4、课余时间比较充足。
5、计算机相关专业或有编程经验者加分,但其他专业或是没有经验的同学也可以报名。
其实半路出家的程序员也挺多的,比如腾讯著名网络安全专家tombkeeper,之前是学医的,所以他外号叫“妇科圣手”
待遇:
1、提供舒适的工作环境。
2、可以得到来自今日头条等大型互联网公司大佬的指导和内推机会。
3、写的代码在不造成安全隐患的情况下可以放到自己GitHub上。
报名方式:
发邮件到 。
邮件里面除了姓名QQ观海账号等联系方式,简短的自我介绍,也可以写写自己打算怎么学习PHP与Linux、找了哪些书籍教程学习资料、有什么学习计划。我们会在收到邮件后安排面试。
快来加入我们吧~
文案 | 专业核弹头喷漆
图片 |专业核弹头喷漆