14《Python 原生爬虫教程》开发小案例-综合运用

学习了这么多知识,这节课我们来实践一下,我们在这节课会设计一个小爬虫来爬取慕课网所有的免费课信息。当然,爬取慕课网所有免费课信息只是一个大的目标而已,具体要实现这个目标我们还需要对划分步骤,将一个大目标分解成一个个的小目标才可以。在实际的开发工作中我们也需要这样,拿到需求之后不要上来就开始写代码,然后一边写一边运行调试,虽然这样不能说错吧,但是却跟装运气一样,试对了就对了,错了还一直在哪里纠结。下面我们先来看下这个小爬虫的案例步骤:

1. 案例步骤与目标:

  1. 分析网站
  2. 书写程序
  3. 运行程序,并将结果存入MongoDB

1.1 目标:

通过本案例,学习BeautifulSoup的网站分析方法,以及掌握将数据存入MongoDB

1.2 分析网站

第一步,打开慕课网网址,然后点击免费课程,效果如下:

5e959d620968a4d819201020.png

接下来,我们右键单击鼠标,效果如下:

5e959d6909d2964c04430369.jpg

点击 Inspect 后,在浏览器的下端,会弹出浏览器 debug 控制面板:


5e959d72096f200419201020.png

单击左上角的小三角,然后选定一个课程,效果如下:

5e959d7a09c1ee5319201020.jpg

如下图阴影部分所示,是图片的在 html 中的位置,我们需要整个课程的信息,因此提取 course-card-content 作为基本模块:


5e959d860994a75719201020.png

在程序里,我们需要使用 BeautifulSoup 定位到到这里。

2. 书写程序

我们先来看一下代码的架构:

5e959d900916266609820783.jpg

接下来,让我们看看所有代码。

import requests
from bs4 import BeautifulSoup   
from  pprint import pprint
import os
import lxml
import pymongo

headers = {'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36'} # 请求头部

def get_course_info():
    """ get all course basic unit """

    url = "https://www.imooc.com/course/list" #慕课网免费课地址
    r = requests.get(url, headers= headers) # 发送请求
    bs = BeautifulSoup(r.text, "lxml")   # 解析网页
    course_data = bs.find_all("div", class_="course-card-container") # 定位课程信息
    return course_data


def save_pics(course_data):
    """ save pics from imooc free course """

    for each_item in course_data:
        img = each_item.find("img")
        image_link = img.attrs["data-original"].split("/")
        image_address = "http:" + img.attrs["data-original"] 
        with open(image_link[-1],'wb+') as f:
            res = requests.get(image_address, headers= headers) # 发送请求
            f.write(res.content)


def save_courses_to_mongodb(mongod_con, course_data):
    """ save info to mongodb """

    for each_item in course_data:
        imgs = each_item.find("img")
        desc = each_item.find("p", class_="course-card-desc") # 定位课程信息
        class_name = each_item.find("h3", class_="course-card-name") # 定位课程信息
        imooc_dict = { "class_name": class_name.getText(), "class_pics": imgs.attrs["data-original"], "people":desc.getText()}
        x = mongod_con.insert_one(imooc_dict)


def create_local_pic_dir():
    """ if don't have local dir, create one for holding the pics which download from the imooc. """

    directory = os.path.dirname(os.path.realpath(__file__)) + '/imooc_pics/'    
    if not os.path.exists(directory):
        os.makedirs(directory)
    os.chdir(directory)


def db_connectin():
    """ Connection to local mongo db service."""

    try:
        myclient = pymongo.MongoClient("mongodb://localhost:27017/")
        mydb = myclient["practice"]
        mongod_con = mydb["imooc_courses"]
    except Exception as e:
        print("ERROR(MongoPipeline):", e)

    return mongod_con


def main():
    """ This is the main entry for running code.""" 

    create_local_pic_dir()
    mycol = db_connectin()

    data = get_course_info()

    if data:
        save_pics(data)
        save_courses_to_mongodb(mycol, data)

if __name__ == "__main__":
    main()


代码主要有 6 个函数:

  • create_local_pic_dir: 用来创建本地文件夹,来存储爬取的图片;
  • db_connectin: 用来连接 mongodb;
  • get_course_info :用来获取课程基本信息;
  • save_pics :函数将图片存储在本地;
  • save_courses_to_mongodb :将数据存储到 MongoDB;
  • main :负责运行程序。

2.1 create_local_pic_dir

首先,在本地创建一个文件夹,来存储从慕课网下载下来的图片信息。

2.2 db_connectin

建立本地的连接,并返回一个连接句柄。

2.3 get_course_info

通过前面网站的分析,我们可以通过调用 bs4 的 find_all() 方法来定位课程的基本单元,然后通过遍历,获取课程的详细信息。

2.4 save_pics

在存储图片的时候,我们需要提取图片的名称,使用 split 将网址分开,然后取倒数第一数据,就是图片的名称。

2.5 save_courses_to_mongodb

在我们成功连接 mongdb 之后,通过调用 insert_one() 方法,我们可以把课程的字典信息,一条一条的存储到 mongodb 中。

2.6 运行程序,并将结果存入MongoDB

可以看到,程序创建了 imooc_pics 文件夹,里面存储了我们从慕课网下载的免费课程的介绍图片。

5e959da3093d981503170487.png

打开一张图片可以看到是一张课程的封面图:

5e959da909e5138405960324.png

最后,我们使用 MongoDB 的可视化工具,看一下图片的存储情况,效果如下图所示:

5e959db309e3f5cd14590800.png

3. 小结

这一小节,我们通过实际的案例,熟悉了网址的分析,数据的存储,以及图片的存储。通过整个案例,我们需要掌握 BeautifulSoup 的用法,以及 mongoDB 数据存储的使用。掌握了这个完整的案例,同学们可以举一反三,可以使用相同的步骤轻松爬取的许多类似的网站。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,576评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,515评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,017评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,626评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,625评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,255评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,825评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,729评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,271评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,363评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,498评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,183评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,867评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,338评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,458评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,906评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,507评论 2 359

推荐阅读更多精彩内容