目錄
4567電影網電影信息爬取
1.需求分析
4567電影網首頁如下,點擊一部電影,看看具體的頁面呈現。
電影信息有電影名,類型,地區,年份,主演,等等。在這裏我們僅提取電影名和電影簡介
進入到電影分類頁面,我們的目的是提取某一類型所有電影的名字和簡介
2.URL分析
1.一級URL分析
動作欄的電影URL爲:https://www.4567tv.tv/index.php/vod/show/id/5/page/1.html
從這個URL可以得出兩條信息:
1.動作類型的電影id號爲5
2.第一頁的html爲1.html,第二頁爲2.html,依次推列
2.二級URL分析
在動作欄電影頁面右鍵查看源代碼,分析源代碼得到他的鏈接地址。
得出的結果爲:/movie/index29612.html
這顯然不是一個完整的URL,我們在動作欄頁面點擊肥龍過江,看到他的URL如下若是,於是我們得出結論。
二級URL="https://www.4567tv.tv"+鏈接地址
3.正則表達式分析
1.二級URL正則表達式分析
我們想要的是href裏面的那一次,分析劃線部分的代碼,發現規律,於是正則表達式可以這麼寫:
<a class="stui-vodlist__thumb lazyload" href="(.*?)".*?</a>
以<a class="stui-vodlist__thumb lazyload" 開頭,(.*?)提取子模式,.*?非貪婪匹配後續,直到</a>
2.電影名和簡介正則表達式分析
我們要提取的信息是電影名和簡介,根據分析,發現電影名以<div class="stui-content__detail">開頭,簡介以<span class="detail-content" style="display: none;">開頭。那麼正則表達式如下:
<div class="stui-content__detail">.*?<h1 class="title">(.*?)</h1>.*?<span class="detail-content" style="display: none;">(.*?)</span>
注意:這裏有兩個子模式,所以返回的結果爲元組列表
4.程序設計
1.定義一個類,Movies4567_spider封裝方法
2.初始化信息,包括一級URL和正則,二級URL和正則,請求頭代理
3.定義獲取頁面的函數:get_html()
4.定義獲取一級頁面內容的函數(獲取二級頁面的URL):parse_first()
5.定義獲取二級頁面內容的函數(獲取電影名和簡介):parse_second()
6.定義正則匹配函數,返回匹配列表(這裏單獨來寫是爲了一二級頁面的解耦):regex_func()
7.定義入口函數:run()
5.程序代碼
from urllib import request
import re
import time
import random
class Movies4567_spider(object):
def __init__(self):
self.frist_url="https://www.4567tv.tv/index.php/vod/show/id/5/page/{}.html"
self.second_url="https://www.4567tv.tv"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
self.regex_first = '<a class="stui-vodlist__thumb lazyload" href="(.*?)".*?</a>'
self.regex_second = '<div class="stui-content__detail">.*?<h1 class="title">(.*?)</h1>.*?<span class="detail-content" style="display: none;">(.*?)</span>'
#獲取頁面
def get_html(self,url):
req = request.Request(url=url, headers=self.headers)
rep = request.urlopen(req)
html = rep.read().decode("utf-8","ignore")
return html
#提交html頁面,正則表達式regex,返回列表
def regex_func(self,regex,html):
pattern=re.compile(regex,re.S)
lists=pattern.findall(html)
return lists
#一級頁面:獲取二級頁面的url
def parse_first(self,first_url):
html_first=self.get_html(first_url)
#獲取到二級頁面的url
list_second=self.regex_func(self.regex_first,html_first)
print(list_second)
#對二級頁面做信息提取
for i in list_second:
# url拼接
url_second=self.second_url+i
item=self.parse_second(url_second)
print(item)
time.sleep(random.uniform(1,2))
#處理二級頁面,獲取電影名和簡介
def parse_second(self,second_url):
#下載頁面內容
html_second=self.get_html(second_url)
#返回匹配內容
info=self.regex_func(self.regex_second,html_second)
#將返回內容打包成集合返回
items={}
items["name"]=info[0][0]
items["detail"]=info[0][1]
return items
#入口函數
def run(self):
#獲取一到第十頁
for i in range(1,10):
#url拼接
url=self.frist_url.format(i)
self.parse_first(url)
if __name__ == "__main__":
spider=Movies4567_spider()
spider.run()