鱼C论坛

 找回密码
 立即注册
查看: 1614|回复: 1

[原创] 爬取豆瓣新片榜

[复制链接]
发表于 2020-4-7 01:32:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 233倔强不秃 于 2020-9-9 14:40 编辑

前言:

        爬虫入门基本上有将近一个月了,从urllib开始,bs4,正则,requests库,这一个月没之前学习那么积极了。主观原因是因为自己浮躁了,客观原因我认为是现在大多数爬虫教学都稍微过时,很多网站早已加设了反爬机制,

导致课上了实例不能得以验证,从而大大降低了学习的兴趣和动力。这一个月来的心得就是:不懂就查,看不懂接着查,不断尝试,多去找视频学习,多动手练,弄清楚一些关键词再去看代码或者文章可能会更好。

一、整体思路:

        请求头中设置了User-Agent,用了requests库的session方法模拟登陆获取cookie,然后就是正则表达式的编写(这个正则实在是太简单了。。。),其实不用正则也可以。从HTML文档中提取出榜单、链接和海报的地址,然后

分别保存,保存时注意格式。

二、遇到的问题

        保存格式的问题。因为榜单中有这样一个电影:《1/2的魔法》,这样即使我用了中文空格的补齐,但还是在这里出现了差错。还有就是这些符号:【'\\', '"', '/', '*', '?', '<', '>', '|', ':'】,它们都是Windows不支持的文件名。

也就是说在文件名中出现这些符号就会报错,所以我在以电影名为名称保存海报时就遇到了这样的错误。我的解决方案是用“&”将非法字符替换。

三、源代码:
#爬取豆瓣电影新片榜
import requests
import re


def getHTML(url):
    try:
        head = {'User-Agent' :
                'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'}
        data = {'username' : 'xxxxxx',
                'password' : 'xxxxxx'}
        login_url = 'https://accounts.douban.com/passport/login?source=movie'
        #登陆
        session = requests.session()    #创建session对象
        session.post(login_url, data=data, headers=head)
        r = session.get(url, headers=head, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r
    except:
        print('网页打开错误!')


def parseHTML(html, mlist, mbills):
    try:
        movie_info = r'<a class="nbg" href="(.+)" +title="(.+)">'
        mlist.extend(re.findall(movie_info, html))
        movie_imgs = r'"(.+)" *width="75'
        mbills.extend(re.findall(movie_imgs, html))
    except:
        print('网页解析错误!')


def saveMovieList(mlist):
    try:
        tplt = "\t\t{0:^8}\t\t{1:{3}^10}\t\t{2:^10}\n\n"
        with open('F:\\py爬虫\\demo\\豆瓣新片榜\\新片排行榜.txt', 'w') as f:
            f.write(tplt.format('排名', '电影名称', '资源链接', chr(12288)))
            num = 1
            for each in mlist:
                f.write(tplt.format(num, each[1], each[0], chr(12288)))
                num += 1
            print('读取完成!')
    except:
        print('保存榜单错误!')

    
def downloadMovieBills(mbills, mlist):
    try:
        index = 0
        illegal = ['\\', '"', '/', '*', '?', '<', '>', '|', ':']    #命名时的非法字符
        for each in mbills:
            name = mlist[index][1]
            
            for i in name:      #非法字符都替换为“&”
                if i in illegal:
                    name = name.replace(i, '&')
                    
            with open('F:\\py爬虫\\demo\\豆瓣新片榜\\电影海报\\'+name+'.jpg', 'wb') as f:
                img = getHTML(each).content
                f.write(img)     
            index += 1
        print('下载完成!')         
    except:
        print('下载海报错误!')


def main():
    url = 'https://movie.douban.com/chart'
    movies_list = []    #电影排行榜
    movies_bills = []   #电影海报链接
    html = getHTML(url).text 
    parseHTML(html, movies_list, movies_bills)  #解析HTML
    saveMovieList(movies_list)  #保存电影排行榜单
    downloadMovieBills(movies_bills, movies_list)    #下载电影海报


if __name__ == '__main__':
    main()
    

四、心得:

        尽量学会独立的解决问题,学习的过程中不可避免遇到很难理解的东西,这些东西往往需要花时间去啃,从而加深理解变为已用。冰冻三尺非一日之寒。

五、资源下载

豆瓣新片榜.rar (233.74 KB, 下载次数: 8)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-7 09:44:17 | 显示全部楼层
鼓励
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表