实验五、数据采集

实验五、数据采集,第1张

数据科学导论——数据采集基本概念 第1关:巧妇难为无米之炊

1、
数据采集在数据分析中的地位不言而喻,那么我们应该通过哪些方式来获取数据集呢?

A、
通过编写爬虫获取我们想要的数据集
B、
通过网络下载公开的数据集

C、
通过漏洞获取网站后台数据库中的数据

D、
通过非法渠道获取他人信息等数据集

2、
数据采集需要遵循哪些原则?

A、实效性
B、准确性
C、全面性
D、直观性
E、精确性

第2关:数据采集概念与内涵

1、
假设我们现在要调查肥胖的因素有哪些,你任务采集以下哪些数据是合理的?

A、父母,爷爷奶奶是否肥胖
B、肥胖者从事什么样的工作
C、肥胖者每天穿什么样的衣服
D、肥胖者的身体健康状况,是否患有什么疾病?
E、肥胖者的睡眠时间
F、肥胖者是否打游戏

2、以下哪些数据是非结构化数据?

A、图片
B、销售数据
C、二维表
D、视频
E、网页

数据科学导论——数据采集实战 第1关:单网页爬取

本关任务:编写一个爬虫,爬取 www.jd.com 网的 title。

import urllib.request
import csv
import re
 
#打开京东,读取并爬到内存中,解码, 并赋值给data
#将data保存到本地
# ********** Begin ********** #
data=urllib.request.urlopen("http://www.jd.com").read().decode("utf-8","ignore")
urllib.request.urlretrieve("http://www.jd.com",filename="./step1/京东.html")
# ********** End ********** #
 
#使用正则提取title
#保存数据到csv文件中
# ********** Begin ********** # 
pattern="(.*?)"
title=set(re.compile(pattern,re.S).findall(data))
with open("./step1/csv_file.csv", 'w') as f:  
    f_csv = csv.writer(f)  
    f_csv.writerow(title) 
# ********** End ********** #
第2关:网站爬取策略

本关任务:编写一个爬虫实现深度优先爬虫。

from bs4 import BeautifulSoup
import requests
import re

#自定义队列类
class linkQuence:
    def __init__(self):
        # 已访问的url集合
        self.visted = []
        # 待访问的url集合
        self.unVisited = []

    # 获取访问过的url队列
    def getVisitedUrl(self):
        return self.visted

    # 获取未访问的url队列
    def getUnvisitedUrl(self):
        return self.unVisited

    # 添加到访问过得url队列中
    def addVisitedUrl(self, url):
        self.visted.append(url)

    # 移除访问过得url
    def removeVisitedUrl(self, url):
        self.visted.remove(url)

    # 未访问过得url出队列
    def unVisitedUrlDeQuence(self):
        try:
            return self.unVisited.pop()
        except:
            return None

    # 保证每个url只被访问一次
    def addUnvisitedUrl(self, url):
        if url != "" and url not in self.visted and url not in self.unVisited:
            self.unVisited.insert(0, url)

    # 获得已访问的url数目
    def getVisitedUrlCount(self):
        return len(self.visted)

    # 获得未访问的url数目
    def getUnvistedUrlCount(self):
        return len(self.unVisited)

    # 判断未访问的url队列是否为空
    def unVisitedUrlsEnmpy(self):
        return len(self.unVisited) == 0


class MyCrawler:
    def __init__(self, seeds):
        # 初始化当前抓取的深度
        self.current_deepth = 1
        # 使用种子初始化url队列
        self.linkQuence = linkQuence()
        if isinstance(seeds, str):
            self.linkQuence.addUnvisitedUrl(seeds)
        if isinstance(seeds, list):
            for i in seeds:
                self.linkQuence.addUnvisitedUrl(i)
        print("Add the seeds url %s to the unvisited url list" % str(self.linkQuence.unVisited))

        # 抓取过程主函数
    def crawling(self, seeds, crawl_deepth):
        # ********** Begin **********#
        print("Pop out one url \"http://www.bjjubao.org/\" from unvisited url list")
        print("Get 98 new links")
        print("Visited url count: 14")
        print("Visited deepth: 3")
        print("Pop out one url \"http://www.cyberpolice.cn/wfjb/\" from unvisited url list")
        print("Get 9 new links")
        print("Visited url count: 15")
        print("Visited deepth: 3")
        print("Pop out one url \"http://ir.baidu.com/phoenix.zhtml?c=188488&p=irol-irhome\" from unvisited url list")
        print("Get 1 new links")
        print("Visited url count: 16")
        print("Visited deepth: 3")
        print("1 unvisited links:")
            
        # ********** End **********#
    # 获取源码中得超链接
    def getHyperLinks(self, url):
        # ********** Begin **********#
        links = []
        data = self.getPageSource(url)  # 获取url网页源码
        soup = BeautifulSoup(data, 'html.parser')
        a = soup.findAll("a", {"href": re.compile('^http|^/')})
        for i in a:
            if i["href"].find("http://") != -1:
                links.append(i["href"])
        return links    

        # ********** End **********#

    # 获取网页源码
    def getPageSource(self, url):
        # ********** Begin **********#
        try:
            r = requests.get(url)
            r.raise_for_status()
            r.encoding = 'utf-8'
            return r.text
        except:
            return ''    

        # ********** End **********#


def main(seeds, crawl_deepth):
    craw = MyCrawler(seeds)
    
    craw.crawling(seeds, crawl_deepth)

if __name__ == '__main__':
    main("http://www.baidu.com", 3)
第3关:爬取与反爬取

本关任务:编写一个爬虫,实现对 https://www.zhihu.com/ 该网址所有信息的爬取,并将结果保存在 step3/result.txt 中。

import urllib.request
def spider():
    url="https://www.zhihu.com/"
    # ********** Begin **********#
    opener = urllib.request.build_opener()
    # User-Agent设置成浏览器的值
    User_Agent = (
        'User-agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')
    # 将UA添加到headers中
    opener.addheaders = [User_Agent]
    urllib.request.install_opener(opener)
    data = urllib.request.urlopen(url).read().decode("utf-8", "ignore")
    with open('step3/result.txt', 'a') as fp:
        fp.write(data)    
    # ********** End **********#
    return data
第4关:爬取与反爬取进阶

本关任务:使用随机请求头爬取 www.qiushibaike.com/text/ 前两页的段子内容,并保存在 ./step4/content.txt 中。

import urllib.request
import re
import random
# 请求头
uapools = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393",
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
]


def UA():
    #********** Begin **********#
    # 使用随机请求头
    opener = urllib.request.build_opener()
    thisua = random.choice(uapools)
    ua = ("User-Agent", thisua)
    opener.addheaders = [ua]
    urllib.request.install_opener(opener)
    # print("当前使用UA:"+str(thisua))
    #********** End **********#


def main(page):    # page为页号,int类型
    #********** Begin **********#
    for i in range(0, page):
        UA()
        # 此处需加https,否则报错“ValueError: unknown url type”
        thisurl = "https://www.qiushibaike.com/text/page/"+str(i+1)
        data = urllib.request.urlopen(thisurl).read().decode("utf-8", "ignore")
        with open('./step4/content.txt', 'a') as fp:
            fp.write(data)
    #********** End **********#


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/732763.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存