<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
存取 Python官網下載地址:https://www.python.org/downloads/
下載適合自己系統的安裝包:
我用的是 Windows 環境,所以直接下的 exe 包進行安裝。
下載後,雙擊下載包,進入 Python 安裝嚮導,安裝非常簡單,你只需要使用預設的設定一直點選"下一步"直到安裝完成即可。
右鍵點選"計算機",點選"屬性";
然後點選"高階系統設定"-“環境變數”;
選擇"系統變數"視窗下面的 “Path” ,新增 python 安裝路徑;
設定成功以後,在cmd命令列,輸入命令"python",有顯示則說明設定成功。
我們的爬取程式需要安裝的依賴模組包括 requests,lxml,pymysql ,步驟如下:
進入python安裝目錄下的Scripts目錄,點選位址列輸入“cmd” 開啟命令列工具:
在這個路徑下安裝對應的 requests,lxml,pymysql 依賴:
需要輸入的命令:
// 安裝requests依賴 pip install requests // 安裝lxml依賴 pip install lxml // 安裝pymysql依賴 pip install pymysql
開發 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/' # 獲取首頁網頁資訊並解析 def getUrlText(url,coding): s = requests.session() #print("獲取首頁網頁資訊並解析:", url) respons = s.get(url,headers=HEADERS) print("請求URL:", url) if(coding=='c'): urlText = respons.content.decode('gbk') html = etree.HTML(urlText) # 使用lxml解析網頁 else: urlText = respons.text html = etree.HTML(urlText) # 使用lxml解析網頁 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解析電影詳情頁,並獲取詳細資訊資料 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('◎產 地'): name = pares_info(t,'◎產 地') 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(): #連線資料庫 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) # 將電影資訊寫入資料庫 db = pymysql.connect(host='127.0.0.1',user='root', password='123456', port=3306, db='你的資料庫名稱') 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('本條資料成功執行!') if i%10==0: db.commit() except Exception as e: print('將電影資訊寫入資料庫發生異常!',repr(e)) db.rollback() cursor.close() i = i + 1 db.commit() db.close() print('寫入資料庫完成!') if __name__ == '__main__': spider()
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;
開啟 collectMovies.py 所在目錄,輸入命令執行:
python collectMovies.py
執行結果如下:
檢視資料庫表,資料已成功插入:
第一次使用 Python,不太熟悉它的規則,空格和Tab混用,執行會報如下錯:
unindent does not match any outer indentation level
解決方法
下載 Notepad++,選擇 “編輯” – “空白字元操作” – "空格轉 Tab (行首)"即可。
修改好格式之後再次執行,反反覆覆的報請求的錯,報錯資訊主要包括以下內容:
ssl.SSLEOFError: EOF occurred in violation of protocol ······ Max retries exceeded with url
解決方法
本來以為是請求設定出了問題,各種百度,還安裝了 pip install incremental ,但是依然沒有奏效。
後來把請求的網址換成百度網就不報錯了,這樣可以定位到是原網址的存取出了問題,更換了採集源路徑,該問題解決。
以上就是Python爬蟲實現抓取電影網站資訊併入庫的詳細內容,更多關於Python抓取網站資訊的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45