python3[爬蟲基礎入門實戰] 爬取豆瓣電影排行top250

先來張爬取結果的截圖

爬取豆瓣結果

再來份代碼吧

# encoding=utf8
import requests
import re
from bs4 import BeautifulSoup
from tkinter import scrolledtext  # 導入滾動文本框的模塊

from tkinter import ttk
import tkinter as tk

import threading


# 獲取網頁內容
def getHtml(ID):
    url = 'https://movie.douban.com/top250?start=%s&filter=' % ID
    print('url  ' + url)
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2372.400 QQBrowser/9.5.10548.400'
        ,
        'Cookie': 'bid=I0klBiKF3nQ; ll="118277"; gr_user_id=ffdf2f63-ec37-49b5-99e8-0e0d28741172; ap=1; _vwo_uuid_v2=8C5B24903B1D1D3886FE478B91C5DE97|7eac18658e7fecbbf3798b88cfcf6113; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1498305874%2C%22https%3A%2F%2Fbook.douban.com%2Ftag%2F%25E9%259A%258F%25E7%25AC%2594%3Fstart%3D20%26type%3DT%22%5D; _pk_id.100001.4cf6=4e61f4192b9486a8.1485672092.5.1498306809.1498235389.; _pk_ses.100001.4cf6=*'

    }
    req = requests.get(url, headers)
    return req.text


# 解析網頁並且獲取相應內容
def parseHtml(html):
    # soup = BeautifulSoup(html,'lxml')   # 現在改爲用正則
    print('init html.....')
    # print(html)

    # 1 取出title
    # titleRe = r'<span class="title">(.*?)</span>'
    titleRe = r'<span class="title">(.[^&]*?)</span>'  # 這裏除去了副標題,(根據&nbsp 空格號進行篩選)
    regTitle = re.compile(titleRe)
    titleStr = re.findall(regTitle, html)
    # print(titleStr)
    # for verTitle in titleStr:
    #     print(verTitle)


    # 2 取出評分
    retStars = r'.*?"v:average">(.*?)</span>'
    regStars = re.compile(retStars)
    starts = re.findall(regStars, html)
    # print(starts)

    # 取出評價
    regCommend = r'<span>(.*?)</span>'
    regCommends = re.compile(regCommend)
    commends = []
    commends = re.findall(regCommends, html)
    # print(commends)
    commends.remove('·')
    commends.remove('更多')
    commends.remove('{{= year}}')
    commends.remove('{{= sub_title}}')
    commends.remove('{{= address}}')
    commends.remove('集數未知')
    commends.remove('共{{= episode}}集')
    # print(commends)

    # 取出導演,劇情(未實現)
    # regDoc= r'.*?<p class>(.*?)<br>'
    # regxDoc = re.compile(regDoc)
    # list_doc = re.findall(regxDoc,html)
    # print(list_doc)
    # print('*'*40)

    # 片言(未實現)
    # regAction = r'<p class>.*?<br>(.*?)</p>'
    # regx_action = re.compile(regAction)
    # list_action = re.findall(regx_action,html)
    # print(list_action)

    # 取出引言  希望讓人自由
    regScrip = r'.*?"inq">(.*?)</span>'
    regx_scrip = re.compile(regScrip)
    list_scrip = re.findall(regx_scrip, html)
    # print(list_scrip)

    # 取出圖片地址(未實現)
    # regImg = r'<div class="pic">.*?src= "(.*?)"'
    # regx_img = re.compile(regImg)
    # list_imgaddress = re.findall(regx_img,html)
    # print(list_imgaddress)

    ver_info = list(zip(titleStr, commends, list_scrip))
    return ver_info


# html = getHtml(0)
# ver_infos = parseHtml(html)
# print(ver_infos)


def write():
    print('開始爬取內容')
    ID = 0
    nums = 0
    while ID < 250:
        html = getHtml(ID)
        ver_infos = parseHtml(html)
        ID += 25
        for ver in ver_infos:
            varStr = 'No.%d\t%-30s%s\t(描述:)%-30s' % (nums, ver[0], ver[1],ver[2])
            print(varStr)
            nums += 1
            print('爬取成功'+str(nums))
def start():
    print('start  init ....')
    t1 = threading.Thread(target=write())
    t1.start()

start()
# 以下方法丟棄
# def save():
#     print('save  init ...')
#     content = name.get()
#     textFile = open(u'C:\\豆瓣電影排行250.txt')
#     textFile.write(content)
#     textFile.close()
#
# print('^'*40)
# win = tk.Tk()
# win.title('呵呵呵')
#
# # 滾動文本框
# scrolW = 30 # 設置文本框的長度
# scrolH = 3 # 設置文本框的高度
# scr = scrolledtext.ScrolledText(win, width=scrolW, height=scrolH, wrap=tk.WORD)     # wrap=tk.WORD   這個值表示在行的末尾如果有一個單詞跨行,會將該單詞放到下一行顯示,比如輸入hello,he在第一行的行尾,llo在第二行的行首, 這時如果wrap=tk.WORD,則表示會將 hello 這個單詞挪到下一行行首顯示, wrap默認的值爲tk.CHAR
# scr.grid(column=0, columnspan=3)
#
# # 文本框
# name = tk.StringVar()     # StringVar是Tk庫內部定義的字符串變量類型,在這裏用於管理部件上面的字符;不過一般用在按鈕button上。改變StringVar,按鈕上的文字也隨之改變。
# nameEntered = ttk.Entry(win, width=42, textvariable=name)   # 創建一個文本框,定義長度爲12個字符長度,並且將文本框中的內容綁定到上一句定義的name變量上,方便clickMe調用
# nameEntered.grid(column=0, row=4)       # 設置其在界面中出現的位置  column代表列   row 代表行
# nameEntered.focus()     # 當程序運行時,光標默認會出現在該文本框中
#
# # 添加開始按鈕
# start = ttk.Button(win,text='開始',command=start())
# start.grid(column=0,row=0) #按鈕的添加位置
#
# # 保存按鈕
# save = ttk.Button(win,text='保存',command=save())
# save.grid(column=1,row=0)
#
# win.mainloop()


這次用的是正則來獲取內容的,有兩個字段在正則上卡住了, 問了羣裏也沒有人回,就暫且寫到這吧。 還是獲取的靜態html的頁面。

遇到的知識點:

  1. 正則的簡單寫法:例如 regCommend = r'<span>(.*?)</span>'
  # 取出引言  希望讓人自由
    regScrip = r'.*?"inq">(.*?)</span>'
  1. 集合的去掉不要的元素:
    commends.remove('·')
    commends.remove('更多')
    commends.remove('{{= year}}')
    commends.remove('{{= sub_title}}')
    commends.remove('{{= address}}')
    commends.remove('集數未知')
    commends.remove('共{{= episode}}集')
  1. 整理成一條信息:
 ver_info = list(zip(titleStr, commends, list_scrip))
  1. 用了一個線程爬取,我也不知道這是單線程爬取,反正是第一次加入吧。
    t1 = threading.Thread(target=write())
    t1.start()
  1. 今天晚上用的最多的時間是GUI方面

過程:

本來數據在正則那稍微花了點時間,但是在GUI方面花的卻是很長時間,搞的自己蒙圈了。在這裏應該給自己提一個醒,東西一次性不要學太多,一個一個慢慢的學 雖然 一次性學的東西不會很多,但是學的印象會深刻很多。所以,歸總一下,這次學的算是上面的幾點吧,主要是現在是敢要正則這玩意了, 雖然用的很淺,但是,現在是對python3 不那麼陌生。之前是一個都搞不出來。現在是稍微有點 入門的感覺,離自己想要的還有很長很長的路啊。。

總結:

下次練習,我也暫時不知道做什麼,這些例子都是從網上給照過來的, 然後自己稍微跟着自己的感覺走一下,網上找的例子也不知道是2.x 還是3.x的,結果到後來才發現, 是2.x 的, 只是感覺蛋疼。無語。今晚雖然花的時間比較多,但是效果還是挺不錯的。好好學習,加把勁。

喜歡的可以給我點個贊,讓我知道你也因爲你的夢想路過這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章