天天看點

爬蟲綜合大作業

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

可以用pandas讀出之前儲存的資料:

newsdf = pd.read_csv(r'F:\duym\gzccnews.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)

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資訊,隻需要基本的請求頭即可,具體需要哪些頭資訊也可以從浏覽器中擷取,首先構造必須要的請求參數,包括請求頭和查詢參數。

爬蟲綜合大作業
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("\n".join(blogs))
      
爬蟲綜合大作業

第四步:分詞處理并建構詞雲

爬蟲了所有資料之後,先進行分詞,這裡用的是結巴分詞,按照中文語境将句子進行分詞處理,分詞過程中過濾掉停止詞,處理完之後找一張參照圖,然後根據參照圖通過詞語拼裝成圖。

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)
      

最終效果圖:

爬蟲綜合大作業

總結:從李冰冰的微網誌動态可以看出,她是一個比較勵志的人,所散發的精神以積極向上為多。

參考:

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)