鱼C论坛

 找回密码
 立即注册
查看: 1410|回复: 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不支持的文件名。

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

三、源代码:

  1. #爬取豆瓣电影新片榜
  2. import requests
  3. import re


  4. def getHTML(url):
  5.     try:
  6.         head = {'User-Agent' :
  7.                 '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'}
  8.         data = {'username' : 'xxxxxx',
  9.                 'password' : 'xxxxxx'}
  10.         login_url = 'https://accounts.douban.com/passport/login?source=movie'
  11.         #登陆
  12.         session = requests.session()    #创建session对象
  13.         session.post(login_url, data=data, headers=head)
  14.         r = session.get(url, headers=head, timeout=30)
  15.         r.raise_for_status()
  16.         r.encoding = r.apparent_encoding
  17.         return r
  18.     except:
  19.         print('网页打开错误!')


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


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

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


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


  67. if __name__ == '__main__':
  68.     main()
  69.    
复制代码


四、心得:

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

五、资源下载

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

本帖被以下淘专辑推荐:

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 11:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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