Python爬蟲實現(xiàn)抓取電影網(wǎng)站信息并入庫
一.環(huán)境搭建
1.下載安裝包
訪問 Python官網(wǎng)下載地址:https://www.python.org/downloads/
下載適合自己系統(tǒng)的安裝包:

我用的是 Windows 環(huán)境,所以直接下的 exe 包進行安裝。
下載后,雙擊下載包,進入 Python 安裝向導,安裝非常簡單,你只需要使用默認的設置一直點擊"下一步"直到安裝完成即可。
2.修改環(huán)境變量

右鍵點擊"計算機",點擊"屬性";
然后點擊"高級系統(tǒng)設置"-“環(huán)境變量”;
選擇"系統(tǒng)變量"窗口下面的 “Path” ,添加 python 安裝路徑;
設置成功以后,在cmd命令行,輸入命令"python",有顯示則說明配置成功。
3.安裝依賴模塊
我們的爬取程序需要安裝的依賴模塊包括 requests,lxml,pymysql ,步驟如下:
進入python安裝目錄下的Scripts目錄,點擊地址欄輸入“cmd” 打開命令行工具:

在這個路徑下安裝對應的 requests,lxml,pymysql 依賴:

需要輸入的命令:
// 安裝requests依賴 pip install requests // 安裝lxml依賴 pip install lxml // 安裝pymysql依賴 pip install pymysql
二.代碼開發(fā)
開發(fā) collectMovies.py
#!/user/bin env python
# 獲取電影天堂詳細信息
import requests
import time
from lxml import etree
import pymysql
requests.adapters.DEFAULT_RETRIES = 5
# 偽裝瀏覽器
HEADERS ={
'User-Agent':'Mozilla/5.(Windows NT 10.0; WOW64) AppleWebKit/537.3(KHTML, like Gecko) Chrome/63.0.3239.13Safari/537.36',
'Host':'www.dy2018.com'
}
# 定義全局變量
BASE_DOMAIN = 'https://www.dy2018.com/'
# 獲取首頁網(wǎng)頁信息并解析
def getUrlText(url,coding):
s = requests.session()
#print("獲取首頁網(wǎng)頁信息并解析:", url)
respons = s.get(url,headers=HEADERS)
print("請求URL:", url)
if(coding=='c'):
urlText = respons.content.decode('gbk')
html = etree.HTML(urlText) # 使用lxml解析網(wǎng)頁
else:
urlText = respons.text
html = etree.HTML(urlText) # 使用lxml解析網(wǎng)頁
s.keep_alive = False
return html
# 獲取電影詳情頁的href,text解析
def getHref(url):
html = getUrlText(url,'t')
aHref = html.xpath('//table[@class="tbspan"]//a/@href')
print("獲取電影詳情頁的href,text解析```")
htmlAll = map(lambda url:BASE_DOMAIN+url,aHref) # 給每個href補充BASE_DOMAIN
return htmlAll
# 使用content解析電影詳情頁,并獲取詳細信息數(shù)據(jù)
def getPage(url):
html = getUrlText(url,'c')
moveInfo = {} # 定義電影信息
mName = html.xpath('//div[@class="title_all"]//h1/text()')[0]
moveInfo['movie_name'] = mName
mDiv = html.xpath('//div[@id="Zoom"]')[0]
mImgSrc = mDiv.xpath('.//img/@src')
moveInfo['image_path'] = mImgSrc[0] # 獲取海報src地址
if len(mImgSrc) >= 2:
moveInfo['screenshot'] = mImgSrc[1] # 獲取電影截圖src地址
mContnent = mDiv.xpath('.//text()')
def pares_info(info,rule):
'''
:param info: 字符串
:param rule: 替換字串
:return: 指定字符串替換為空,并剔除左右空格
'''
return info.replace(rule,'').strip()
for index,t in enumerate(mContnent):
if t.startswith('◎譯 名'):
name = pares_info(t,'◎譯 名')
moveInfo['translation']=name
elif t.startswith('◎片 名'):
name = pares_info(t,'◎片 名')
moveInfo['movie_title']=name
elif t.startswith('◎年 代'):
name = pares_info(t,'◎年 代')
moveInfo['movie_age']=name
elif t.startswith('◎產(chǎn) 地'):
name = pares_info(t,'◎產(chǎn) 地')
moveInfo['movie_place']=name
elif t.startswith('◎類 別'):
name = pares_info(t,'◎類 別')
moveInfo['category']=name
elif t.startswith('◎語 言'):
name = pares_info(t,'◎語 言')
moveInfo['language']=name
elif t.startswith('◎字 幕'):
name = pares_info(t,'◎字 幕')
moveInfo['subtitle']=name
elif t.startswith('◎上映日期'):
name = pares_info(t,'◎上映日期')
moveInfo['release_date']=name
elif t.startswith('◎豆瓣評分'):
name = pares_info(t,'◎豆瓣評分')
moveInfo['douban_score']=name
elif t.startswith('◎片 長'):
name = pares_info(t,'◎片 長')
moveInfo['file_length']=name
elif t.startswith('◎導 演'):
name = pares_info(t,'◎導 演')
moveInfo['director']=name
elif t.startswith('◎編 劇'):
name = pares_info(t, '◎編 劇')
writers = [name]
for i in range(index + 1, len(mContnent)):
writer = mContnent[i].strip()
if writer.startswith('◎'):
break
writers.append(writer)
moveInfo['screenwriter'] = writers
elif t.startswith('◎主 演'):
name = pares_info(t, '◎主 演')
actors = [name]
for i in range(index+1,len(mContnent)):
actor = mContnent[i].strip()
if actor.startswith('◎'):
break
actors.append(actor)
moveInfo['stars'] = " ".join(actors)
elif t.startswith('◎標 簽'):
name = pares_info(t,'◎標 簽')
moveInfo['tags']=name
elif t.startswith('◎簡 介'):
name = pares_info(t,'◎簡 介')
profiles = []
for i in range(index + 1, len(mContnent)):
profile = mContnent[i].strip()
if profile.startswith('◎獲獎情況') or '【下載地址】' in profile:
break
profiles.append(profile)
moveInfo['introduction']=" ".join(profiles)
elif t.startswith('◎獲獎情況'):
name = pares_info(t,'◎獲獎情況')
awards = []
for i in range(index + 1, len(mContnent)):
award = mContnent[i].strip()
if '【下載地址】' in award:
break
awards.append(award)
moveInfo['awards']=" ".join(awards)
moveInfo['movie_url'] = url
return moveInfo
# 獲取前n頁所有電影的詳情頁href
def spider():
#連接數(shù)據(jù)庫
base_url = 'https://www.dy2018.com/html/gndy/dyzz/index_{}.html'
moves = []
m = int(input('請輸入您要獲取的開始頁:'))
n = int(input('請輸入您要獲取的結束頁:'))
print('即將寫入第{}頁到第{}頁的電影信息,請稍后...'.format(m, n))
for i in range(m,n+1):
print('******* 第{}頁電影 正在寫入 ********'.format(i))
if i == 1:
url = "https://www.dy2018.com/html/gndy/dyzz/"
else:
url = base_url.format(i)
moveHref = getHref(url)
print("休息2s后再進行操作")
time.sleep(2)
for index,mhref in enumerate(moveHref):
print('---- 正在處理第{}部電影----'.format(index+1))
move = getPage(mhref)
moves.append(move)
# 將電影信息寫入數(shù)據(jù)庫
db = pymysql.connect(host='127.0.0.1',user='root', password='123456', port=3306, db='你的數(shù)據(jù)庫名稱')
table = 'movies'
i = 1
for data in moves:
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}(id,{keys}) VALUES (null,{values})'.format(table=table, keys=keys, values=values)
try:
cursor = db.cursor()
cursor.execute(sql, tuple(data.values()))
print('本條數(shù)據(jù)成功執(zhí)行!')
if i%10==0:
db.commit()
except Exception as e:
print('將電影信息寫入數(shù)據(jù)庫發(fā)生異常!',repr(e))
db.rollback()
cursor.close()
i = i + 1
db.commit()
db.close()
print('寫入數(shù)據(jù)庫完成!')
if __name__ == '__main__':
spider()
三.運行測試
1.新建電影信息表
CREATE TABLE `movies` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `movie_name` varchar(255) DEFAULT NULL, `image_path` varchar(255) DEFAULT NULL, `screenshot` varchar(255) DEFAULT NULL, `translation` varchar(255) DEFAULT NULL, `movie_title` varchar(255) DEFAULT NULL, `movie_age` varchar(50) DEFAULT NULL, `movie_place` varchar(50) DEFAULT NULL, `category` varchar(100) DEFAULT NULL, `language` varchar(100) DEFAULT NULL, `subtitle` varchar(100) DEFAULT NULL, `release_date` varchar(50) DEFAULT NULL, `douban_score` varchar(50) DEFAULT NULL, `file_length` varchar(255) DEFAULT NULL, `director` varchar(100) DEFAULT NULL, `screenwriter` varchar(100) DEFAULT NULL, `stars` mediumtext, `tags` varchar(255) DEFAULT NULL, `introduction` mediumtext, `awards` text, `movie_url` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2.代碼運行
打開 collectMovies.py 所在目錄,輸入命令運行:
python collectMovies.py
運行結果如下:


查看數(shù)據(jù)庫表,數(shù)據(jù)已成功插入:

四.問題排查和修復
1.空白字符報錯
第一次使用 Python,不太熟悉它的規(guī)則,空格和Tab混用,運行會報如下錯:
unindent does not match any outer indentation level
解決方法
下載 Notepad++,選擇 “編輯” – “空白字符操作” – "空格轉 Tab (行首)"即可。
2.請求報錯
修改好格式之后再次運行,反反復復的報請求的錯,報錯信息主要包括以下內容:
ssl.SSLEOFError: EOF occurred in violation of protocol ······ Max retries exceeded with url
解決方法
本來以為是請求設置出了問題,各種百度,還安裝了 pip install incremental ,但是依然沒有奏效。
后來把請求的網(wǎng)址換成百度網(wǎng)就不報錯了,這樣可以定位到是原網(wǎng)址的訪問出了問題,更換了采集源路徑,該問題解決。
以上就是Python爬蟲實現(xiàn)抓取電影網(wǎng)站信息并入庫的詳細內容,更多關于Python抓取網(wǎng)站信息的資料請關注腳本之家其它相關文章!
相關文章
關于python3.9安裝wordcloud出錯的問題及解決辦法
這篇文章主要介紹了關于python3.9安裝wordcloud出錯的問題及解決辦法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
使用selenium模擬動態(tài)登錄百度頁面的實現(xiàn)
本文主要介紹了使用selenium模擬動態(tài)登錄百度頁面,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05
pytest自動化測試fixture的作用域實例化順序及可用性
這篇文章主要介紹了pytest自動化測試中fixture的作用域、實例化順序及可用性的詳解示例有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10

