python学习之----收集整个网站

如果只是从一个页面跳到另一个页面,那么网络爬虫是非常无聊的。为了有效地使

用它们,在用爬虫的时候我们需要在页面上做些事情。让我们看看如何创建一个爬虫来收

集页面标题、正文的第一个段落,以及编辑页面的链接(如果有的话)这些信息。

和往常一样,决定如何做好这些事情的第一步就是先观察网站上的一些页面,然后拟定一

个采集模式。通过观察几个维基百科页面,包括词条和非词条页面,比如隐私策略之类的

页面,就会得出下面的规则。

? 所有的标题(所有页面上,不论是词条页面、编辑历史页面还是其他页面)都是在

h1 → span 标签里,而且页面上只有一个h1 标签。

? 前面提到过,所有的正文文字都在div#bodyContent 标签里。但是,如果我们想更

进一步获取第一段文字,可能用div#mw-content-text → p 更好(只选择第一段的标

签)。这个规则对所有页面都适用,除了文件页面(例如,https://en.wikipedia.org/wiki/

File:Orbit_of_274301_Wikipedia.svg),页面不包含内容文字(content text)的部分内容。

? 编辑链接只出现在词条页面上。如果有编辑链接,都位于li#ca-edit 标签的li#caedit

→ span → a 里面。

调整前面的代码,我们就可以建立一个爬虫和数据收集(至少是数据打印)的组合程序:

from urllib.request import urlopen

from bs4 import BeautifulSoup

import re

pages = set()

def getLinks(pageUrl):

global pages

html = urlopen("http://en.wikipedia.org"+pageUrl)

bsObj = BeautifulSoup(html)

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("页面缺少一些属性!不过不用担心!")

for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):

if ‘href‘ in link.attrs:

if link.attrs[‘href‘] not in pages:

# 我们遇到了新页面

newPage = link.attrs[‘href‘]

print("----------------\n"+newPage)

pages.add(newPage)

getLinks(newPage)

getLinks("")

这个for 循环和原来的采集程序基本上是一样的(除了打印一条虚线来分离不同的页面内

容之外)。

因为我们不可能确保每一页上都有所有类型的数据,所以每个打印语句都是按照数据在页

面上出现的可能性从高到低排列的。也就是说,<h1> 标题标签会出现在每一页上(只要能

识别,无论哪一页都有),所以我们首先试着获取它的数据。正文内容会出现在大多数页

面上(除了文件页面),因此是第二个获取的数据。“编辑”按钮只出现在标题和正文内容

都已经获取的页面上,但不是所有这类页面上都有,所以我们最后打印这类数据。

时间: 2024-11-03 20:55:52

python学习之----收集整个网站的相关文章

[转]优秀Python学习资源收集汇总

Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收功能,能够自动管理内存使用.它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务. Python上手虽然容易,但与其它任何语言一样要学好Python并非一日之功.我的Python学习还处在基础阶段,偶尔用Python

优秀Python学习资源收集汇总--强烈推荐(转)

原文:http://www.cnblogs.com/lanxuezaipiao/p/3543658.html Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收功能,能够自动管理内存使用.它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务. Python上手虽然容

优秀Python学习资源收集汇总(强烈推荐)

Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收功能,能够自动管理内存使用.它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务. Python上手虽然容易,但与其它任何语言一样要学好Python并非一日之功.我的Python学习还处在基础阶段,偶尔用Python

优秀Python学习资源收集汇总(强烈推荐)转

Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收功能,能够自动管理内存使用.它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务. Python上手虽然容易,但与其它任何语言一样要学好Python并非一日之功.我的Python学习还处在基础阶段,偶尔用Python

python学习资料收集

http://old.sebug.net/paper/books/ 目录下有不少在线书,一部分如: 用Python做科学计算  http://old.sebug.net/paper/books/scipydoc/index.html 简明Python教程  http://old.sebug.net/paper/python/ Python手册  http://old.sebug.net/paper/books/python_hb/ Python初学者的资源总结 在文章中,作者整理了针对初学者零基

[python学习] 简单爬取图片网站图库中图片

最近老师让学习Python与维基百科相关的知识,无聊之中用Python简单做了个爬取"游讯网图库"中的图片,因为每次点击下一张感觉非常浪费时间又繁琐.主要分享的是如何爬取HTML的知识和Python如何下载图片:希望对大家有所帮助,同时发现该网站的图片都挺精美的,建议阅读原网下载图片,支持游讯网不要去破坏它. 通过浏览游讯网发现它的图库URL为,其中全部图片为0_0_1到0_0_75: http://pic.yxdown.com/list/0_0_1.html http://pic.y

【python学习】模拟登陆网站

一.通过post方式模拟登录 post方式登录网站,需要先将必要信息填充到一个dict中,例如: Data={'username':username,'password':password} 二.这里有几个问题: 1.是我怎么知道需要哪些信息填写到dict中呢? 2.是我怎么知道需要post的地址url是哪个呢? 举例分析: 对于这两个问题,以豆瓣为例. 首先打开豆瓣的登录页面 可以看到需要post的地址就是url='http://account.douban.com/login': 那么需要哪

python学习资源收集

目前手里的电子书(00:32 2018-08-15)Python语言及其应用(美Lubanovic 2016)[py3.3]Python网络数据采集(python3)笨办法学 Python(第四版)[py2] [IT学习]Learn Python the Hard Way (Using Python 3)笨办法学Python3版本https://www.cnblogs.com/viphhs/p/7069793.html黑客余弦先生在知道创宇的知道创宇研发技能表v3.1中提到了入门Python的一

[python学习] 模仿浏览器下载CSDN源文并实现PDF格式备份

最近突然想给自己的博客备份下,看了两个软件:一个是CSDN博客导出软件,好像现在不能使用了:一个是豆约翰博客备份专家,感觉都太慢,而且不灵活,想单独下一篇文章就比较费时.而且我的毕业论文是基于Python自然语言相关的,所以想结合前面的文章用Python实现简单的功能: 1.通过网络下载本体的博客,包括图片: 2.在通过Python把HTML转换成PDF格式: 3.如果可能,后面可能会写文章对代码采用特定的方式进行处理. 言归正传,直接上代码通过两个方面进行讲解. 一. 设置消息头下载CSDN文