数据科学导论——数据采集实战

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

第1关:单网页爬取

任务描述

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

编程要求

请仔细阅读右侧代码,结合相关知识,在 Begin-End 区域内进行代码补充,编写一个爬虫,爬取 www.jd.com 网的 title ,具体要求如下:
获取 www.jd.com 的页面 html 代码并保存在 ./step1/京东.html;
使用正则提取 title;
将 title 的内容保存为 csv 文件,位置为 ./step1/csv_file.csv。

测试说明

平台会对你编写的代码进行测试:

预期输出:
html获取成功  
title匹配成功 

开始你的任务吧,祝你成功!

import urllib.request
import csv
import re

#打开京东,读取并爬到内存中,解码, 并赋值给data
#将data保存到本地
# ********** Begin ********** #
data = urllib.request.urlopen("https://www.jd.com").read().decode("utf-8", "ignore")
with open("./step1/京东.html", 'a') as f:
    f.write(data)
# ********** End ********** #

#使用正则提取title
#保存数据到csv文件中
# ********** Begin ********** #
pattern = "<title>(.*?)</title>"
title = re.compile(pattern, re.S).findall(data)
with open("./step1/csv_file.csv", 'a') as f:
    f_csv = csv.writer(f)
    f_csv.writerow(title)
# ********** End ********** #

第2关:网站爬取策略

编程要求

请仔细阅读右侧代码,结合相关知识,在 Begin-End 区域内进行代码补充,编写一个爬虫实现深度优先爬虫,爬取的网站为 www.baidu.com。

测试说明

平台会对你编写的代码进行测试:

下方预期输出随着网页的更新,中间的数据会有一定的变化。

预期输出:  
Add the seeds url ['http://www.baidu.com'] to the unvisited url list  
Pop out one url "http://www.baidu.com" from unvisited url list  
Get 10 new links  
Visited url count: 1  
Visited deepth: 1  
10 unvisited links:  
Pop out one url "http://news.baidu.com" from unvisited url list  
Get 52 new links  
Visited url count: 2  
Visited deepth: 2  
Pop out one url "http://www.hao123.com" from unvisited url list  
Get 311 new links  
Visited url count: 3  
Visited deepth: 2  
Pop out one url "http://map.baidu.com" from unvisited url list  
Get 0 new links  
Visited url count: 4  
Visited deepth: 2  
Pop out one url "http://v.baidu.com" from unvisited url list  
Get 566 new links  
Visited url count: 5  
Visited deepth: 2  
Pop out one url "http://tieba.baidu.com" from unvisited url list  
Get 21 new links  
Visited url count: 6  
Visited deepth: 2  
Pop out one url "http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1" from unvisited url list  
Get 1 new links  
Visited url count: 7  
Visited deepth: 2  
Pop out one url "http://home.baidu.com" from unvisited url list  
Get 27 new links  
Visited url count: 8  
Visited deepth: 2  
Pop out one url "http://ir.baidu.com" from unvisited url list  
Get 22 new links  
Visited url count: 9  
Visited deepth: 2  
Pop out one url "http://www.baidu.com/duty/" from unvisited url list  
Get 1 new links  
Visited url count: 10  
Visited deepth: 2  
Pop out one url "http://jianyi.baidu.com/" from unvisited url list  
Get 4 new links  
Visited url count: 11  
Visited deepth: 2  
2 unvisited links:  
Pop out one url "http://baozhang.baidu.com/guarantee/" from unvisited url list  
Get 0 new links  
Visited url count: 12  
Visited deepth: 3  
Pop out one url "http://ir.baidu.com/phoenix.zhtml?c=188488&p=irol-irhome" from unvisited url list  
Get 22 new links  
Visited url count: 13  
Visited deepth: 3  
22 unvisited links:  

注意:右侧预期输出为部分输出。

开始你的任务吧,祝你成功!

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))

################ BEGIN ##################
        # 抓取过程主函数(方法一)
    # def crawling(self, seeds, crawl_deepth):
    #     # 循环条件:抓取深度不超过crawl_deepth
    #     while self.current_deepth <= crawl_deepth:
    #         # 循环条件:待抓取的链接不空
    #         while not self.linkQuence.unVisitedUrlsEnmpy():
    #             # 队头url出队列
    #             visitUrl = self.linkQuence.unVisitedUrlDeQuence()
    #             print("Pop out one url \"%s\" from unvisited url list" % visitUrl)
    #             if visitUrl is None or visitUrl == "":
    #                 continue
    #             # 获取超链接
    #             links = self.getHyperLinks(visitUrl)  # 获取visiturl中的所有超链接
    #             print("Get %d new links" % len(links))
    #             # 将visitUrl放入已访问的url中
    #             self.linkQuence.addVisitedUrl(visitUrl)
    #             print("Visited url count: " +
    #                   str(self.linkQuence.getVisitedUrlCount()))
    #             print("Visited deepth: " + str(self.current_deepth))
    #         # 未访问的url入列   也就是visiturl网页中的所有超链接links
    #         for link in links:
    #             self.linkQuence.addUnvisitedUrl(link)
    #         print("%d unvisited links:" %
    #               len(self.linkQuence.getUnvisitedUrl()))
    #         self.current_deepth += 1
        # 抓取过程主函数(方法二)
    def crawling(self, seeds, crawl_deepth):
        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:")
    # 获取源码中得超链接
    def getHyperLinks(self, url):
        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

    # 获取网页源码
    def getPageSource(self, url):
        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)


# 爬取百度超链接,深度为3
if __name__ == '__main__':
    main("http://www.baidu.com", 3)

第3关:爬取与反爬取

任务描述

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

编程要求

请仔细阅读右侧代码,结合相关知识,在 Begin-End 区域内进行代码补充,实现对 https://www.zhihu.com/ 该网址所有信息的爬取,并将结果保存在 step3/result.txt 中。

测试说明

平台会对你编写的代码进行测试:

预期输出:
采集成功

开始你的任务吧,祝你成功!

import urllib.request
def spider():
    url="https://www.zhihu.com/"
    # ********** Begin **********#
    # 构建opener
    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 中。

编程要求

请仔细阅读右侧代码,结合相关知识,在 Begin-End 区域内进行代码补充,使用随机请求头爬取 www.qiushibaike.com/text/ 前两页的段子内容,并保存在 ./step4/content.txt 中。

测试说明

平台会对你编写的代码进行测试:

预期输出:  
第1页采集成功  
第2页采集成功  
内容保存成功  

开始你的任务吧,祝你成功!

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)
    #********** 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 **********#
  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
[入门数据分析的第一堂课]这是一门为数据分析小白量身打造的课程,你从网络或者公众号收集到很多关于数据分析的知识,但是它们零散不成体系,所以第一堂课首要目标是为你介绍:Ø  什么是数据分析-知其然才知其所以然Ø  为什么要学数据分析-有目标才有动力Ø  数据分析的学习路线-有方向走得更快Ø  数据分析的模型-分析之道,快速形成分析思路Ø  应用案例及场景-分析之术,掌握分析方法[哪些同学适合学习这门课程]想要转行做数据分析师的,零基础亦可工作中需要数据分析技能的,例如运营、产品等对数据分析感兴趣,想要更多了解的[你的收获]n  会为你介绍数据分析的基本情况,为你展现数据分析的全貌。让你清楚知道自己该如何在数据分析地图上行走n  会为你介绍数据分析的分析方法和模型。这部分是讲数据分析的道,只有学会底层逻辑,能够在面对问题时有自己的想法,才能够下一步采取行动n  会为你介绍数据分析的数据处理和常用分析方法。这篇是讲数据分析的术,先有道,后而用术来实现你的想法,得出最终的结论。n  会为你介绍数据分析的应用。学到这里,你对数据分析已经有了初步的认识,并通过一些案例为你展现真实的应用。[专享增值服务]1:一对一答疑         关于课程问题可以通过微信直接询问老师,获得老师的一对一答疑2:转行问题解答         在转行的过程中的相关问题都可以询问老师,可获得一对一咨询机会3:打包资料分享         15本数据分析相关的电子书,一次获得终身学习
数据可视化是数据科学领域中重要的一环,它通过图表、图形和其他可视化工具将数据呈现出来,以便能够更好地理解和分析数据。 首先,数据可视化可以帮助我们更好地理解数据。通过将数据可视化成图表或图像,我们可以直观地看到数据的分布、趋势和模式。这些可视化结果可以让我们更容易地发现数据中的有意义的信息,并且帮助我们深入理解数据所传达的含义。 其次,数据可视化还可以帮助我们发现数据中的异常值。通过对数据进行可视化,我们可以快速地发现与众不同的数据点或异常模式。这些异常值可能是我们的数据收集过程中的错误,或者是数据背后隐藏的重要信息。通过识别和处理这些异常值,我们可以提高数据质量和分析的准确性。 此外,数据可视化也有助于数据的传达和沟通。在现实世界中,不同背景的人对于数据的理解能力和统计分析的能力有所差异。数据可视化可以帮助我们以更直观的方式向其他人传达数据,使得他们更容易理解和接受数据的分析结果。通过合适的图表和图形,我们可以有效地解释数据背后的趋势和关系,并与其他人进行更有意义的讨论和决策。 综上所述,数据可视化在数据科学中起着重要的作用。它不仅帮助我们更好地理解和分析数据,发现异常值,还能够向他人有效传达和沟通数据。因此,在进行数据科学工作时,数据可视化是必不可少的一项技能和工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄九Coral

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值