上一篇文章中,实现了在一个网站上随机地从一个链接跳掉另一个链接。但是,如果需要系统地把整个网站按目录分类,或者要搜索网站上的每一个页面,就得采集整个网站,那是一种非常耗费内存资源的过程,尤其处理大型网站时,最合适的工具就是用一个数据库来储存采集的资源。

1. 深网和暗网

你可能听说过深网(deep Web)、暗网(dark Web)或者隐藏网络(hidden Web)之类的术语,尤其在最近的媒体中。它们是什么意思呢?深网是网络的一部分,与浅网(surface Web)对立。浅网是互联网上搜索引擎可以抓到的那部分网络。据不完全统计,互联网中其实约90%网络都是深网。因为谷歌不能做像表单提交这类事情,也找不到那些没有直接链接到顶层域名上的网页,或者因为有robots.txt禁止而不能查看网站,所以浅网的数量相对深网还是比较少的。

暗网,也被称为Darknet或者dark Internet,完全是另一种“怪兽”。它们也建立在已有的网络基础上,但是使用Tor客户端,带有运行在HTTP之上的新协议,提供了一个信息交换的安全隧道。这类暗网页面也是可以采集的,就像你采集其他网站一样,不过这些内容超出了本章的讨论范围。

和暗网不同,深网相对容易采集。可以让你采集那些Google爬虫机器人不能获取的深网信息。

2. 遍历整个网站的网络数据采集有许多好处:

(1)生成网站地图

使用爬虫采集整个网站,收集所有的链接,再把所有的页面整理成网站实际的形式。

(2)收集数据

创建一个专业垂直领域的搜索平台,想收集一些文章(博客,新闻、故事等)。虽然这些网站采集不费劲,但是它们需要爬虫有足够的深度(我们有意猴急数据的网站不多)。于是创建一个爬虫递归地遍历每个网站,只收集那些网站页面上的数据。一个常用的费时的网站采集方法就是从顶级页面开始(比如主页),然后搜索页面上的所有链接,形成列表。再去采集这些链接的每一个页面,然后把每个页面上找到的链接形成新的列表,重复执行下一轮采集。

很明显,这是一个复杂度增长很快的情形。假如每个页面有10个链接,网站上有5个页面深度(一个中等规模的主流深度),那么如果你要采集整个网站,一共得采集的网页数量就是10^5,即100000个页面。不过,虽然“5个页面深度,每页10个链接”是网站的主流配置,但其实很少的网站真有100000甚至更多的页面,这是因为很大一部分内链都是重复的。

为了避免一个页面被采集两次,链接去重是非常重要的。在代码运行时,把已发现的所有链接放到一起,并保存在方便查询的列表里(下文示例指Python的集合set类型)。只有新的链接才会被采集,之后再从页面中搜索其他链接。

from urllib.request import urlopen
from bs4 import BeautifulSoup
import repages=set()
def getLinks(pageUrl):global pageshtml=urlopen("https://en.wikipedia.org"+pageUrl)bsObj=BeautifulSoup(html,"html.parser")for link in bsObj.findAll("a",href=re.compile("^(/wiki/)")):if 'href' in link.attrs:if link.attrs["href"] not in pages:print(newPage)newPage=link.attrs["href"]pages.add(newPage)getLinks(newPage)getLinks("")

为了全面地展示这个网络数据采集示例是如何工作的,我去除了“只寻找内链”的标准。不再限制爬虫采集的页面范围,只要遇到页面就查找所有以/wiki/开头的链接,也不考虑链接是不是包含分号。

一开始,用getLinks处理一个空URL,其实是维基百科的主页,因为在函数里空URL就是https://en.wikipedia.org。然后遍历首页上每一个链接,并检查是否已经在全局变量pages集合中。如果不在,则打印到屏幕,并添加到pages集合中,再用getLinks递归地处理这个链接。这边需要注意一点,python默认的递归限制是1000次,程序到达递归限制后就会自动停止。

3. 收集整个网站数据

当然,如果只从一个页面跳转到另一个页面,那么网络爬虫是非常无聊的。为了有效地使用它们,在用爬虫的时候我们需要在页面上做些事情。让我们看看如何创建一个爬虫来收集页面标题,正文的第一个段落,以及编辑页面的链接(如果有的话)这些信息。

和往常一样,决定如何做好这些事情的第一步就是先观察网站上的一些页面,然后拟定一个采集模式。通过观察几个维基百科页面,包括词条页面和非词条页面,比如隐私策略之类的页面,就会得到下面的规则:

(1)所有的标题(所有页面上,不论是词条页面,编辑历史页面还是其他页面)都是在h1-span标签里,而且页面上只有一个h1标签;

(2)前面提到过,所有正文文字都在div#bodyContent标签里。但是,如果我们想要进一步获取第一段文字,可能用div#mw-contet-text->p更好(只选择第一段的标签)。这个规则对所有页面都适用,除了文件页面,页面不包含内容文字(content text)的部分内容

(3)编辑链接只出现在词条页面上,如果有编辑链接,都位于li#ca-edit->span->a里面。

完整的程序代码如下:

from urllib.request import urlopen
from bs4 import BeautifulSoup
import repages=set()
def getLinks(pageUrl):global pageshtml=urlopen("https://en.wikipedia.org"+pageUrl)bsObj=BeautifulSoup(html,"html.parser")try:print(bsObj.h1.get_text())print(bsObj.find(id="mw-content-text").findAll("p")[0])print(bsObj.find(id="ca-edit").find("span").find("a").attrs['href'])except AttributeError:print("页面缺少一些属性,Don't worry")for link in bsObj.findAll("a",href=re.compile("^(/wiki/)")):if 'href' in link.attrs:if link.attrs["href"] not in pages:print("---------\n"+newPage)newPage=link.attrs["href"]pages.add(newPage)getLinks(newPage)getLinks("")
因为我们不可能确保每一页上都有所有类型的数据,所以每个打印语句都是按照数据在页面上出现的可能性从高到低排列的。也就是说,<h1>标题标签会出现在每一页上,所以我们首先尝试获取它的数据。正文内容会出现在大多数页面上(除了文件页面),因此是第二个获取的数据。“编辑”按钮只出现在标题个正文内容都已经获取的页面上,不是所有页面都有,因此放在最后。

python网络爬虫-采集整个网站相关推荐

  1. 微课--Python网络爬虫采集百度搜索结果(例4-5)

    推荐教材: <Python网络程序设计(微课版)>,ISBN:978-7-3025-8312-7,董付国,清华大学出版社,2021年8月出版 配套资源: 教学大纲.445页PPT.91个例 ...

  2. Python网络爬虫——爬取网站图片小工具

    最近初学python爬虫,就写了一个爬取网站图片的小工具,界面如下: 用到的包主要是爬虫常用的urllib,urllib2和图形界面用的Tkinter,完整代码如下: # -*- coding:utf ...

  3. 淘宝api开放平台买家卖家订单接口,python网络爬虫采集数据

    custom-自定义API操作 公共参数 请求地址: https://console.open.onebound.cn/console/?i=Anzexi 名称 类型 必须 描述 key String ...

  4. 介绍一位零基础学Python网络爬虫的工程师

    今天给大家推荐一位软件开发工程师兼Python网络爬虫与数据分析爱好者,它是「Python爬虫与数据挖掘」公众号号主Python进阶者.他系一名软件开发工程师,在工作之余,热爱Python编程,专注于 ...

  5. 推荐一位零基础Python网络爬虫学习者,原来也爬虫也没有那么难

    今天给大家推荐一位软件开发工程师兼Python网络爬虫与数据分析爱好者,它是「Python爬虫与数据挖掘」公众号号主Python进阶者.他系一名软件开发工程师,在工作之余,热爱Python编程,专注于 ...

  6. 实战python网络爬虫豆瓣_三分钟教会你利用Python爬虫实现豆瓣电影采集(实战篇)...

    一.项目背景 豆瓣电影提供最新的电影介绍及评论包括上映影片的影讯查询及购票服务.可以记录想看.在看和看过的电影电视剧 .顺便打分.写影评.极大地方便了人们的生活. 今天小编以电视剧(美剧)为例,批量爬 ...

  7. 一篇文章教会你利用Python网络爬虫实现豆瓣电影采集

    点击上方"IT共享之家",进行关注 回复"资料"可获赠Python学习福利 [一.项目背景] 豆瓣电影提供最新的电影介绍及评论包括上映影片的影讯查询及购票服务. ...

  8. python网络爬虫_Python网络爬虫——爬取视频网站源视频!

    原标题:Python网络爬虫--爬取视频网站源视频! 学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 ...

  9. Python网络爬虫实践(2):爬取小说网站小说

    Python网络爬虫实践(2) 一.需求分析 爬取某小说网站的一部小说 二.步骤 目标数据 网站 页面 分析数据加载流程 分析目标数据所对应的url 下载数据 清洗,处理数据 数据持久化 重点:分析目 ...

最新文章

  1. Asp.net基础概念之 HttpModule
  2. 常用的正则表达式分享
  3. python简单代码加法-Python tkinter实现简单加法计算器代码实例
  4. extjs学习(关于grid)
  5. python global和nonlocal_3.关于作用域知识的额外补充global和nonlocal关键字
  6. 如何定义和建立架构?
  7. C语言设计模式——命令模式
  8. ASP.NET MVC在IIS6下部署的小技巧
  9. 【非科班告诉你】前端自学从小白到入门
  10. 输入姓名打印年龄练习
  11. ssas表格模型 权限控制_创建第一个SSAS表格模型数据库
  12. java动态是如何根据实体建表_传入Java对象 自动创建动态表 并录入数据
  13. Linux下unzip乱码问题解决
  14. Linux内核配置.config文件
  15. 使用Selenium启动火狐浏览器
  16. RGB配色表,CMYK配色表
  17. WeaveSocket框架-Unity太空大战游戏-通信协议-2
  18. office2019word2019excel2019ppt2019关闭自动更新设置步骤
  19. 多传感器数据融合发展综述
  20. django-simple-sso, django-auth-ldap, python-ldap 单点登录(一)

热门文章

  1. 为什么现在很多人劝自己身边的人不要学计算机?
  2. 医院信息系统建设技术参数及资质要求招标公告
  3. 自动驾驶感知——物体检测与跟踪算法|4D毫米波雷达
  4. 搭建个人网站--优秀个人网站小结
  5. 如何在Python程序中运行Unix命令
  6. 10进制计数器Verilog编程
  7. python 凯撒加密 计算偏移量
  8. ap计算机教材pdf百度云,AP计算机A:你需要知道的信息
  9. SRB0 SRB1 SRB2 SRB
  10. MATLAB里一些有意思的小彩蛋