python 爬虫(四)

爬遍整个网络

1 当我们访问整个网络的时候,我们不可避免的会访问不同的网站,但是不同的网站会有完全不同的结构和内容...

现在一步一步的构建访问整个网络的脚本

I 从一个网站开始,每一次都爬向不同的网站。如果在一个页面找不到指向其他网站的链接,获取本网站其他界面信息,直到找到其他网站的链接。

# -*- coding:utf-8 -*-  

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
from random import choice
import re

basename = "http://en.wikipedia.org"
visitedpages = set()

def getInternalLinks(bsObj,includeUrl):
    return [eachlink.attrs[‘href‘] for eachlink in bsObj.find_all("a",href=re.compile("^(/|.*" + includeUrl + ")")) if ‘href‘ in eachlink.attrs]

def getExternalLinks(bsObj,excludeUrl):
    return [eachlink.attrs[‘href‘] for eachlink in bsObj.find_all("a",href=re.compile("^(http|www)((?!" + excludeUrl + ").)*$")) if ‘href‘ in eachlink.attrs]

def splitAddress(address):
    addressParts = address.replace("http://","").split("/")
    return addressParts

def getRandomExternalLink(startingPage):
    html = urlopen(startingPage)
    with html:
        bsObj = BeautifulSoup(html,"html.parser")
    externalLinks = getExternalLinks(bsObj,splitAddress(startingPage)[0])
    if len(externalLinks) == 0:
        internalLinks = getInternalLinks(bsObj, splitAddress(startingPage)[0])
        return choice(internalLinks)
    else:
        return choice(externalLinks)

def followExternalLink(startingPage):
    externalLink = getRandomExternalLink("http://www.oreilly.com/")
    if externalLink in visitedpages:
        print("visited")
    else:
        print("the random external link is   " + externalLink)
        visitedpages.add(externalLink)
        followExternalLink(externalLink)

if __name__ == "__main__":
    #print(splitAddress("http://www.oreilly.com/")[0])
    #print(getRandomExternalLink("http://www.oreilly.com/"))
    followExternalLink("http://www.oreilly.com/")
             

II 从一个网站开始,查找这个网站所有界面信息,获取整个网站指向其他网站的链接

# -*- coding:utf-8 -*-  

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
from random import choice
import re

def getInternalLinks(bsObj,includeUrl):
    return [eachlink.attrs[‘href‘] for eachlink in bsObj.find_all("a",href=re.compile("^(/|.*" + includeUrl + ")")) if ‘href‘ in eachlink.attrs]

def getExternalLinks(bsObj,excludeUrl):
    return [eachlink.attrs[‘href‘] for eachlink in bsObj.find_all("a",href=re.compile("^(http|www)((?!" + excludeUrl + ").)*$")) if ‘href‘ in eachlink.attrs]

def splitAddress(address):
    addressParts = address.replace("http://","").split("/")
    return addressParts

allINlinks = set()
allEXlinks = set()
def getAllexternalLinks(startPage):
    try:
        with urlopen(startPage) as html:
            bsObj = BeautifulSoup(html,"html.parser")
    except HTTPError as e:
        print(e)
    else:
        allinternallinks = getInternalLinks(bsObj,splitAddress(startPage)[0])
        allexternallinks = getExternalLinks(bsObj,splitAddress(startPage)[0])
        print("************external*******************************")
        for eachexternallink in allexternallinks:
            if eachexternallink not in allEXlinks:
                allEXlinks.add(eachexternallink)
                print(eachexternallink)
        print("************internal*******************************")
        for eachinternallink in allinternallinks:
            if eachinternallink not in allINlinks:
                allINlinks.add(eachinternallink)
                print(eachinternallink)
                getAllexternalLinks(eachinternallink)

if __name__ == "__main__":
    getAllexternalLinks("http://www.oreilly.com/")    

***************还存在问题的代码***************************

时间: 2024-07-30 19:47:52

python 爬虫(四)的相关文章

python爬虫(四)--python正则表达式

在爬虫的学习过程中,又一个你必须要掌握的知识点就是正则表达式 爬虫程序需要爬取你需要的东西,那么就对爬取的结果进行筛选,正则表达式就起到这样的作用 如果你学过任何一门语言,相信你都会接触正则表达式.并且正则表达式大多相同. 不管怎样,就像开头说的那样,因为这是爬虫基础教程.所以这篇文章要详细的说一下python的 正则表达式.开始进入正题吧. 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配.Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正

python爬虫(四)_urllib2库的基本使用

本篇我们将开始学习如何进行网页抓取,更多内容请参考:python学习指南 urllib2库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地.在Python中有很多库可以用来抓取网页,我们先学习urllib2. urllib2是Python2.x自带的模块(不需要下载,导入即可使用) urllib2官网文档:https://docs.python.org/2/library/urllib2.html urllib2源码 urllib2在python3.x中被

python爬虫(四)_urllib2:handle处理器和自定义opener

opener和handleer 我们之前一直使用的是urllib2.urlopen(url)这种形式来打开网页,它是一个特殊的opener(也就是模块帮我们建好的),opener是urllib2.OpenerDirectory的实例. 但是基本的urlopen()方法不支持代理.cookie等其他的HTTP/HTTPS高级功能.所以要支持这些功能: 使用相关的Handler处理器来创建特定功能的处理器对象: 然后通过urllib2.build_opener()方法来使用这些处理器对象,创建自定义

Python爬虫利器四之PhantomJS的用法

前言 大家有没有发现之前我们写的爬虫都有一个共性,就是只能爬取单纯的html代码,如果页面是JS渲染的该怎么办呢?如果我们单纯去分析一个个后台的请求,手动去摸索JS渲染的到的一些结果,那简直没天理了.所以,我们需要有一些好用的工具来帮助我们像浏览器一样渲染JS处理的页面. 其中有一个比较常用的工具,那就是 PhantomJS Full web stack No browser required PhantomJS is a headless WebKit scriptable with a Ja

Python爬虫实战四之抓取淘宝MM照片

福利啊福利,本次为大家带来的项目是抓取淘宝MM照片并保存起来,大家有没有很激动呢? 最新动态 更新时间:2015/8/2 最近好多读者反映代码已经不能用了,原因是淘宝索引页的MM链接改了.网站改版了,URL的索引已经和之前的不一样了,之前可以直接跳转到每个MM的个性域名,现在中间加了一个跳转页,本以为可以通过这个页面然后跳转到原来的个性域名,而经过一番折腾发现,这个跳转页中的内容是JS动态生成的,所以不能用Urllib库来直接抓取了,本篇就只提供学习思路,代码不能继续用了. 之后博主会利用其它方

Python爬虫学习:四、headers和data的获取

之前在学习爬虫时,偶尔会遇到一些问题是有些网站需要登录后才能爬取内容,有的网站会识别是否是由浏览器发出的请求. 一.headers的获取 就以博客园的首页为例:http://www.cnblogs.com/ 打开网页,按下F12键,如下图所示: 点击下方标签中的Network,如下: 之后再点击下图所示位置: 找到红色下划线位置所示的标签并点击,在右边的显示内容中可以查看到所需要的headers信息. 一般只需要添加User-Agent这一信息就足够了,headers同样也是字典类型: user

转 Python爬虫入门四之Urllib库的高级用法

静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览器,调试浏览器F12,我用的是Chrome,打开网络监听,示意如下,比如知乎,点登录之后,我们会发现登陆之后界面都变化了,出现一个新的界面,实质上这个页面包含了许许多多的内容,这些内容也不是一次性就加载完成的,实质上是执行了好多次请求,一般

Python 开发网络爬虫(四): 登录

http://blog.jobbole.com/77878/ 博客 – 伯乐在线 首页最新文章在线课程业界开发 IT技术 设计 创业IT职场投稿更多 ? 伯乐在线 > 首页 > 所有文章 > Python > 零基础自学用Python 3开发网络爬虫(四): 登录 零基础自学用Python 3开发网络爬虫(四): 登录 原文出处: Jecvay Notes (@Jecvay)   欢迎分享原创到伯乐头条 今天的工作很有意思, 我们用 Python 来登录网站, 用Cookies记录

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

一. 文章介绍 前一篇文章"[python爬虫] Selenium爬取新浪微博内容及用户信息"简单讲述了如何爬取新浪微博手机端用户信息和微博信息. 用户信息:包括用户ID.用户名.微博数.粉丝数.关注数等. 微博信息:包括转发或原创.点赞数.转发数.评论数.发布时间.微博内容等. 它主要通过从文本txt中读取用户id,通过"URL+用户ID" 访问个人网站,如柳岩: http://weibo.cn/guangxianliuya 因为手机端数据相对精简简单,所以采用输

[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

目录(?)[+] 前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时继续介绍Selenium+Python官网Locating Elements部分内容.        希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~        [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)