Python爬蟲(chóng)實(shí)現(xiàn)抓取電影網(wǎng)站信息并入庫(kù)
一.環(huán)境搭建
1.下載安裝包
訪問(wèn) Python官網(wǎng)下載地址:https://www.python.org/downloads/
下載適合自己系統(tǒng)的安裝包:
我用的是 Windows 環(huán)境,所以直接下的 exe 包進(jìn)行安裝。
下載后,雙擊下載包,進(jìn)入 Python 安裝向?qū)В惭b非常簡(jiǎn)單,你只需要使用默認(rèn)的設(shè)置一直點(diǎn)擊"下一步"直到安裝完成即可。
2.修改環(huán)境變量
右鍵點(diǎn)擊"計(jì)算機(jī)",點(diǎn)擊"屬性";
然后點(diǎn)擊"高級(jí)系統(tǒng)設(shè)置"-“環(huán)境變量”;
選擇"系統(tǒng)變量"窗口下面的 “Path” ,添加 python 安裝路徑;
設(shè)置成功以后,在cmd命令行,輸入命令"python",有顯示則說(shuō)明配置成功。
3.安裝依賴模塊
我們的爬取程序需要安裝的依賴模塊包括 requests,lxml,pymysql ,步驟如下:
進(jìn)入python安裝目錄下的Scripts目錄,點(diǎn)擊地址欄輸入“cmd” 打開(kāi)命令行工具:
在這個(gè)路徑下安裝對(duì)應(yīng)的 requests,lxml,pymysql 依賴:
需要輸入的命令:
// 安裝requests依賴 pip install requests // 安裝lxml依賴 pip install lxml // 安裝pymysql依賴 pip install pymysql
二.代碼開(kāi)發(fā)
開(kāi)發(fā) collectMovies.py
#!/user/bin env python # 獲取電影天堂詳細(xì)信息 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/' # 獲取首頁(yè)網(wǎng)頁(yè)信息并解析 def getUrlText(url,coding): s = requests.session() #print("獲取首頁(yè)網(wǎng)頁(yè)信息并解析:", url) respons = s.get(url,headers=HEADERS) print("請(qǐng)求URL:", url) if(coding=='c'): urlText = respons.content.decode('gbk') html = etree.HTML(urlText) # 使用lxml解析網(wǎng)頁(yè) else: urlText = respons.text html = etree.HTML(urlText) # 使用lxml解析網(wǎng)頁(yè) s.keep_alive = False return html # 獲取電影詳情頁(yè)的href,text解析 def getHref(url): html = getUrlText(url,'t') aHref = html.xpath('//table[@class="tbspan"]//a/@href') print("獲取電影詳情頁(yè)的href,text解析```") htmlAll = map(lambda url:BASE_DOMAIN+url,aHref) # 給每個(gè)href補(bǔ)充BASE_DOMAIN return htmlAll # 使用content解析電影詳情頁(yè),并獲取詳細(xì)信息數(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] # 獲取海報(bào)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('◎語(yǔ) 言'): name = pares_info(t,'◎語(yǔ) 言') 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('◎豆瓣評(píng)分'): name = pares_info(t,'◎豆瓣評(píng)分') moveInfo['douban_score']=name elif t.startswith('◎片 長(zhǎng)'): name = pares_info(t,'◎片 長(zhǎng)') moveInfo['file_length']=name elif t.startswith('◎?qū)А ⊙?): name = pares_info(t,'◎?qū)А ⊙?) 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('◎標(biāo) 簽'): name = pares_info(t,'◎標(biāo) 簽') moveInfo['tags']=name elif t.startswith('◎簡(jiǎn) 介'): name = pares_info(t,'◎簡(jiǎn) 介') profiles = [] for i in range(index + 1, len(mContnent)): profile = mContnent[i].strip() if profile.startswith('◎獲獎(jiǎng)情況') or '【下載地址】' in profile: break profiles.append(profile) moveInfo['introduction']=" ".join(profiles) elif t.startswith('◎獲獎(jiǎng)情況'): name = pares_info(t,'◎獲獎(jiǎng)情況') 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頁(yè)所有電影的詳情頁(yè)href def spider(): #連接數(shù)據(jù)庫(kù) base_url = 'https://www.dy2018.com/html/gndy/dyzz/index_{}.html' moves = [] m = int(input('請(qǐng)輸入您要獲取的開(kāi)始頁(yè):')) n = int(input('請(qǐng)輸入您要獲取的結(jié)束頁(yè):')) print('即將寫(xiě)入第{}頁(yè)到第{}頁(yè)的電影信息,請(qǐng)稍后...'.format(m, n)) for i in range(m,n+1): print('******* 第{}頁(yè)電影 正在寫(xiě)入 ********'.format(i)) if i == 1: url = "https://www.dy2018.com/html/gndy/dyzz/" else: url = base_url.format(i) moveHref = getHref(url) print("休息2s后再進(jìn)行操作") time.sleep(2) for index,mhref in enumerate(moveHref): print('---- 正在處理第{}部電影----'.format(index+1)) move = getPage(mhref) moves.append(move) # 將電影信息寫(xiě)入數(shù)據(jù)庫(kù) db = pymysql.connect(host='127.0.0.1',user='root', password='123456', port=3306, db='你的數(shù)據(jù)庫(kù)名稱') 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('將電影信息寫(xiě)入數(shù)據(jù)庫(kù)發(fā)生異常!',repr(e)) db.rollback() cursor.close() i = i + 1 db.commit() db.close() print('寫(xiě)入數(shù)據(jù)庫(kù)完成!') if __name__ == '__main__': spider()
三.運(yùn)行測(cè)試
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.代碼運(yùn)行
打開(kāi) collectMovies.py 所在目錄,輸入命令運(yùn)行:
python collectMovies.py
運(yùn)行結(jié)果如下:
查看數(shù)據(jù)庫(kù)表,數(shù)據(jù)已成功插入:
四.問(wèn)題排查和修復(fù)
1.空白字符報(bào)錯(cuò)
第一次使用 Python,不太熟悉它的規(guī)則,空格和Tab混用,運(yùn)行會(huì)報(bào)如下錯(cuò):
unindent does not match any outer indentation level
解決方法
下載 Notepad++,選擇 “編輯” – “空白字符操作” – "空格轉(zhuǎn) Tab (行首)"即可。
2.請(qǐng)求報(bào)錯(cuò)
修改好格式之后再次運(yùn)行,反反復(fù)復(fù)的報(bào)請(qǐng)求的錯(cuò),報(bào)錯(cuò)信息主要包括以下內(nèi)容:
ssl.SSLEOFError: EOF occurred in violation of protocol ······ Max retries exceeded with url
解決方法
本來(lái)以為是請(qǐng)求設(shè)置出了問(wèn)題,各種百度,還安裝了 pip install incremental ,但是依然沒(méi)有奏效。
后來(lái)把請(qǐng)求的網(wǎng)址換成百度網(wǎng)就不報(bào)錯(cuò)了,這樣可以定位到是原網(wǎng)址的訪問(wèn)出了問(wèn)題,更換了采集源路徑,該問(wèn)題解決。
以上就是Python爬蟲(chóng)實(shí)現(xiàn)抓取電影網(wǎng)站信息并入庫(kù)的詳細(xì)內(nèi)容,更多關(guān)于Python抓取網(wǎng)站信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
同時(shí)安裝Python2 & Python3 cmd下版本自由選擇的方法
下面小編就為大家分享一篇同時(shí)安裝Python2 & Python3 cmd下版本自由選擇的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12人工智能學(xué)習(xí)Pytorch梯度下降優(yōu)化示例詳解
這篇文章主要為大家介紹了人工智能學(xué)習(xí)Pytorch梯度下降優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11tensorboard 可以顯示graph,卻不能顯示scalar的解決方式
今天小編就為大家分享一篇tensorboard 可以顯示graph,卻不能顯示scalar的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02用Python寫(xiě)一個(gè)無(wú)界面的2048小游戲
這篇文章主要介紹了用Python寫(xiě)一個(gè)無(wú)界面的2048小游戲的相關(guān)資料,需要的朋友可以參考下2016-05-05使用Python進(jìn)行同期群分析(Cohort?Analysis)
同期群(Cohort)的字面意思(有共同特點(diǎn)或舉止類同的)一群人,比如不同性別,不同年齡。這篇文章主要介紹了用Python語(yǔ)言來(lái)進(jìn)行同期群分析,感興趣的同學(xué)可以閱讀參考一下本文2023-03-03pyqt5 QProgressBar清空進(jìn)度條的實(shí)例
今天小編就為大家分享一篇pyqt5 QProgressBar清空進(jìn)度條的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06以一個(gè)投票程序的實(shí)例來(lái)講解Python的Django框架使用
這篇文章主要介紹了以一個(gè)投票程序的實(shí)例來(lái)講解Python的Django框架使用,Django是Python世界中人氣最高的MVC框架,需要的朋友可以參考下2016-02-02