视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2020-11-27 14:35:14 责编:小采
文档


抓取豆瓣电影TOP100
一、分析豆瓣top页面,构建程序结构
1.首先打开网页http://movie.douban.com/top250?start,也就是top页面
然后试着点击到top100的页面,注意带top100的链接依次为

http://movie.douban.com/top250?start=0
http://movie.douban.com/top250?start=25
http://movie.douban.com/top250?start=50
http://movie.douban.com/top250?start=75

2.然后通过查看源码,发现电影名的代码如下:

肖申克的救赎
/ The Shawshank Redemption
如图,因为有一些英文名等描述,通过正则抓取有些干扰,可能还需要后续过滤。

根据以上信息,此程序主要分以下3个步骤:

二、构建url地址池

  • 抓取top100电影名称
  • 依次打印输出
  • 依次写出代码

    1.构建url地址池。代码如下:

    import urllib2
    import re
    # ----------确定url地址池------------
    pre_url = 'http://movie.douban.com/top250?start='
    top_urls = []
    # 因为top100,每页25部电影,故为4页,从零开始
    for num in range(4):
     top_urls.append(pre_url + str(num * 25))
    

    2.抓取top100电影名称

    # ------------抓取top100电影名称----------
    top_content = []
    top_tag = re.compile(r'(.+?)')
    for url in top_urls:
     content = urllib2.urlopen(url).read()
     pre_content = re.findall(top_tag, content)
     # 过滤不符合条件的list,得到最后的top100的list
     for item in pre_content:
     if item.find(' ') == -1:
     top_content.append(item)
    

    3.打印输出

    top_num = 1
    for item in top_content:
     print 'Top' + str(top_num) + ' ' + item
     top_num += 1
    
    

    三、整理代码
    我还是python新手,还没有太多的pythonic思想,也没有代码优化技巧,只能说是整理。
    其次,个人习惯,在简单的代码里面我还是喜欢少用函数,尽量不隐藏代码的逻辑。
    以下代码请参考,并欢迎提意见,希望得到大家的意见,谢谢!
    整理后的代码如下:

    # coding=utf-8
    '''
    本代码为自动抓取豆瓣top100电影代码
    @pre_url url地址前缀,在这里为http://movie.douban.com/top250?start=
    @top_urls url地址池
    @top_tag 为抓取电影名正则表达式
    '''
    
    import urllib2
    import re
    
    pre_url = 'http://movie.douban.com/top250?start='
    top_urls = []
    top_tag = re.compile(r'(.+?)')
    top_content = []
    top_num = 1
    
    # ----------确定url地址池------------
    # 因为top100,每页25部电影,故为4页,从零开始
    for num in range(4):
     top_urls.append(pre_url + str(num * 25))
    
    
    # ------------抓取top100电影名称,并打印
    输出---------- top_tag = re.compile(r'(.+?)') for url in top_urls: content = urllib2.urlopen(url).read() pre_content = re.findall(top_tag, content) # 过滤并打印输出 for item in pre_content: if item.find(' ') == -1: print 'Top' + str(top_num) + ' ' + item top_num += 1

    抓取用户头像图片

    import urllib.request
    import re
    import time
     
    #获取输入的帖子单页html
    def getHtml2(url2):
     html2=urllib.request.urlopen(url2).read().decode('utf-8')
     return html2
     
    #抽取图片相关列表,并下载图片
    def gettopic(html2):
     reg2=r'http://www.douban.com/group/topic/d+'
     topiclist=re.findall(reg2,html2)
     x=0
     #下载的图片数
     for topicurl in topiclist:
     x+=1
     return topicurl
     
     
    #下载图片到本地
    def download(topic_page):
     reg3=r'http://img3.douban.com/view/group_topic/large/public/.+.jpg'
     imglist=re.findall(reg3,topic_page)
     i=1
     download_img=None
     for imgurl in imglist:
    #取图片ID为文件名
     img_numlist=re.findall(r'pd{7}',imgurl)
     for img_num in img_numlist:
     
     download_img=urllib.request.urlretrieve(imgurl,'D:pythoncodegirls\%s.jpg'%img_num)
     time.sleep(1) 
     i+=1
     print(imgurl)
     return download_img
     
    #调用函数
    page_end=int(input('请输入结束时的页码:'))
    num_end=page_end*25
    num=0
    page_num=1
    while num<=num_end:
     html2=getHtml2('http://www.douban.com/group/kaopulove/discussion?start=%d'%num)
     topicurl=gettopic(html2)
     topic_page=getHtml2(topicurl)
     download_img=download(topic_page)
     num=page_num*25
     page_num+=1
     
    else:
     print('采集完成!')
    

    下载本文
    显示全文
    专题