[练手]爬豆瓣电影名和导演名

因为直接看书有些抽象,所以参考了某位大佬源码,在他基础上改动了一些

爬豆瓣电影名和导演名

总览

分为四个包实现
调度、下载、解析、写入
在这里插入图片描述

index

#!/usr/bin/python
# coding:utf-8

# 进度条
from time import sleep
from tqdm import tqdm

import download
import parser
import output

#程序入口
if __name__ == '__main__':
    output.main()
  

output

import csv
import download
import index
import parser_
import xlrd
import xlwt
from xlwt import Workbook
from time import sleep
from tqdm import tqdm


#写入
daoyan = parser_.daoyan 

def main():
    print('已找到作品名(250/250)')
    print('已找到导演名(25/250)')
    print('=======================================')
    print('                                       ')
    print('          正在写入csv文件,请稍后        ')
    print('                                       ')
    print('=======================================')
    handle = parser_.parse_html(download.download_page(parser_.test_url))
    
    print('已写入作品名(250/250)')
    print('已写入导演名(25/250)')
    if handle != None:
        handle = list(handle)
        
        out = open(r'D:\开发\后端\数据挖掘\python\visual_workspace\11.26\test.csv','a', newline='')
        csv_write = csv.writer(out,dialect='excel')
        csv_write.writerow(handle)
        csv_write.writerow(daoyan)
    for i in tqdm(range(1, 101)):
        sleep(0.01) # 显示间隔,sec越小,速度越快
    print('====================================')
    print('                                    ')
    print('               写入成功              ')
    print('                                    ')  
    print('====================================') 

download

# coding:utf-8
import requests


def download_page(url):     
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
    }
    data = requests.get(url,headers=headers).content
    return data
#下载器,伪装浏览器
# User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标 识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计; 
# 例如用手机访问谷歌和电脑访问是不一样的,这些是谷歌根据访问者的 UA来判断的。UA可以进行伪装。 
# 浏览器的UA字串的标准格式:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识版本信息。但各个浏览器有所不同。

parser

BueutifulSoup实现解析

import download
import index
import requests
import output
from bs4 import BeautifulSoup
from time import sleep
from tqdm import tqdm

test_url = 'http://movie.douban.com/top250/'

movie_name_list = []
def parse_html(html):  
    soup = BeautifulSoup(html)  
    #找ol标签
    movie_list_soup = soup.find('ol', attrs={'class': 'grid_view'})
    
    #如果这个 ol 标签不为空,就去里面找 li
    if movie_list_soup != None:
        #遍历li 里面的电影名
        
        for movie_li in movie_list_soup.find_all('li'):
            #详情页
            detail = movie_li.find('div', attrs={'class': 'hd'}) 
            #电影名字,最终要找的电影名 
            movie_name = detail.find('span', attrs={'class': 'title'}).getText()
            #添加到列表
            movie_name_list.append(movie_name)
            
        #翻页
        next_page = soup.find('span', attrs={'class': 'next'}).find('a')
        if next_page:
            parse_html(download.download_page(test_url + next_page['href']))
            
        return movie_name_list

links = []
def p(a): #取所有子链接
    a = range(0,25,25)
    page = []
    for i in a:
        page.append(i)    
    links = []
    for j in page:
        url = 'https://movie.douban.com/top250?start='+str(j)+'&filter='
        
        res=requests.get(url)
        res.encoding='utf-8'
        soup = BeautifulSoup(res.content)
        for iu in soup.select('.hd > a'):
            links.append(iu['href'])
    return links


daoyan = []
def parse_html_daoyan(a):#取导演名
    linkss=p(a)
    a=0
    for i in linkss:
        res=requests.get(i)
        res.encoding='utf-8'
        soup = BeautifulSoup(res.content)  

        for i in soup.select('.info'):
            a+=1
            daoyan.append(i.span.string)
            print('已找到导演名(',a,'/250)')
            break 
            
    return daoyan
parse_html_daoyan(1)





数据分析统计

共173位导演的
250部作品上榜

在这里插入图片描述


宫崎骏、诺兰
各7部作品上榜

...


导演上榜电影数

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39702030/article/details/86924662