from bs4 import BeautifulSoup #網頁解析,擷取資料
import sys #正規表達式,進行文字比對
import re
import urllib.request,urllib.error #指定url,擷取網頁資料
import xlwt #使用表格
import sqlite3
import lxml
以上是引用的庫,引用庫的方法很簡單,直接上圖:

上面第一步算有了,下面分子產品來,步驟算第二步來:
這個放在開頭
1 def main():
2 baseurl ="https://movie.douban.com/top250?start="
3 datalist = getData(baseurl)
4 savepath=(\'douban.xls\')
5 saveData(datalist,savepath)
這個放在末尾
1 if __name__ == \'__main__\':
2 main()
不難看出這是主函數,裡面的話是對子函數的調用,下面是第三個步驟:子函數的代碼
對網頁正則表達提取(放在主函數的後面就可以)
1 findLink = re.compile(r\'<a href="(.*?)">\') #建立正規表達式對象,表示規則(字元串的模式)
2 #影片圖檔
3 findImg = re.compile(r\'<img.*src="(.*?)" width="100"/>\',re.S)#re.S取消換行符
4 #影片片面
5 findtitle= re.compile(r\'<span class="title">(.*?)</span>\')
6 #影片評分
7 fileRating = re.compile(r\'<span class="rating_num" property="v:average">(.*?)</span>\')
8 #找到評價的人數
9 findJudge = re.compile(r\'<span>(\d*)人評價</span>\')
10 #找到概識
11 findInq =re.compile(r\'<span class="inq">(.*?)</span>\')
12 #找到影片的相關内容
13 findBd = re.compile(r\'<p class="">(.*?)</p>\',re.S)
爬資料核心函數
1 def getData(baseurl):
2 datalist=[]
3 for i in range(0,10):#調用擷取頁面的函數10次
4 url = baseurl + str(i*25)
5 html = askURl(url)
6 #逐一解析
7 soup = BeautifulSoup(html,"html.parser")
8 for item in soup.find_all(\'div\',class_="item"):
9 #print(item)
10 data=[]
11 item = str(item)
12
13 link = re.findall(findLink,item)[0] #re庫用來通過正規表達式查找指定的字元串
14 data.append(link)
15 titles =re.findall(findtitle,item)
16 if(len(titles)==2):
17 ctitle=titles[0].replace(\'\xa0\',"")
18 data.append(ctitle)#添加中文名
19 otitle = titles[1].replace("\xa0/\xa0Perfume:","")
20 data.append(otitle)#添加外國名
21 else:
22 data.append(titles[0])
23 data.append(\' \')#外國名字留白
24
25 imgSrc = re.findall(findImg,item)[0]
26 data.append(imgSrc)
27
28 rating=re.findall(fileRating,item)[0]
29 data.append(rating)
30
31 judgenum = re.findall(findJudge,item)[0]
32 data.append(judgenum)
33
34 inq=re.findall(findInq,item)
35 if len(inq) != 0:
36 inq =inq[0].replace(".","")
37 data.append(inq)
38 else:
39 data.append(" ")
40 bd=re.findall(findBd,item)[0]
41 bd=re.sub(\'<br(\s+)?/>(\s+)?\'," ",bd) #去掉<br/>
42 bd =re.sub(\'\xa0\'," ",bd)
43 data.append(bd.strip()) #去掉前後的空格
44
45 datalist.append(data) #把處理好的一部電影資訊放入datalist
46
47 return datalist
擷取指定網頁内容
1 def askURl(url):
2
3 head = {
4 "User-Agent": "Mozilla / 5.0(Windows NT 10.0;WOW64) Apple"
5 +"WebKit / 537.36(KHTML, likeGecko) Chrome / 78.0.3904.108 Safari / 537.36"
6 }
7 #告訴豆瓣我們是浏覽器我們可以接受什麼水準的内容
8 request = urllib.request.Request(url,headers=head)
9 html=""
10 try:
11 response = urllib.request.urlopen(request)
12 html = response.read().decode("utf-8")
13 # print(html)
14 except urllib.error.URLError as e:
15 if hasattr(e,"code"):
16 print(e.code)
17 if hasattr(e,"reason"):
18 print(e.reason)
19 return html
将爬下來的資料儲存到表格中
1 ef saveData(datalist,savepath):
2 print("儲存中。。。")
3 book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 建立workbook對象
4 sheet = book.add_sheet(\'douban\',cell_overwrite_ok=True) #建立工作表 cell_overwrite_ok表示直接覆寫
5 col = ("電影詳情連結","影片中文網","影片外國名","圖檔連結","評分","評價數","概況","相關資訊")
6 for i in range(0,8):
7 sheet.write(0,i,col[i])
8 for i in range(0,250):
9 print("第%d條" %(i+1))
10 data = datalist[i]
11 for j in range(0,8):
12 sheet.write(i+1,j,data[j])
13
14 book.save(savepath)
以上就是整個爬資料的整個程式,這僅僅是一個非常簡單的爬取,如果想要爬更難的網頁需要實時分析
整個程式代碼
1 from bs4 import BeautifulSoup #網頁解析,擷取資料
2 import sys #正規表達式,進行文字比對
3 import re
4 import urllib.request,urllib.error #指定url,擷取網頁資料
5 import xlwt #使用表格
6 import sqlite3
7 import lxml
8
9 def main():
10 baseurl ="https://movie.douban.com/top250?start="
11 datalist = getData(baseurl)
12 savepath=(\'douban.xls\')
13 saveData(datalist,savepath)
14 #影片播放連結
15 findLink = re.compile(r\'<a href="(.*?)">\') #建立正規表達式對象,表示規則(字元串的模式)
16 #影片圖檔
17 findImg = re.compile(r\'<img.*src="(.*?)" width="100"/>\',re.S)#re.S取消換行符
18 #影片片面
19 findtitle= re.compile(r\'<span class="title">(.*?)</span>\')
20 #影片評分
21 fileRating = re.compile(r\'<span class="rating_num" property="v:average">(.*?)</span>\')
22 #找到評價的人數
23 findJudge = re.compile(r\'<span>(\d*)人評價</span>\')
24 #找到概識
25 findInq =re.compile(r\'<span class="inq">(.*?)</span>\')
26 #找到影片的相關内容
27 findBd = re.compile(r\'<p class="">(.*?)</p>\',re.S)
28
29 def getData(baseurl):
30 datalist=[]
31 for i in range(0,10):#調用擷取頁面的函數10次
32 url = baseurl + str(i*25)
33 html = askURl(url)
34 #逐一解析
35 soup = BeautifulSoup(html,"html.parser")
36 for item in soup.find_all(\'div\',class_="item"):
37 #print(item)
38 data=[]
39 item = str(item)
40
41 link = re.findall(findLink,item)[0] #re庫用來通過正規表達式查找指定的字元串
42 data.append(link)
43 titles =re.findall(findtitle,item)
44 if(len(titles)==2):
45 ctitle=titles[0].replace(\'\xa0\',"")
46 data.append(ctitle)#添加中文名
47 otitle = titles[1].replace("\xa0/\xa0Perfume:","")
48 data.append(otitle)#添加外國名
49 else:
50 data.append(titles[0])
51 data.append(\' \')#外國名字留白
52
53 imgSrc = re.findall(findImg,item)[0]
54 data.append(imgSrc)
55
56 rating=re.findall(fileRating,item)[0]
57 data.append(rating)
58
59 judgenum = re.findall(findJudge,item)[0]
60 data.append(judgenum)
61
62 inq=re.findall(findInq,item)
63 if len(inq) != 0:
64 inq =inq[0].replace(".","")
65 data.append(inq)
66 else:
67 data.append(" ")
68 bd=re.findall(findBd,item)[0]
69 bd=re.sub(\'<br(\s+)?/>(\s+)?\'," ",bd) #去掉<br/>
70 bd =re.sub(\'\xa0\'," ",bd)
71 data.append(bd.strip()) #去掉前後的空格
72
73 datalist.append(data) #把處理好的一部電影資訊放入datalist
74
75 return datalist
76
77 #得到指定一個url的網頁内容
78 def askURl(url):
79
80 head = {
81 "User-Agent": "Mozilla / 5.0(Windows NT 10.0;WOW64) Apple"
82 +"WebKit / 537.36(KHTML, likeGecko) Chrome / 78.0.3904.108 Safari / 537.36"
83 }
84 #告訴豆瓣我們是浏覽器我們可以接受什麼水準的内容
85 request = urllib.request.Request(url,headers=head)
86 html=""
87 try:
88 response = urllib.request.urlopen(request)
89 html = response.read().decode("utf-8")
90 # print(html)
91 except urllib.error.URLError as e:
92 if hasattr(e,"code"):
93 print(e.code)
94 if hasattr(e,"reason"):
95 print(e.reason)
96 return html
97
98 def saveData(datalist,savepath):
99 print("儲存中。。。")
100 book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 建立workbook對象
101 sheet = book.add_sheet(\'douban\',cell_overwrite_ok=True) #建立工作表 cell_overwrite_ok表示直接覆寫
102 col = ("電影詳情連結","影片中文網","影片外國名","圖檔連結","評分","評價數","概況","相關資訊")
103 for i in range(0,8):
104 sheet.write(0,i,col[i])
105 for i in range(0,250):
106 print("第%d條" %(i+1))
107 data = datalist[i]
108 for j in range(0,8):
109 sheet.write(i+1,j,data[j])
110
111 book.save(savepath)
112
113 if __name__ == \'__main__\':
114 main()
如果有什麼問題,可以直接留言,再次歡迎光臨!!!!