程式設計師大佬教你用python爬取電影天堂

前言:

那麼什麼是爬蟲呢?我們把網際網路有價值的資訊都比喻成大的蜘蛛網,而各個節點就是存放的資料,而蜘蛛網的上蜘蛛比喻成爬蟲,而爬蟲是可以自動抓取網際網路資訊的程式,從網際網路上抓取一切有價值的資訊,並且把站點的html和js返回的圖片爬到本地,並且儲存方便使用。

程式設計師大佬教你用python爬取電影天堂

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

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

從電影天堂最新電影介面。可以看到其第一頁url為 http://www。ygdy8。net/html/gndy/dyzz/list_23_1。html,第二頁為http://www。ygdy8。net/html/gndy/dyzz/list_23_2。html,第三第四頁也類似。

from lxml import etreeimport requestsurl = ‘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”))

先以第一頁為例,列印資料如下:

程式設計師大佬教你用python爬取電影天堂

分析電影天堂 html 原始碼,可以得出每個 table 標籤就是一個電影

程式設計師大佬教你用python爬取電影天堂

透過 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

結果:

程式設計師大佬教你用python爬取電影天堂

2。

整理程式碼並爬取前7頁的電影列表url.

from lxml import etreeimport 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。htmlif __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。

抓取電影詳情頁的資料

程式設計師大佬教你用python爬取電影天堂

# 解析詳情頁面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行,下面已修改 # 打印出 [] # 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(‘◎年代’): info = info。replace(“◎年代”, “”)。strip() # strip 去掉空格 movie[‘year’] = info elif info。startswith(“◎產地”): info = info。replace(“◎產地”, “”)。strip() movie[“country”] = info elif info。startswith(“◎類別”): info = info。replace(“◎類別”, “”)。strip() movie[“category”] = info elif info。startswith(“◎豆瓣評分”): info = info。replace(“◎豆瓣評分”, “”)。strip() movie[“douban_rating”] = info elif info。startswith(“◎片長”): info = info。replace(“◎片長”,“”)。strip() movie[“duration”] = info elif info。startswith(“◎導演”): info = info。replace(“◎導演”, “”)。strip() movie[“director”] = info elif info。startswith(“◎主演”): actors = [] actor = info。replace(“◎主演”, “”)。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(‘◎簡介 ’): # info = info。replace(‘◎簡介 ’,“”)。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

最後結果:

程式設計師大佬教你用python爬取電影天堂