python之收集网站数据(三种方式)

原创 2018年04月17日 15:45:38

方式一:python之收集整个网站数据

目的:
建立一个爬虫和数据收集程序(数据打印)

1:代码

# coding=utf-8
"""
@author: jiajiknag
程序功能:收集整个网站数据
        建立一个爬虫和数据收集程序(数据打印)
"""
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re

pages = set()
def getLinks(pageUrl):
    # 全集变量集合
    global pages
    # urlopen 用来打开并读取一个从网络获取的远程对象
    html = urlopen("http://en.wikipedia.org"+pageUrl)
    # 创建BeautifulSoup对象
    bs0bj = BeautifulSoup(html)
    try:
        print(bs0bj.h1.get_text())
        print(bs0bj.find(id="mw-content-text").findAll("p")[0])
        print(bs0bj.find(id="ca-edit").find("span").find("a").attrs['href'])
    except AttributeError:
        print("页面缺少一些属性,不用担心")
    # 遍历,以/wiki/开头
    for link in bs0bj.findAll("a",href=re.compile("^(/wiki/)")):
        if 'href' in link.attrs:
            # 新页面
            newPage = link.attrs['href']
            # 虚线作用:分离不同的页面内容
            print("-------------------------------\n"+newPage)
            # 添加新页面
            pages.add(newPage)
            # 或许新页面
            getLinks(newPage)
# 先处理一个空URL
getLinks("")

2:结果

这里写图片描述


方式二:通过互联网采集->从一个外链随意跳转到另一个外链:获得随机外链

1:代码

# coding=utf-8
"""
@author: jiajiknag
程序功能: 通过互联网采集-从一个外链随意跳转到另一个外链
"""
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import datetime
import random

pages = set()
# 随机发送当前时间
# random.seed()是随机数种子,也就是为随机数提供算法,完全相同的种子产生的随机数列是相同的
random.seed(datetime.datetime.now())

# 获取页面所以内链的列表
def getInternalLinks(bs0bj, includeUrl):
    internalLinks = []
    # 找出所有以“\”开头的链接
    for link in bs0bj.findAll("a",href=re.compile("^(/|.*)"+includeUrl)):
        if link.attrs['href'] not in internalLinks:
            internalLinks.append(link.attrs['href'])
    return internalLinks

# 获取页面所有外链的列表
def getExternalLinks(bs0bj,excludeUrl):
    externalLinks = []
    # 找出所有以“http”或者“www”开头且包含当前的url的链接
    for link in bs0bj.findAll("a", href=re.compile("^(http|www)((?!"+ excludeUrl+").)*$")):
        if link.attrs['href'] is not None:
            if link.attrs['href'] not in excludeUrl:
                externalLinks.append(link.attrs['href'])
    return excludeUrl

# 爬去地址
def splitAddress(address):
    addressParts = address.replace("http://", "").split("/")
    return addressParts

# 获取随机外链接
def getRandomExternalLink(startingPage):
    html = urlopen(startingPage)
    bs0bj = BeautifulSoup(html)
    # [0]--返回一个列表,获取外链
    externalLinks = getExternalLinks(bs0bj, splitAddress(startingPage)[0])
    if len(externalLinks) ==0:
        # 既然不是外链,那就是内链
        internalLinks = getInternalLinks(startingPage)
        # 返回获得的随机外链
        return getRandomExternalLink(internalLinks[random.randint(0,len(internalLinks)-1)])
    else:
        return externalLinks[random.randint(0,len(externalLinks)-1)]

def followExternalOnly(startingSite):
    externalLink = getRandomExternalLink("http://oreilly.com")
    print("随机外链是:", externalLink)
    followExternalOnly(externalLink)
followExternalOnly("http://oreilly.com")

2:流程图

这里写图片描述

3:结果

这里写图片描述


方式三: 收集网站上所有的外链

1:代码

# coding=utf-8
"""
@author: jiajiknag
程序功能:
"""
from urllib.request import urlopen
from urllib.parse import urlparse
from bs4 import BeautifulSoup
import re
import datetime
import random

pages = set()
random.seed(datetime.datetime.now())


# 所有内部链接的列表
def getInternalLinks(bsObj, includeUrl):
    includeUrl = urlparse(includeUrl).scheme + "://" + urlparse(includeUrl).netloc
    internalLinks = []
    # 查找所有以“/”开头的链接
    for link in bsObj.findAll("a", href=re.compile("^(/|.*" + includeUrl + ")")):
        if link.attrs['href'] is not None:
            if link.attrs['href'] not in internalLinks:
                if (link.attrs['href'].startswith("/")):
                    internalLinks.append(includeUrl + link.attrs['href'])
                else:
                    internalLinks.append(link.attrs['href'])
    return internalLinks


# 所有外部链接的列表
def getExternalLinks(bsObj, excludeUrl):
    externalLinks = []
    # 查找以“http”或“www”开头的所有链接
    # 不包含当前的URL
    for link in bsObj.findAll("a", href=re.compile("^(http|www)((?!" + excludeUrl + ").)*$")):
        if link.attrs['href'] is not None:
            if link.attrs['href'] not in externalLinks:
                externalLinks.append(link.attrs['href'])
    return externalLinks


def getRandomExternalLink(startingPage):
    html = urlopen(startingPage)
    bsObj = BeautifulSoup(html, "html.parser")
    externalLinks = getExternalLinks(bsObj, urlparse(startingPage).netloc)
    if len(externalLinks) == 0:
        print("没有外部链接")
        domain = urlparse(startingPage).scheme + "://" + urlparse(startingPage).netloc
        internalLinks = getInternalLinks(bsObj, domain)
        return getRandomExternalLink(internalLinks[random.randint(0, len(internalLinks) - 1)])
    else:
        return externalLinks[random.randint(0, len(externalLinks) - 1)]


def followExternalOnly(startingSite):
    externalLink = getRandomExternalLink(startingSite)
    print("随机的外部链接是: " + externalLink)
    followExternalOnly(externalLink)


# 收集一个网站上所有的外链接,并记录每一个外链
allExtLinks = set()
allIntLinks = set()

def getAllExternalLinks(siteUrl):
    html = urlopen(siteUrl)
    domain = urlparse(siteUrl).scheme + "://" + urlparse(siteUrl).netloc
    bsObj = BeautifulSoup(html, "html.parser")
    internalLinks = getInternalLinks(bsObj, domain)
    externalLinks = getExternalLinks(bsObj, domain)

    for link in externalLinks:
        if link not in allExtLinks:
            allExtLinks.add(link)
            print(link)
    for link in internalLinks:
        if link not in allIntLinks:
            allIntLinks.add(link)
            getAllExternalLinks(link)

# 创建对象
followExternalOnly("http://oreilly.com")
# 添加
allIntLinks.add("http://oreilly.com")
# 创建对象
getAllExternalLinks("http://oreilly.com")

2:结果
博主这里可能请求过于频繁所以才导致如下结果啊。
注:小伙伴浏览到这可以提出建议和意见,,,
这里写图片描述

网站分析数据的三种收集方式详解

原文转载:http://www.uml.org.cn/jmshj/201611074.asp?artid=18615 回顾网站数据分析历史,从“您是第***位来访用户...
  • henni_719
  • henni_719
  • 2016-12-13 19:20:30
  • 769

GC的三种方式

标记清除方式                    标记清除算法的时间耗费与存活对象总数和对象总数相关(第一次扫描一次存活的对象,第二次扫描所有对象) 缺点:当对象总数大,存活对...
  • wdqqmms00544kiss
  • wdqqmms00544kiss
  • 2016-05-30 21:46:38
  • 157

网站分析数据(即用户行为数据)的三种收集方式详解

回顾网站数据分析历史,从“您是第***位来访用户”到现在百家齐放的专业工具提供商,网站分析已经逐渐发展衍化成一门科学。但面对形态各异的分析数据,很多人仍然困惑于数据的来源,了解数据的收集原理,也许对你...
  • zolalad
  • zolalad
  • 2014-07-15 09:30:22
  • 13202

jsp页面获取数据方法

jsp页面如何获取从数据库里获取的数据呢? 首先我们先通过hibernate得到数据,放到List里面。 然后写action类ListAction,并获取List放到lists里。 下面有两种方...
  • ShadeXiaoPiHai
  • ShadeXiaoPiHai
  • 2015-05-05 12:56:34
  • 469

网站用户行为数据收集和分析方法

来源 为改善网站的可用性, 一般采用可用性工程方法, 其核心是以用户为中心的设计方法论(UCD)。综合介绍了目前国内外对于用户行为数据收集和分析方法所进行的研究, 各种方法的特点, 并介绍一些利用相...
  • xikai18827083487
  • xikai18827083487
  • 2016-10-25 23:07:15
  • 3640

数据传输的三种交换方式

电路交换,报文交换,分组交换首先我们来看看三种交换方式的示意图对照上面的图,给出三种交换方式在数据传输阶段的主要特点: 电路交换:整个报文的比特流连续的从源点直达终点,好像在一个管道中传送。 报文交换...
  • zjq_1314520
  • zjq_1314520
  • 2017-01-04 21:34:58
  • 5023

python运行的三种方式

python运行的三种方式1.a = 2 b = 3 m = a + b print('m: ' + str(m)) 直接运行,打印m的值2.函数形式def A(self): a = 2 ...
  • XTY00
  • XTY00
  • 2018-03-15 19:53:28
  • 35

Python爬虫之三种网页抓取方法性能比较

下面我们将介绍三种抓取网页数据的方法,首先是正则表达式,然后是流行的 BeautifulSoup 模块,最后是强大的 lxml 模块。1. 正则表达式  如果你对正则表达式还不熟悉,或是需要一些提示时...
  • Oscer2016
  • Oscer2016
  • 2017-04-19 13:54:24
  • 18921

学习Python:做数据科学还是网站开发?

本文的英文原文地址是:Python for Data Science vs Python for Web Development 译者:EarlGrey@codingpy 译者一开始在...
  • u013709332
  • u013709332
  • 2015-11-14 13:49:27
  • 1353

python、数据收集、数据分析

本文用于存放一些看到的好材料、文章的链接,不断更新。 1.http://www.cnblogs.com/ming5536/archive/2012/11/21/2781062.html 如...
  • liuguiyangnwpu
  • liuguiyangnwpu
  • 2014-06-04 16:23:44
  • 8866
收藏助手
不良信息举报
您举报文章:python之收集网站数据(三种方式)
举报原因:
原因补充:

(最多只允许输入30个字)