233倔强不秃 发表于 2020-4-7 01:32:24

爬取豆瓣新片榜

本帖最后由 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, each, chr(12288)))
                num += 1
            print('读取完成!')
    except:
      print('保存榜单错误!')

   
def downloadMovieBills(mbills, mlist):
    try:
      index = 0
      illegal = ['\\', '"', '/', '*', '?', '<', '>', '|', ':']    #命名时的非法字符
      for each in mbills:
            name = mlist
            
            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()
   


四、心得:

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

五、资源下载

Hello. 发表于 2020-4-7 09:44:17

鼓励{:10_298:}
页: [1]
查看完整版本: 爬取豆瓣新片榜