先來張爬取結果的截圖
再來份代碼吧
# 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>' # 這裏除去了副標題,(根據  空格號進行篩選)
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的頁面。
遇到的知識點:
- 正則的簡單寫法:例如
regCommend = r'<span>(.*?)</span>'
# 取出引言 希望讓人自由
regScrip = r'.*?"inq">(.*?)</span>'
- 集合的去掉不要的元素:
commends.remove('·')
commends.remove('更多')
commends.remove('{{= year}}')
commends.remove('{{= sub_title}}')
commends.remove('{{= address}}')
commends.remove('集數未知')
commends.remove('共{{= episode}}集')
- 整理成一條信息:
ver_info = list(zip(titleStr, commends, list_scrip))
- 用了一個線程爬取,我也不知道這是單線程爬取,反正是第一次加入吧。
t1 = threading.Thread(target=write())
t1.start()
- 今天晚上用的最多的時間是GUI方面
過程:
本來數據在正則那稍微花了點時間,但是在GUI方面花的卻是很長時間,搞的自己蒙圈了。在這裏應該給自己提一個醒,東西一次性不要學太多,一個一個慢慢的學 雖然 一次性學的東西不會很多,但是學的印象會深刻很多。所以,歸總一下,這次學的算是上面的幾點吧,主要是現在是敢要正則這玩意了, 雖然用的很淺,但是,現在是對python3 不那麼陌生。之前是一個都搞不出來。現在是稍微有點 入門的感覺,離自己想要的還有很長很長的路啊。。
總結:
下次練習,我也暫時不知道做什麼,這些例子都是從網上給照過來的, 然後自己稍微跟着自己的感覺走一下,網上找的例子也不知道是2.x 還是3.x的,結果到後來才發現, 是2.x 的, 只是感覺蛋疼。無語。今晚雖然花的時間比較多,但是效果還是挺不錯的。好好學習,加把勁。
喜歡的可以給我點個贊,讓我知道你也因爲你的夢想路過這裏。