爬遍整个域名

   六度空间理论:任何两个陌生人之间所间隔的人不会超过六个,也就是说最多通过五个人你可以认识任何一个陌生人。通过维基百科我们能够通过连接从一个人连接到任何一个他想连接到的人。

1. 获取一个界面的所有连接

  1. from urllib.request import urlopen
  2. from bs4 import BeautifulSoup
  3.  
  4. html = urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon")
  5. bsObj = BeautifulSoup(html,'html.parser')
  6. for link in bsObj.find_all("a"):
  7. if 'href' in link.attrs:
  8. print(link.attrs['href'])

2. 获取维基百科当前人物关联的事物

1. 除去网页中每个界面都会存在sidebar,footbar,header links 和 category pages,talk pages.

2. 当前界面连接到其他界面的连接都会有的相同点

I 包含在一个id为bodyContent的div中

II url中不包含分号,并且以/wiki/开头

  1. from urllib.request import urlopen
  2. from bs4 import BeautifulSoup
  3. import re
  4.  
  5. html = urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon")
  6. bsObj = BeautifulSoup(html,"html.parser")
  7. for link in bsObj.find('div',{"id":"bodyContent"}).find_all("a",href=re.compile("^(/wiki/)((?!:).)*$")):
  8. if 'href' in link.attrs:
  9. print(link.attrs['href'])

3. 深层查找

简单的从一个维基百科界面中找到当前界面的连接是没有意义的,如果能够从当前界面开始循环的找下去会有很大的进步

1. 需要创建一个简单的方法,返回当前界面所有文章的连接

2. 创建一个main方法,从一个界面开始查找,然后进入其中一个随机连接,以这个新连接为基础继续查找直到没有新的连接为止。

  1. from urllib.request import urlopen
  2. from urllib.error import HTTPError
  3. from bs4 import BeautifulSoup
  4. from random import choice
  5. import re
  6.  
  7. basename = "http://en.wikipedia.org"
  8.  
  9. def getLinks(pagename):
  10. url = basename + pagename
  11. try:
  12. with urlopen(url) as html:
  13. bsObj = BeautifulSoup(html,"html.parser")
  14. links = bsObj.find("div",{"id":"bodyContent"}).find_all("a",href=re.compile("^(/wiki/)((?!:).)*$"))
  15. return [link.attrs['href'] for link in links if 'href' in link.attrs]
  16. except (HTTPError,AttributeError) as e:
  17. return None
  18.  
  19. def main():
  20. links = getLinks("/wiki/Kevin_Bacon")
  21. while len(links) > 0:
  22. nextpage = choice(links)
  23. print(nextpage)
  24. links = getLinks(nextpage)
  25.  
  26. main()

4. 爬遍整个域名

1. 爬遍整个网站首先需要从网站的主界面开始

2. 需要保存已经访问过的网页,避免重复访问相同的地址

  1. from urllib.request import urlopen
  2. from urllib.error import HTTPError
  3. from bs4 import BeautifulSoup
  4. from random import choice
  5. import re
  6.  
  7. basename = "http://en.wikipedia.org"
  8. visitedpages = set()#使用set来保存已经访问过的界面地址
  9.  
  10. def visitelink(pagename):
  11. url = basename + pagename
  12. global visitedpages
  13. try:
  14. with urlopen(url) as html:
  15. bsObj = BeautifulSoup(html,"html.parser")
  16. links = bsObj.find("div",{"id":"bodyContent"}).find_all("a",href=re.compile("^(/wiki/)((?!:).)*$"))
  17. for eachlink in links:
  18. if 'href' in eachlink.attrs:
  19. if eachlink.attrs['href'] not in visitedpages:
  20. nextpage = eachlink.attrs['href']
  21. print(nextpage)
  22. visitedpages.add(nextpage)
  23. visitelink(nextpage)
  24. except (HTTPError,AttributeError) as e:
  25. return None
  26.  
  27. visitelink("")

5. 从网站上搜集有用信息

1. 没做什么特别的东西,在访问网页的时候打印了一些 h1和文字内容

2. 在print的时候出现的问题》

UnicodeEncodeError: 'gbk' codec can't encode character u'\xa9' in position 24051: illegal multibyte sequence

   解决方法:在print之前将source_code.encode('GB18030')

解释:GB18030是GBK的父集,所以能兼容GBK不能编码的字符。

  1. from urllib.request import urlopen
  2. from urllib.error import HTTPError
  3. from bs4 import BeautifulSoup
  4. from random import choice
  5. import re
  6.  
  7. basename = "http://en.wikipedia.org"
  8. visitedpages = set()#使用set来保存已经访问过的界面地址
  9.  
  10. def visitelink(pagename):
  11. url = basename + pagename
  12. global visitedpages
  13. try:
  14. with urlopen(url) as html:
  15. bsObj = BeautifulSoup(html,"html.parser")
  16. try:
  17. print(bsObj.h1.get_text())
  18. print(bsObj.find("div",{"id":"mw-content-text"}).find("p").get_text().encode('GB18030'))
  19. except AttributeError as e:
  20. print("AttributeError")
  21. links = bsObj.find("div",{"id":"bodyContent"}).find_all("a",href=re.compile("^(/wiki/)((?!:).)*$"))
  22. for eachlink in links:
  23. if 'href' in eachlink.attrs:
  24. if eachlink.attrs['href'] not in visitedpages:
  25. nextpage = eachlink.attrs['href']
  26. print(nextpage)
  27. visitedpages.add(nextpage)
  28. visitelink(nextpage)
  29. except (HTTPError,AttributeError) as e:
  30. return None
  31.  
  32. visitelink("")

python 爬虫(三)的更多相关文章

  1. Python爬虫(三)爬淘宝MM图片

    直接上代码: # python2 # -*- coding: utf-8 -*- import urllib2 import re import string import os import shu ...

  2. python爬虫(三)

    Requests模块 这个库的标准文档有个极其幽默的地方就是它的中文翻译,我就截取个开头部分,如下图: 是不是很搞笑,在正文中还有许多,管中窥豹,可见一斑.通过我的使用,感觉Requests库的确是给 ...

  3. Python 爬虫三 beautifulsoup模块

    beautifulsoup模块 BeautifulSoup模块 BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查 ...

  4. Python爬虫(三)——开封市58同城出租房决策树构建

    决策树框架: # coding=utf-8 import matplotlib.pyplot as plt decisionNode = dict(boxstyle=') leafNode = dic ...

  5. Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析

    文化         经管 ....略 结论: 一个模块的评分与评论数相关,评分为 [8.8——9.2] 之间的书籍评论数往往是模块中最多的

  6. Python 爬虫 (三)

    #对第一章的百度翻译封装的函数进行更新 1 from urllib import request, parse from urllib.error import HTTPError, URLError ...

  7. Python爬虫(四)——开封市58同城数据模型训练与检测

    前文参考: Python爬虫(一)——开封市58同城租房信息 Python爬虫(二)——对开封市58同城出租房数据进行分析 Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析 数据的构建 ...

  8. Python爬虫(四)——豆瓣数据模型训练与检测

    前文参考: Python爬虫(一)——豆瓣下图书信息 Python爬虫(二)——豆瓣图书决策树构建 Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析 数据的构建 在这张表中我们可以发现 ...

  9. Python爬虫学习:三、爬虫的基本操作流程

    本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将 ...

  10. 3.Python爬虫入门三之Urllib和Urllib2库的基本使用

    1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...

随机推荐

  1. python之路十五

    CSS position 属性 定义和用法position 属性规定元素的定位类型.说明这个属性定义建立元素布局所用的定位机制.任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不论该元素本身 ...

  2. [转] 有java基础的人如何转行做大数据?

    数据有两个方向,一个是偏计算机的,另一个是偏经济的.你学过Java,所以你可以偏将计算机基础1. 读书<Introduction to Data Mining>,这本书很浅显易懂,没有复杂 ...

  3. ffmpeg-20161003[04,05.06]-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...

  4. PostgreSQL 允许远程访问设置方法

     安装PostgreSQL数据库之后,默认是只接受本地访问连接.如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置. 配置远程连接PostgreSQL数据库的步骤很简单,只需 ...

  5. maven项目断点依赖maven插件

         

  6. SQL Server删除重复行的6个方法

    SQL Server删除重复行是我们最常见的操作之一,下面就为您介绍六种适合不同情况的SQL Server删除重复行的方法,供您参考. 1.如果有ID字段,就是具有唯一性的字段 delect   ta ...

  7. CString转换为string

    string CStringToString(CString strMFC) { CStringA strA; strA = strMFC.GetBuffer(); strMFC.ReleaseBuf ...

  8. 漫谈iOS程序的证书和签名机制

    接触iOS开发半年,曾经也被这个主题坑的摸不着头脑,也在淘宝上买过企业证书签名这些服务,有大神都做了一个全自动的发布打包(不过此大神现在不卖企业证书了),甚是羡慕和崇拜.于是,花了一点时间去研究了一下 ...

  9. 开发webservice的方式

        什么是 web 服务? web 服务是对应用程序功能的网络访问接口,它是使用标准 Internet 技术构建的. 我们目前看到的部署在 Internet 上的 web 服务都是 HTML 网站 ...

  10. Lintcode 9.Fizz Buzz 问题

    ------------------------ AC代码: class Solution { /** * param n: As description. * return: A list of s ...