1. 程式人生 > >【Python】從0開始寫爬蟲——豆瓣電影

【Python】從0開始寫爬蟲——豆瓣電影

for tag pes wing 信息 kit headers 自動 動畫

1. 最近略忙。。java在搞soap,之前是用工具自動生成代碼的。最近可能會寫一個soap的java調用

2. 這個豆瓣電影的爬蟲。扒信息的部分暫時先做到這了。扒到的信息如下

from scrapy import app
import re

header = {
    User-Agent:
        Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36,
    Host: movie.douban.com
, Accept-Language: zh-CN,zh;q=0.9 } movie_url = "https://movie.douban.com/subject/27132728/?tag=%E7%83%AD%E9%97%A8&from=gaia" m_id = re.search("[0-9]+", movie_url).group() # 獲取soup對象 soup = app.get_soup(url=movie_url, headers=header, charset="utf-8") content = soup.find(id="content
") # 抓取電影名字和上映年份 m_name = content.find("h1").find("span").string m_year = content.find(class_="year").string m_year = m_year[1:-1] # 去掉頭尾的括號 # 抓取導演 info = content.find(id="info") m_directer = info.find(attrs={"rel": "v:directedBy"}).string# 上映日期 m_date = info.find(attrs={"property": "v:initialReleaseDate
"}).string m_date = re.search("[-,0-9]+", m_date).group() # 類型 types = info.find_all(attrs={"property": "v:genre"}, limit=2) m_types = [] for type_ in types: m_types.append(type_.string) # 抓取主演,只取前面五個 actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5) m_actors = [] for actor in actors: m_actors.append(actor.string) # 片長 m_time = info.find(attrs={"property": "v:runtime"}).string m_time = re.search("[0-9]+", m_time).group() # 評分 score_info = soup.find(id="interest_sectl") m_score = score_info.find("strong").string m_stars = score_info.find_all(class_="rating_per") m_rate = [] for star in m_stars: m_rate.append(star.string[:-1]) m_votes = score_info.find(attrs={"property": "v:votes"}).string print("id", m_id, "名稱", m_name, "年份 ", m_year, "導演 ", m_directer, "主演", m_actors) print("上映日期", m_date, "類型", m_types, "片長", m_time) print("評分", m_score, "星評(從5星到1星)", m_rate, "評價總數", m_votes)

輸出如下

id 27132728 名稱 致命警告 El aviso 年份  2018 導演  丹尼爾·卡爾帕索羅 主演 [奧拉·加裏多, 勞爾·阿雷瓦洛, 貝倫·奎斯塔, Sergio Mur, Aitor Luna]
上映日期 2018-03-23 類型 [驚悚] 片長 92
評分 6.4 星評(從5星到1星) [14.2, 19.9, 41.1, 21.3, 3.5] 評價總數 445

把這些狗東西封裝成一個方法。並且隨便找幾個豆瓣電影的url試一下。在多嘗試幾個url之後,會報一些問題,主要是沒有進行空判斷, 所以稍微修改了一點

from scrapy import app
import re


def douban_movie(movie_url):

    header = {
        User-Agent:
            Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36,
        Host: movie.douban.com,
        Accept-Language: zh-CN,zh;q=0.9
    }
    m_id = re.search("[0-9]+", movie_url).group()

    # 獲取soup對象
    soup = app.get_soup(url=movie_url, headers=header, charset="utf-8")
    content = soup.find(id="content")

    # 抓取電影名字和上映年份
    m_name = content.find("h1").find("span").string
    m_year = content.find(class_="year").string
    m_year = m_year[1:-1]  # 去掉頭尾的括號

    # 抓取導演
    info = content.find(id="info")
    m_directer = info.find(attrs={"rel": "v:directedBy"}).string

    # 上映日期
    m_date = info.find(attrs={"property": "v:initialReleaseDate"}).string
    m_date = re.search("[-,0-9]+", m_date).group()

    # 類型
    types = info.find_all(attrs={"property": "v:genre"}, limit=2)
    m_types = []
    for type_ in types:
        m_types.append(type_.string)

    # 抓取主演,只取前面五個
    actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5)
    m_actors = []
    for actor in actors:
        m_actors.append(actor.string)

    # 片長
    m_time = info.find(attrs={"property": "v:runtime"})
    m_time = re.search("[0-9]+", m_time.string).group() if m_time else 0

    # 評分
    score_info = soup.find(id="interest_sectl")
    m_score = score_info.find("strong").string

    m_stars = score_info.find_all(class_="rating_per")
    m_rate = []
    for star in m_stars:
        m_rate.append(star.string[:-1])

    m_votes = score_info.find(attrs={"property": "v:votes"})
    m_votes = m_votes.string if m_votes else 0

    print("id", m_id, "名稱", m_name, "年份 ", m_year, "導演 ", m_directer, "主演", m_actors)

    print("上映日期", m_date, "類型", m_types, "片長", m_time)

    print("評分", m_score, "星評(從5星到1星)", m_rate, "評價總數", m_votes)


douban_movie("https://movie.douban.com/subject/30236775/?from=showing")
douban_movie("https://movie.douban.com/subject/26842702/?tag=%E7%83%AD%E9%97%A8&from=gaia")
douban_movie("https://movie.douban.com/subject/26973784/?tag=%E6%9C%80%E6%96%B0&from=gaia")
douban_movie("https://movie.douban.com/subject/30249296/?tag=%E7%83%AD%E9%97%A8&from=gaia")

輸出如下

id 30236775 名稱 旅行吧!井底之蛙 年份  2018 導演  陳設 主演 [王雪沁, 吳凡, 周宗禹, 強光宗, 張藝文]
上映日期 2018-08-18 類型 [動畫, 奇幻] 片長 78
評分 None 星評(從5星到1星) [] 評價總數 0
id 26842702 名稱 燃燒 ?? 年份  2018 導演  李滄東 主演 [劉亞仁, 史蒂文·元, 全鐘瑞, 金秀京, 崔承浩]
上映日期 2018-05-16 類型 [劇情, 懸疑] 片長 148
評分 7.9 星評(從5星到1星) [25.9, 48.1, 21.4, 3.2, 1.3] 評價總數 81519
id 26973784 名稱 設局 La niebla y la doncella 年份  2017 導演  安德烈斯·M·科佩爾 主演 [基姆·古鐵雷斯, 薇洛妮卡·恩切圭, 奧拉·加裏多, 羅伯托·阿拉莫]
上映日期 2017-09-08 類型 [驚悚] 片長 0
評分 5.2 星評(從5星到1星) [1.2, 9.8, 42.0, 40.0, 7.1] 評價總數 320
id 30249296 名稱 我們的侶行 第二季 年份  2018 導演  張昕宇 主演 [張昕宇, 梁紅]
上映日期 2018-06-12 類型 [真人秀] 片長 0
評分 8.9 星評(從5星到1星) [59.3, 27.8, 11.1, 1.9, 0.0] 評價總數 342

【Python】從0開始寫爬蟲——豆瓣電影