scrapy爬取豆瓣电影中演员合作关系制作gephi图

以战狼2距离,从豆瓣电影中的战狼2的HTML页面可以看到,主演信息如下:

<a href="/celebrity/1000525/" rel="v:starring">吴京</a> / <a href="/celebrity/1100321/" rel="v:starring">弗兰克·格里罗</a> / <a href="/celebrity/1274840/" rel="v:starring">吴刚</a> / <a href="/celebrity/1031500/" rel="v:starring">张翰</a> / <a href="/celebrity/1018743/" rel="v:starring">卢靖姗</a> / <a href="/celebrity/1275864/" rel="v:starring">丁海峰</a> / <a href="/celebrity/1040352/" rel="v:starring">淳于珊珊</a> / <a href="/celebrity/1050430/" rel="v:starring">余男</a> / <a href="/celebrity/1274307/" rel="v:starring">于谦</a> / <a href="/celebrity/1315058/" rel="v:starring">石兆琪</a> / <a href="/celebrity/1173629/" rel="v:starring">海蒂·玛尼梅可</a> / <a href="/celebrity/1177383/" rel="v:starring">奥列格·普鲁迪乌斯</a> / <a href="/celebrity/1309600/" rel="v:starring">阿隆·汤尼</a> / <a href="/celebrity/1232563/" rel="v:starring">泰勒·哈里斯</a> / <a href="/celebrity/1371197/" rel="v:starring">勃小龙</a>

因而可以得到吴京----弗兰克.格里罗

                      吴京----吴刚

                      吴刚----张翰

等等这样的演员合作关系,将这些关系存储下来,然后可以分别进入他们的个人主页,主页中有这样一条:

 

<h2>
        最近的5部作品(已上映)
             · · · · · ·
            <span class="pl"> (
                
                    <a href="https://movie.douban.com/celebrity/1000525/movies?sortby=time&format=pic&" target="_self">全部</a>
                ) </span>
    </h2>


    </div>
        <div class="bd">
            <ul class="list-s">
                    <li class="">
                            <h3>2017</h3>
                        <div class="pic">
                            <a href="https://movie.douban.com/subject/26363254/">
                                <img class=""
                                    alt="战狼2"
                                    src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2503879634.jpg"
                                    title="战狼2"/>
                            </a>
                        </div>
                        <div class="info">
                            <a href="https://movie.douban.com/subject/26363254/" title="战狼2" class="">战狼2</a>
                                <em>7.3</em>
                        </div>
                    </li>
                    <li class="">
                            <h3></h3>
                        <div class="pic">
                            <a href="https://movie.douban.com/subject/27084919/">
                                <img class=""
                                    alt="开心剧乐部"
                                    src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2489524781.jpg"
                                    title="开心剧乐部"/>
                            </a>
                        </div>
                        <div class="info">
                            <a href="https://movie.douban.com/subject/27084919/" title="开心剧乐部" class="">开心剧乐部</a>
                                <em>7.3</em>
                        </div>
                    </li>
                    <li class="">
                            <h3></h3>
                        <div class="pic">
                            <a href="https://movie.douban.com/subject/26894547/">
                                <img class=""
                                    alt="真星话大冒险"
                                    src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2463036930.jpg"
                                    title="真星话大冒险"/>
                            </a>
                        </div>
                        <div class="info">
                            <a href="https://movie.douban.com/subject/26894547/" title="真星话大冒险" class="">真星话大冒险</a>
                                <em></em>
                        </div>
                    </li>
                    <li class="">
                            <h3></h3>
                        <div class="pic">
                            <a href="https://movie.douban.com/subject/27148432/">
                                <img class=""
                                    alt="巅锋问答"
                                    src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2502381249.jpg"
                                    title="巅锋问答"/>
                            </a>
                        </div>
                        <div class="info">
                            <a href="https://movie.douban.com/subject/27148432/" title="巅锋问答" class="">巅锋问答</a>
                                <em></em>
                        </div>
                    </li>
                    <li class="">
                            <h3>2016</h3>
                        <div class="pic">
                            <a href="https://movie.douban.com/subject/26284595/">
                                <img class=""
                                    alt="大话西游3"
                                    src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2377676571.jpg"
                                    title="大话西游3"/>
                            </a>
                        </div>
                        <div class="info">
                            <a href="https://movie.douban.com/subject/26284595/" title="大话西游3" class="">大话西游3</a>
                                <em>3.6</em>
                        </div>
                    </li>
            </ul>


根据这个分别又可以进入这5部电影的主页,再发掘演员关系,不断循环就可以了。


scrapy的代码如下:

import scrapy
from scrapytest2.CourseItems import CourseItem,YanyItem


class MySpider(scrapy.Spider):
    name="FileSpider"
    allowed_domains=["douban.com"]
    
    start_urls=['https://movie.douban.com/subject/26363254/']
    
    def parse(self, response):

        if 'subject' in response.url:              #电影的界面
            
            url=response.xpath('//span[@class="actor"]/span[@class="attrs"]/a/@href').extract()
            name=response.xpath('//span[@class="actor"]/span[@class="attrs"]/a/text()').extract()
            item1=CourseItem()
            item1['author']=name
            yield item1
            for url1 in url:
                yield scrapy.Request('https://movie.douban.com'+url1,callback=self.parse)
        else:                                         #演员的界面
            movie=response.xpath('//div[@id="recent_movies"]/div[@class="bd"]/ul/li/div/a/@href').extract()
            for url in movie:
                yield scrapy.Request(url,callback=self.parse)
            
    
      
        

import scrapy

class CourseItem(scrapy.Item):
    author=scrapy.Field()
    url=scrapy.Field()
    

import json
import codecs
from scrapytest2.CourseItems import CourseItem,YanyItem

class MyPipeline(object):
    def __init__(self):
        self.file=codecs.open('relation.txt',mode='wb',encoding='utf-8')
        print('initing~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
    def process_item(self,item,spider):
        for i in range(len(item['author'])):
            for j in range(i):
                self.file.write(item['author'][i]+'\t'+item['author'][j]+'\n')
                print(item['author'][i],'------',item['author'][j])

               

    

至此,就得到了一个演员关系网:

大致如下:

弗兰克·格里罗 吴京
吴刚 吴京
吴刚 弗兰克·格里罗
张翰 吴京
张翰 弗兰克·格里罗
张翰 吴刚
卢靖姗 吴京
卢靖姗 弗兰克·格里罗
卢靖姗 吴刚
卢靖姗 张翰
丁海峰 吴京
丁海峰 弗兰克·格里罗
丁海峰 吴刚
丁海峰 张翰
丁海峰 卢靖姗
淳于珊珊 吴京
淳于珊珊 弗兰克·格里罗
淳于珊珊 吴刚
淳于珊珊 张翰
淳于珊珊 卢靖姗
淳于珊珊 丁海峰
余男 吴京
余男 弗兰克·格里罗
余男 吴刚
余男 张翰
余男 卢靖姗
余男 丁海峰
余男 淳于珊珊

导入gephi,这里由于导入太多会看不清,我只导入了2000条数据,实际收集的数据在50000条。

使用ForceAtlas 2布局,再稍微调整下,得到下图:



可以再调整布局,使用圆形构图


展开阅读全文
博主设置当前文章不允许评论。

没有更多推荐了,返回首页