Python爬蟲實戰之取電影天堂,,新手練手項目


本文概要

 

前言:

本文非常淺顯易懂,可以說是零基礎也可快速掌握。如有疑問,歡迎留言,筆者會第一時間回復。本文代碼存於github

一、爬蟲的重要性:

如果把互聯網比喻成一個蜘蛛網,那么Spider就是在網上爬來爬去的蜘蛛。網絡蜘蛛通過網頁的鏈接地址來尋找網頁,從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它鏈接地址,然后通過這些鏈接地址尋找下一個網頁,一直循環下去,直到把整個網站所有的網頁都抓取完為止。

這里要注意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程項目,還可以跟老司機交流討教!

摘取部分網友的回復: 1、之前在北京買房,誰想房價開始瘋長,鏈家的房價等數據分析只給了一小部分,遠遠不能滿足自己的需求。於是晚上花了幾個小時的時間寫了個爬蟲,爬下了北京所有的小區信息及北京所有小區的所有歷史成交記錄。

2、我的愛人是某網絡公司的銷售,需要收集各種企業信息然后打電話聯系。於是乎利用采集腳本抓一坨一坨的資料給她用,而她的同事天天自己搜資料整理到半夜。

二、實踐:爬取電影天堂電影詳情頁

1、網頁分析及爬取第一頁的詳情頁url

從電影天堂最新電影界面。可以看到其第一頁url為 www.ygdy8.net/html/gndy/d… ,第二頁為www.ygdy8.net/html/gndy/d…,第三第四頁也類似

from lxml import etree
import requests


url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html' headers = { 'User_Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } response = requests.get(url,headers=headers) # response.text 是系統自己默認判斷。但很遺憾判斷錯誤,導致亂碼出現。我們可以采取另外方式 response.content。自己指定格式解碼 # print(response.text) # print(response.content.decode('gbk')) print(response.content.decode(encoding="gbk", errors="ignore")) 復制代碼

先以第一頁為例,打印數據如下:

 

image.png

 

分析電影天堂 html 源代碼,可以得出每個 table 標簽就是一個電影

 

image.png

 

通過 xpath 拿到每個電影的詳情url

html = etree.HTML(text)
detail_urls = html.xpath("//table[@class='tbspan']//a/@href") for detail_url in detail_urls: print(detail_url) #加上域名即為詳情 url 復制代碼

結果如下:

image.png

 

2、整理代碼並爬取前7頁的電影列表url

from lxml import etree
import requests

# 域名 BASE_DOMAIN = 'http://www.ygdy8.net' # url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html' HEADERS = { 'User_Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } def spider(): base_url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_{}.html' for x in range(1,8): url = base_url.format(x) print(url) # 求出每一頁電影列表的url eg: http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html if __name__ == '__main__': spider() 復制代碼

3、爬取每一部電影的詳情頁地址

def get_detail_urls(url):
    response = requests.get(url, headers=HEADERS)

    # response.text 是系統自己默認判斷。但很遺憾判斷錯誤,導致亂碼出現。我們可以采取另外方式 response.content。自己指定格式解碼 # print(response.text) # print(response.content.decode('gbk')) # print(response.content.decode(encoding="gbk", errors="ignore")) text = response.content.decode(encoding="gbk", errors="ignore") # 通過 xpath 拿到每個電影的詳情url html = etree.HTML(text) detail_urls = html.xpath("//table[@class='tbspan']//a/@href") detail_urls = map(lambda url:BASE_DOMAIN+url,detail_urls) #這句意思相當於下面一段代碼:替換列表中的每一個url # def abc(url): # return BASE_DOMAIN+url # index = 1 # for detail_url in detail_urls: # detail_url = abc(detail_url) # detail_urls[index] = detail_url # index+1 return detail_urls 復制代碼

4、抓取電影詳情頁的數據

 

獲取詳情頁title

 

# 解析詳情頁面 def parse_detail_page(url): movie = {} response = requests.get(url,headers = HEADERS) text = response.content.decode('gbk', errors='ignore') html = etree.HTML(text) # title = html.xpath("//div[@class='title_all']//font[@color='#07519a']") # 本行47行,下面已修改 # 打印出 [<Element font at 0x10cb422c8>, <Element font at 0x10cb42308>] # print(title) # 為了顯示,我們需要轉一下編碼 # for x in title: # print(etree.tostring(x,encoding='utf-8').decode('utf-8')) # 我們是為了取得文字,所以修改47行 title = html.xpath("//div[@class='title_all']//font[@color='#07519a']/text()")[0] movie['title'] = title zoomE = html.xpath("//div[@id='Zoom']") [0] # 求出共同的頂級容器,方便后面求職 imgs = zoomE.xpath(".//img/@src") # 求出海報和截圖 cover = imgs[0] if len(imgs) > 1: screenshot = imgs[1] movie['screenshot'] = screenshot # print(cover) movie['cover'] = cover infos = zoomE.xpath(".//text()") for index,info in enumerate(infos): if info.startswith('◎年&emsp;&emsp;代'): info = info.replace("◎年&emsp;&emsp;代", "").strip() # strip 去掉空格 movie['year'] = info elif info.startswith("◎產&emsp;&emsp;地"): info = info.replace("◎產&emsp;&emsp;地", "").strip() movie["country"] = info elif info.startswith("◎類&emsp;&emsp;別"): info = info.replace("◎類&emsp;&emsp;別", "").strip() movie["category"] = info elif info.startswith("◎豆瓣評分"): info = info.replace("◎豆瓣評分", "").strip() movie["douban_rating"] = info elif info.startswith("◎片&emsp;&emsp;長"): info = info.replace("◎片&emsp;&emsp;長","").strip() movie["duration"] = info elif info.startswith("◎導&emsp;&emsp;演"): info = info.replace("◎導&emsp;&emsp;演", "").strip() movie["director"] = info elif info.startswith("◎主&emsp;&emsp;演"): actors = [] actor = info.replace("◎主&emsp;&emsp;演", "").strip() actors.append(actor) # 因為主演有很多個,再加上其在電影天堂中元素的特殊性,需要遍歷一遍,在分別求出每一個演員 for x in range(index+1,len(infos)): # 從演員 infos 開始遍歷,求出每一個演員 actor = infos[x].strip() if actor.startswith("◎"): # 也就是到了標簽 的 ◎ 就退出 break actors.append(actor) movie['actor'] = actors elif info.startswith('◎簡&emsp;&emsp;介 '): # info = info.replace('◎簡&emsp;&emsp;介 ',"").strip() for x in range(index+1,len(infos)): if infos[x].startswith("◎獲獎情況"): break profile = infos[x].strip() movie['profile'] = profile # print(movie) elif info.startswith('◎獲獎情況 '): awards = [] # info = info.replace("◎獲獎情況 ", "").strip() for x in range(index+1,len(infos)): if infos[x].startswith("【下載地址】"): break award = infos[x].strip() awards.append(award) movie['awards'] = awards # print(awards) download_url = html.xpath("//td[@bgcolor='#fdfddf']/a/@href")[0] movie['download_url'] = download_url return movie 復制代碼

上述代碼爬取了電影的每一個數據。為了讓讀者方便對照格式,筆者已經下載了寫此篇文章時的html—— "movie.html",放於github 中

最后結果:

前7頁結果

 總結注意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程項目,還可以跟老司機交流討教!

本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM