append从一个添加到另一_真特么激动第一个爬虫----爬取豆瓣电影top250
養成習慣,先贊后看!!!
前言
之前一直對爬蟲有興趣,但是一直沒有真正靜下心來去好好學習過,這一段時間跟著b站上的一個教程做了自己人生中第一個爬蟲程序,還是很有成就感的。
準備工作
1. 我們爬取一個網站首先要具備以下這些知識,否則實際操作起來還是比較困難的,比如說h5,正則表達式,基礎的數據結構,python的基本語法知識。 2. 我們安裝完python環境以及編譯器之后,需要引入我們所需要的的模塊
按照這個步驟將我們所需要的的模塊安裝完成即可。 本次所需要的的模塊有:bs4:主要用來分析網頁信息結構 xlwt:主要負責Excel表格的讀寫操作 flask:web開發微框架 jinja2:模板引擎 wordcloud:主要用來實現詞云展示 #如果出現安裝不成功,可以往博客下面看,有解決方案 matplotlib:繪圖,數據可視化 jieba:將句子進行分詞
爬蟲
分析網頁信息
既然要爬取網站信息,那么我們首先要先看懂網站的URL地址,這樣才能方便我們爬取相關信息。我們先分析他的URL地址:
URL地址格式基本就是:https://movie.douban.com/top250?start=(這里我們需要添加參數)
于是我們便可以先嘗試先利用URL先爬取整個HTML頁面
import urllib.request,urllib.error,urllib.parse #制定URL
#爬取指定頁面的數據
def askURL(url):#這里的URL可以換成上面的URL地址進行測試head={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"} #設置請求頭,模擬瀏覽器向服務器發請求,并且讓服務器知道我們瀏覽器的版本req=urllib.request.Request(url=url,headers=head)response=urllib.request.urlopen(req) #接收服務器發回來的響應html=response.read().decode("utf-8") #解析響應print(html)return html 利用正則表達式抓取有有用信息
我們首先先認識一些基礎的正則符號
其次我們再來簡單分析一下我們的網頁結構信息 我們可以清楚的看到我們所需要的的信息都是存儲在各式各樣的標簽之中,所以這時候就需要我們的正則表達式來對我們所需要的的信息進行提取。 舉一個例子: 比如說我們現在要爬取影片詳情的鏈接,那么我們就需要制定正則表達式的規則,讓這個規則區幫助我們從整個html頁面中找我們所需要的的信息。#影片詳情鏈接規則
findlink=re.compile(r'<a href="(.*?)">') #創建正則表達式對象,表示規則(字符串的模式)
#這里我們可以先復制這個紅色框中的內容過來,然后用(.*)來替換我們所需要的爬取的內容 這個電影信息的正則表達式爬取規則
import re #正則表達式,進行文字匹配
#影片詳情鏈接規則
findlink=re.compile(r'<a href="(.*?)">') #創建正則表達式對象,表示規則(字符串的模式)
#影片圖片
findImgsrc=re.compile(r'<img.* src="(.*?)"',re.S) #re.S讓換行符包括在字符中
#影片片名
findTitle=re.compile(r'<span class="title">(.*)</span>')
#影片評分
findRating=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#影片評價人數
findNum=re.compile(r'<span>(d*)人評價</span>')
#影片概況
findContent=re.compile(r'<span class="inq">(.*)</span>')
#找到影片的相關內容
findBd=re.compile(r'<p class="">(.*?)</p>',re.S) 簡單的清洗數據
因為我們爬取完的數據可能存在部分換行符,以及各種符號的差異,所以我們簡單的用字符串替換的方法進行清洗,并且將數據存儲到一個列表之中。
from bs4 import BeautifulSoup #網頁解析,獲取數據
#爬取網頁
def getData(baseurl):datalist=[]# 2.逐一解析數據for i in range(0,10):url=baseurl+str(i*25)html=askURL(url)#逐一解析數據soup=BeautifulSoup(html,"html.parser")for item in soup.find_all("div",class_="item"): #查找符合要求的字符串,形成列表#print(item) #測試;查看電影item全部信息data=[] #保存一部電影的全部信息item=str(item)link=re.findall(findlink,item)[0] #re庫通過正則表達式查找指定字符串data.append(link) #添加影片鏈接img = re.findall(findImgsrc,item)data.append(img) #添加影片圖片title=re.findall(findTitle,item)if(len(title)==2):data.append(title[0]) #添加影片中文名otitle=title[1].replace("xa0/xa0","") #去掉外文電影名中的符號data.append(otitle) #添加影片外文名else:data.append(title)data.append(" ")rating=re.findall(findRating,item)[0]data.append(rating) #添加影片評分num = re.findall(findNum, item)[0]#print(type(num))data.append(num) #添加影片評分人數content=re.findall(findContent,item)if len(content)!=0:content=content[0].replace("。","")data.append(content) #添加影片概述else:data.append(" ")bd=re.findall(findBd,item)[0]bd=re.sub("<br(s+)?/>(s+)?"," ",bd) #去掉</br>bd=re.sub("/"," ",bd)data.append(bd.strip()) #添加影片詳情datalist.append(data)#print(datalist)return datalist 存儲數據
1. 首先我們先介紹一下如何存儲在Excel中 這里我們就需要用到xlwt這個模塊,主要創建Excel文件對象,以及sheet工作對象,之后將我們爬取的數據寫進sheet對象之中即可。
#3.保存數據
def saveData(datalist,savepath):book = xlwt.Workbook(encoding="utf-8") # 創建workbook對象sheet = book.add_sheet("豆瓣電影top250",cell_overwrite_ok=True) # 創建工作表col=("電影詳情鏈接","圖片鏈接","影片中文名","影片外文名","評分","評分人數","概況","相關信息")for i in range(0, 8):sheet.write(0,i,col[i]) #列名print("save")for i in range(1,251):print("第%d條數據" % i)for j in range(0,8):sheet.write(i,j,datalist[i-1][j])book.save(savepath) Excel數據展示
2. 我們將數據存儲在SQLite數據庫之中 這個SQLite數據庫是python自帶的,對于初學者,使用起來十分的方便。 我們先嘗試連接SQLite數據庫。
這樣我們便能成功連接上SQLite數據庫了。#初始化數據庫并建立相應的數據表
def init_db(dbpath):#代表我們所要創建的數據庫的名稱sql='''create table movie250 #創建數據表(id integer primary key autoincrement,info_link text,pic_link text,cname varchar,ename varchar,score numeric ,rated numeric ,instroduction text,info text)''' #創建數據表conn=sqlite3.connect(dbpath)cursor=conn.cursor()cursor.execute(sql)conn.commit()conn.close()#將我們爬取到的數據插入到相應的數據表之中
def saveDataDB(datalist,dbpath):init_db(dbpath)conn=sqlite3.connect(dbpath)curser=conn.cursor();for data in datalist:for index in range(len(data)):if index == 4 or index == 5:continuedata[index]=str(data[index]) #這句話大家可以刪了試試,有的會出現list無法轉換到str類型的錯誤,也是博主遇到的一個小bugdata[index] = '"' + data[index] + '"'sql = '''insert into movie250 (info_link,pic_link,cname,ename,score,rated,instroduction,info) values(%s)''' % ",".join(data)print(sql)curser.execute(sql)conn.commit()curser.close()conn.close() 數據庫數據展示:
網頁模板制作
這里我挑選的是模板之家提供的模板seo營銷推廣公司響應式網站模板,但是下載是要付費的,剛好群里這些資源都已經提供了,所以可以拿來直接用。資源在下面 鏈接:https://pan.baidu.com/s/1EHS9jvByALEYY80uB5a8oA 提取碼:fwfs 打開之后就是這樣的一個樣式
之后我們來創建一個flask程序 之后我們將我們之前的網頁文件導入進來 之后我們運行app.py就可以看到我們的界面了表格化展示爬蟲得到的數據
這里就像我們之前操作數據庫的一樣,先連接數據庫,然后創建游標,之后通過游標將我們的數據取出來即可
@app.route('/movie')
def movie():datalist=[]conn=sqlite3.connect("movie.db")cur=conn.cursor()sql='''select * from movie250'''data=cur.execute(sql)for item in data:datalist.append(item)cur.close()conn.close()# for movie in datalist:# print(movie[2])#webbrowser.open(movie[2])return render_template("movie.html",datalist=datalist) 這里面會出現一個小bug,就是展示電影圖片時,一開始我們讀出來的圖片都是這樣的,這時候是因為從來沒有加載過,所以圖片顯示不出來,但是一共有250張圖片,總不能一張一張的區點吧,所以我們還是可以通過python編寫腳本來幫助我們快速打開這些圖片的網頁即注釋掉的代碼
for movie in datalist:print(movie[2])webbrowser.open(movie[2]) 這樣我們就能快速打開這些圖片網頁了。編寫完成之后就是這樣
echarts數據可視化
首先先提供echarts的下載地址:echarts在線定制 大家可以根據自己的需要進行定制。 下載完成之后添加到static/assets/js/echarts.min.js路徑下即可。 之后我們可以先通過官方文檔的一個小栗子幫助我們快速入門 注意echarts的路徑要與自己項目的路徑相匹配。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><!-- 引入 ECharts 文件 --><script src="echarts.min.js"></script><title>Title</title>
</head>
<body>
<!-- 為 ECharts 準備一個具備大小(寬高)的 DOM --><div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">// 基于準備好的dom,初始化echarts實例var myChart = echarts.init(document.getElementById('main'));// 指定圖表的配置項和數據var option = {title: {text: 'ECharts 入門示例'},tooltip: {},legend: {data:['銷量']},xAxis: {data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]},yAxis: {},series: [{name: '銷量',type: 'bar',data: [5, 20, 36, 10, 10, 20]}]};// 使用剛指定的配置項和數據顯示圖表。myChart.setOption(option);</script>
</body>
</html> 效果如下:
并且官方也提供了十分多的模板,我們只需要負責填充數據就可以實現這些酷炫的圖表了 接下來就是編寫我們項目的圖表了,我們也是選用柱狀圖來進行展示。展示每個評分所擁有的電影數量,所以我們就需要從數據庫中提取出評分,以及相應評分所包含的電影數量。@app.route('/score')
def score():num=[]score=[]conn = sqlite3.connect("movie.db")cur = conn.cursor()sql = '''select score,count(score) from movie250 group by score'''data = cur.execute(sql)for item in data:#num.append(item[1])score.append(str(item[0]))num.append(item[1])cur.close()conn.close()return render_template("score.html",score=score,num=num) 這樣我們只需要在HTML文件中將這兩個數據填充相應的圖表位置即可。
<script type="text/javascript">
var dom = document.getElementById("main");
var myChart = echarts.init(dom);
var app = {};
option = null;
option = {color:['#3398DB'],tooltip: {trigger: 'axis',axisPointer: {type: 'shadow'}},grid: {left: '3%',right:'4%',bottom:'3%',containLabel:true},xAxis: {type: 'category',data: {{ score|tojson }}<!--['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun','999']-->},yAxis: {type: 'value'},series: [{data: {{ num }},<!--[120, 20, 150, 80, 70, 110, 130,200],-->barWidth:'45%',type:'bar'}]
};
;
if (option && typeof option === "object") {myChart.setOption(option, true);
}</script> 這樣便能顯示我們的圖表了。 效果如下:
wordcloud詞云展示
這里如果大家添加wordcloud模塊添加不上的話,可以通過這種方式進行修改
修改這里的默認下載倉庫地址 可以修改成: 清華: https://pypi.tuna.tsinghua.edu.cn/simple阿里: http://mirrors.aliyun.com/pypi/simple/豆瓣: http://pypi.douban.com/simple/華中理工大學: http://pypi.hustunique.com/山東理工大學: http://pypi.sdutlinux.org/中國科學技術大學: http://pypi.mirrors.ustc.edu.cn/之后我們依舊照著之前的方式添加模塊就行了
import jieba #將句子進行分詞
from matplotlib import pylab as plt #繪圖,數據可視化
from wordcloud import WordCloud #制作詞云
from PIL import Image #圖片處理
import numpy as np #矩陣運算
import sqlite3 #數據庫操作
con=sqlite3.connect("movie.db")
cur=con.cursor()
sql="select instroduction from movie250"
data=cur.execute(sql)
text=""
for item in data:text+=item[0]
#print(text)
cur.close()
con.close()
cut=jieba.cut(text)
string=",".join(cut)
print(len(string))img =Image.open(r".staticassetsimg123.jpg")
img_array=np.array(img) #將圖片轉換成數組
wc=WordCloud(background_color="white",mask=img_array,font_path="STXIHEI.TTF", #字體所在位置C:WindowsFonts# min_font_size=5,# max_font_size=120
)
wc.generate_from_text(string)#繪制圖片
fig=plt.figure(1)
plt.imshow(wc)
plt.axis("off")
#plt.show() #顯示生成的詞云文件#輸出詞云圖片
plt.savefig(r".staticassetsimgciyun.jpg",dpi=3600) #將句子進行分詞 最終成品展示
編寫網頁的步驟我都省略了,只保留了關鍵代碼。所有的代碼解釋我都放在注釋里了,并沒有詳細說明,如果有需要或者不懂的,可以私聊博主。 這里也貼上B站教學視頻地址
都看到這里了,如果覺得對你有幫助的話,可以關注博主的公眾號,新人up需要你的支持。本文由博客群發一文多發等運營工具平臺 OpenWrite 發布
總結
以上是生活随笔為你收集整理的append从一个添加到另一_真特么激动第一个爬虫----爬取豆瓣电影top250的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输卵管堵塞有无痛造影吗
- 下一篇: 宝马5系婚车一年大概能挣多少钱?