爬取豆瓣top250電影的所有資訊并且存入表格和資料庫
原始碼及注釋:
# 爬取豆瓣top250電影的所有資訊
import urllib.request, urllib.error # 用于發送網路請求和requests功能相近
from bs4 import BeautifulSoup # 用于決議網頁
import re # 用于正則匹配
import xlwt # 用于表格的操作
import sqlite3 # 用于資料庫的操作
def main():
dbpath = "movie.db" # 資料庫路徑(相對路徑)
base_url = "https://movie.douban.com/top250?start=" # 待爬取網頁
data_list = get_data(base_url) # 獲取資料
save_xls(data_list) # 存盤資料進表格
save_db(data_list, dbpath) # 存盤資料進資料庫
def ask_url(url): # 訪問網頁的函式
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
} # 用于繞過418反爬蟲機制
request = urllib.request.Request(url=url, headers=head) # 制作請求頭
try:
response = urllib.request.urlopen(request) # 用于訪問網頁
html = response.read().decode("utf-8") # 接收網頁資訊
except urllib.error.URLError as e: # 例外處理
if hasattr(e, "code"):
print(e.code) # 列印狀態碼
if hasattr(e, "reason"):
print(e.reason) # 列印例外原因
return html
def get_data(base_url):
data_list = [] # 用于存取250條資料
for i in range(10):
url = base_url + str(i * 25) # 制作目標網頁串列
html = ask_url(url)
soup = BeautifulSoup(html, "html.parser") # 決議網頁,形成樹型資料結構
for item in soup.find_all("div", {"class": "item"}): # 獲取class=item的div內容
data = [] # 用于存一部電影的所有資訊
item = str(item)
link = re.findall(r'<a href="(.*?)">', item)[0] # 獲取詳情鏈接
data.append(link)
img_src = re.findall(r'<img alt=.*? class="" src="(.*?)"', item)[0] # 獲取圖片鏈接
data.append(img_src)
title = re.findall(r'<span class="title">(.*?)</span>', item)[0] # 獲取電影名
data.append(title)
other_title = re.findall(r'<span class="other">(.*?)</span>', item)[0] # 獲取其他名字
if len(other_title) != 0:
data.append(other_title.replace("\xa0/\xa0", " ")) # 替代掉不能識別的部分
else:
data.append(" ") # 對于沒有其他標題的電影用空格占位,防止存入表格和資料庫的時候出現問題
rating = re.findall(r'<span class="rating_num" property="v:average">(.*?)</span>', item)[0] # 獲取評分
data.append(rating)
rating_number = re.findall(r'span>(\d+)人評價</span>', item)[0] # 獲取評價人數
data.append(rating_number)
inq = re.findall(r'<span class="inq">(.*?)</span>', item) # 獲取評語
if len(inq) != 0:
inq = " ".join(inq) # 從串列中取出資料
data.append(inq.replace(",", " ")) # 用空格替代句號
else:
data.append("") # 對于沒有評價的電影用空格占位,防止存入表格和資料庫的時候出現問題
find_info = re.compile(r'<p class="">(.*?)</p>', re.S)
info = re.findall(find_info, item)[0]
info = info.replace("<br/>", " ") # 替換多余部分
info = info.replace("\n", " ")
info = info.strip() # 去除首尾空格
data.append(info.replace("\xa0", " ")) # 替代掉不能識別的部分
data_list.append(data) # 存進總串列
return data_list
def save_xls(data_list):
book = xlwt.Workbook(encoding="utf-8") # 建作業簿,用utf-8編碼
sheet = book.add_sheet("top250") # 建作業表
title = ["電影詳情", "圖片", "電影名", "其他名稱", "評分", "評價人數", "評語", "其他資訊"] # 設定標題欄
for i in range(8):
sheet.write(0, i, title[i]) # 寫入標題
for i in range(250):
data = data_list[i] # 獲取單條資料
for j in range(8):
sheet.write(i + 1, j, data[j]) # 存入資料
book.save("test.xls") # 資料庫路徑(相對路徑)
def create_db(dbpath): # 建表
con = sqlite3.connect(dbpath) # 建立資料庫連接
cur = con.cursor() # 獲取游標
sql = '''
create table movie250
(
id integer primary key autoincrement,
link text,
img_scr text,
title varchar ,
other_title varchar ,
rating numeric ,
rating_number numeric ,
inq text,
info text
)
'''
cur.execute(sql) # 執行sql陳述句
cur.close() # 關閉游標
con.close() # 關閉資料庫
def save_db(data_list, dbpath):
con = sqlite3.connect(dbpath) # 建立資料庫連接
cur = con.cursor() # 獲取游標
for data in data_list:
for index in range(len(data)): # 給每條資料加雙引號,以符合資料庫語言
data[index] = '"' + data[index] + '"'
sql = '''
insert into movie250
(
link,img_scr,title,other_title,rating,rating_number,inq,info
)
values (%s)''' % ",".join(data) # 從串列中取出資料
cur.execute(sql) # 執行sql陳述句
con.commit() # 提交操作
cur.close() # 關閉游標
con.close() # 關閉資料庫
if __name__ == '__main__': # 如果運行的是該檔案則執行如下操作
main()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264496.html
標籤:python
上一篇:4、python分析酷我音樂
下一篇:高斯日記python實作
