爬取《电影天堂》,保存评分大于7.0 的电影地址

临近放假,无心看代码,干脆做点趣味的事情,爬虫找几部电影,打发旅途时间。(头一次,为自己编程^_^)

python爬虫,基本参考  网络爬虫实战:爬取并下载《电影天堂》3千多部动作片电影 这个博主的文章,但是碰到乱码,也是按照该博主的blog提示解决了,然后这里自己加了个过滤评分的。

# 我们用到的库
#大体来自原博客 https://blog.csdn.net/wenxuhonghe/article/details/84897936
import requests
import bs4
import re
import pandas as pd


def get_data(url):
    '''
    功能:访问 url 的网页,获取网页内容并返回
    参数:
        url :目标网页的 url
    返回:目标网页的 html 内容
    '''
    headers = {
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
    }
 
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        #add:canok
        #下面这个,自动推测网站编码,避免乱码
        r.encoding = r.apparent_encoding
        return r.text
    
    except requests.HTTPError as e:
        print(e)
        print("HTTPError")
    except requests.RequestException as e:
        print(e)
    except:
        print("Unknown Error !")



def parse_data(html):
    '''
    功能:提取 html 页面信息中的关键信息,并整合一个数组并返回
    参数:html 根据 url 获取到的网页内容
    返回:存储有 html 中提取出的关键信息的数组
    '''
    bsobj = bs4.BeautifulSoup(html,'html.parser')
    info = []
    
    # 获取电影列表
    tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})
    
    # 对电影列表中的每一部电影单独处理
    for item in tbList:

        movie = []
        link = item.b.find_all('a')[1]

        # 获取电影的名称
        name = link["title"]

        # 获取详情页面的 url
        url = 'https://www.dy2018.com' + link["href"]

       
        
        try:
            # 访问电影的详情页面,查找电影下载的磁力链接
            temp = bs4.BeautifulSoup(get_data(url),'html.parser')
            tbody = temp.find_all('tbody')
            
            score = 0
            #add: canok  添加评分过滤:
            score_co = temp.find_all('span')
            for i in score_co:
                #print(i)
                if '评分:' in i:
                    #print('找到评分',i)
                    score = float(i.strong.text)
                    break
            if score < 7.0:
                print('score too low,skip',score,name)
                continue
            else:
                # 将数据存放到电影信息列表里
                movie.append(name)
                movie.append(url)
                #print(name,url)

            # 下载链接有多个(也可能没有),这里将所有链接都放进来
            for i in tbody:
                download = i.a.text
                movie.append(download)
                #print(download)
            #print(movie)

            # 将此电影的信息加入到电影列表中
            info.append(movie)
            
        except Exception as e:
            print(e)
    
    return info

def save_data(data):
    '''
    功能:将 data 中的信息输出到文件中/或数据库中。
    参数:data 将要保存的数据  
    '''
    filename = './电影天堂.csv'
    
    dataframe = pd.DataFrame(data)
    dataframe.to_csv(filename,encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)



def main():
    # 循环爬取多页数据
    for page in range(1, 2):
        print('正在爬取:第' + str(page) + '页......')       
        # 根据之前分析的 URL 的组成结构,构造新的 url
        if page == 1:
            index = 'index'
        else:
            index = 'index_' + str(page)            
        url = 'https://www.dy2018.com/2/'+ index +'.html'
        # 依次调用网络请求函数,网页解析函数,数据存储函数,爬取并保存该页数据
        html = get_data(url)
        movies = parse_data(html)
        if movies:
            save_data(movies)
        #print(movies)
        break
        print('第' + str(page) + '页完成!')

if __name__ == '__main__':
    print('爬虫启动成功!')
    main()
    print('爬虫执行完毕!')

评分的标签:

上面只抓了3页,过滤小于7.0评分的资源。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值