• 爬虫综合大作业


    作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159

    可以用pandas读出之前保存的数据:

    newsdf = pd.read_csv(r'F:duymgzccnews.csv')

    newsdf = pd.read_csv(r'F:gzccnews.csv')
    

      

    一.把爬取的内容保存到数据库sqlite3

    import sqlite3
    with sqlite3.connect('gzccnewsdb.sqlite') as db:
    newsdf.to_sql('gzccnews',con = db)

    with sqlite3.connect('gzccnewsdb.sqlite') as db:
    df2 = pd.read_sql_query('SELECT * FROM gzccnews',con=db)

    import sqlite3
    with sqlite3.connect('gzccnewsdb.sqlite') as db:
    newsdf.to_sql('gzccnews',con = db)
    with sqlite3.connect('gzccnewsdb.sqlite') as db:
    df2 = pd.read_sql_query('SELECT * FROM gzccnews',con=db)
    

      

    保存到MySQL数据库

    • import pandas as pd
    • import pymysql
    • from sqlalchemy import create_engine
    • conInfo = "mysql+pymysql://user:passwd@host:port/gzccnews?charset=utf8"
    • engine = create_engine(conInfo,encoding='utf-8')
    • df = pd.DataFrame(allnews)
    • df.to_sql(name = ‘news', con = engine, if_exists = 'append', index = False)
    import pandas as pd
    import pymysql
    from sqlalchemy import create_engine
    conInfo = "mysql+pymysql://user:@localhost:3306/gzccnews?charset=utf8"
    engine = create_engine(conInfo,encoding='utf-8')
    df = pd.DataFrame(allnews)
    df.to_sql(name = ‘news', con = engine, if_exists = 'append', index = False)
    

      

    二.爬虫综合大作业

    1. 选择一个热点或者你感兴趣的主题。
    2. 选择爬取的对象与范围。
    3. 了解爬取对象的限制与约束。
    4. 爬取相应内容。
    5. 做数据分析与文本分析。
    6. 形成一篇文章,有说明、技术要点、有数据、有数据分析图形化展示与说明、文本分析图形化展示与说明。
    7. 文章公开发布。

     我要爬取的对象和范围:李冰冰的微博内容

    爬取对象来源:https://m.weibo.cn/u/1192515960?uid=1192515960&luicode=10000011&lfid=100103type%3D3%26q%3D%E6%9D%8E%E5%86%B0%E5%86%B0

    第一步:分析网址

    分析浏览器发送请求的过程

    打开 Chrome 浏览器的调试功能,选择 Network 菜单,观察到获取微博数据的的接口是 https://m.weibo.cn/api/container/getIndex ,后面附带了一连串的参数,这里面有些参数是根据用户变化的,有些是固定的,先提取出来。

    uid=1192515960&
    luicode=10000011&
    lfid=100103type=3&q=李冰冰
    featurecode=20000320&
    type=user&
    containerid=1005051192515960
    

    再来分析接口的返回结果,返回数据是一个JSON字典结构,total 是微博总条数,每一条具体的微博内容封装在 cards 数组中,具体内容字段是里面的 text 字段。很多干扰信息已隐去。

    {
        "cardlistInfo": {
            "containerid": "1005051192515960",
            "total": 4963,
            "page": 2
        },
        "cards": [
            {
                "card_type": 9,
                "mblog": {
                    "created_at": "23小时前",
                    "idstr": "4369352550097750",
                    "text": "支持~",
                }
            }]
    }
    

    第二步:构建请求头和查询参数

    分析完网页后,开始用 requests 模拟浏览器构造爬虫获取数据,因为这里获取用户的数据无需登录微博,所以我们不需要构造 cookie信息,只需要基本的请求头即可,具体需要哪些头信息也可以从浏览器中获取,首先构造必须要的请求参数,包括请求头和查询参数。

    weibo-home2-header.png

    headers = {
        "Host": "m.weibo.cn",
        "Referer": "https://m.weibo.cn/u/1192515960",
        "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) "
                      "Version/9.0 Mobile/13B143 Safari/601.1",
    }
    
    params = {"uid": "{uid}",
              "luicode": "10000011",
              "type": "uid",
              "value": "1192515960",
              "containerid": "{containerid}",
              "page": "{page}"}
    
    • uid是微博用户的id
    • containerid虽然不知道什么意思,但也是和具体某个用户相关的参数
    • page 分页参数

    第三步:构造简单爬虫

    通过返回的数据能查询到总微博条数 total,爬取数据直接利用 requests 提供的方法把 json 数据转换成 Python 字典对象,从中提取出所有的 text 字段的值并放到 blogs 列表中,提取文本之前进行简单过滤,去掉无用信息。顺便把数据写入文件,方便下次转换时不再重复爬取。

    def fetch_data(uid=None, container_id=None):
        """
        抓取数据,并保存到CSV文件中
        :return:
        """
        page = 0
        total = 4754
        blogs = []
        for i in range(0, total // 10):
            params['uid'] = uid
            params['page'] = str(page)
            params['containerid'] = container_id
            res = requests.get(url, params=params, headers=HEADERS)
            cards = res.json().get("cards")
    
            for card in cards:
                # 每条微博的正文内容
                if card.get("card_type") == 9:
                    text = card.get("mblog").get("text")
                    text = clean_html(text)
                    blogs.append(text)
            page += 1
            print("抓取第{page}页,目前总共抓取了 {count} 条微博".format(page=page, count=len(blogs)))
            with codecs.open('weibo.txt', 'w', encoding='utf-8') as f:
                f.write("
    ".join(blogs))
    

    weibo-home3-spider.gif

    第四步:分词处理并构建词云

    爬虫了所有数据之后,先进行分词,这里用的是结巴分词,按照中文语境将句子进行分词处理,分词过程中过滤掉停止词,处理完之后找一张参照图,然后根据参照图通过词语拼装成图。

    def generate_image():
        data = []
        jieba.analyse.set_stop_words("./stopwords.txt")
    
        with codecs.open("weibo.txt", 'r', encoding="utf-8") as f:
            for text in f.readlines():
                data.extend(jieba.analyse.extract_tags(text, topK=20))
            data = " ".join(data)
            mask_img = imread('./52f90c9a5131c.jpg', flatten=True)
            wordcloud = WordCloud(
                font_path='msyh.ttc',
                background_color='white',
                mask=mask_img
            ).generate(data)
            plt.imshow(wordcloud.recolor(color_func=grey_color_func, random_state=3),
                       interpolation="bilinear")
            plt.axis('off')
            plt.savefig('./heart2.jpg', dpi=1600)
    

    最终效果图:

    weibo-home2-header2.png

    总结:从李冰冰的微博动态可以看出,她是一个比较励志的人,所散发的精神以积极向上为多。

    参考:


    32个Python爬虫项目


    都是谁在反对996?


    Python和Java薪资最高,C#最低!


    给《流浪地球》评1星的都是什么心态?


    《都挺好》弹幕数据,比剧情还精彩?


    爬了自己的微信好友,原来他们是这样的人……

    春节人口迁徙大数据报告!

    七夕前消费趋势数据

    爬了一下天猫上的Bra购买记录,有了一些羞羞哒的发现...

    Python做了六百万字的歌词分析,告诉你中国Rapper都在唱些啥

    分析了42万字歌词后,终于搞清楚民谣歌手唱什么了

    十二星座的真实面目

    唐朝诗人之间的关系到底是什么样的?

    中国姓氏排行榜

    三.爬虫注意事项

    1.设置合理的爬取间隔,不会给对方运维人员造成压力,也可以防止程序被迫中止。

    • import time
    • import random
    • time.sleep(random.random()*3)

    2.设置合理的user-agent,模拟成真实的浏览器去提取内容。

    1. 首先打开你的浏览器输入:about:version。
    2. 用户代理:
    3. 收集一些比较常用的浏览器的user-agent放到列表里面。
    4. 然后import random,使用随机获取一个user-agent
    5. 定义请求头字典headers={’User-Agen‘:}
    6. 发送request.get时,带上自定义了User-Agen的headers

    3.需要登录

    发送request.get时,带上自定义了Cookie的headers

    headers={’User-Agen‘:  

    'Cookie':    }

    4.使用代理IP

    通过更换IP来达到不断高 效爬取数据的目的。

    headers = {

        "User-Agent": "",

    }

    proxies = {

        "http": " ",

        "https": " ",

    }

    response = requests.get(url, headers=headers, proxies=proxies)

  • 相关阅读:
    Redis环境搭建(整合SprinigBoot一键切换集群和单机环境)
    Docker + SpringBoot2.0快速构建镜像
    kafka实现分布式事务
    【本地事物】
    【数据结构之二叉树】
    变量
    python 介绍
    编程语言的区别
    路飞学城python教程 第二章练习题
    windows下nginx配合ffmpeg推送视频流
  • 原文地址:https://www.cnblogs.com/lirou/p/10812810.html
Copyright © 2020-2023  润新知