肖战粉丝对战ao3用户事件,也就是“227大团结”,席卷全网,已经沸沸扬扬地持续了一个多周。
简而言之,就是肖战和王一博的某个CP粉,以明星真人名字为主角,写了一篇同人小说《下坠》,里面肖战是一个有性别认知障碍的发廊妹,和16岁的高中生王一博产生了恋情,文中有多处性行为描写(但双方未做到最后一步)。
作者将文章发布在ao3网站(境外网站)上,随后分享到微博,获得几千转发。
肖战的唯粉认为这是严重的侮辱,且涉及未成年色情淫秽,不该在公开平台传播,怒而举报写手,锁掉了文章。之后还嫌不够,又号召举报发布小说的平台lofter和ao3。
关于《下坠》详情,可以点击此文了解:
2月29日,ao3网站无法在国内访问,被认为“被墙了”。这引起了圈内外写手们的极大愤慨,继而各行各业都纷纷下场,以“粉丝行为偶像买单”为名,开展了一场轰轰烈烈的抵制肖战行动。
肖战粉丝错在何处?肖战在2019年暑假靠耽美网剧《陈情令》走红,一跃成为顶流。
网剧的影响力其实有限,而且这部剧没法在电视台反复重播,那么如何维持演员热度?不得不说,由影视剧衍生的各种二次元同人产出:mv、美图、文章等等有很大的功劳。
《陈情令》针对的受众也很明显,就是腐女和二次元人群。这些年轻群体本身就酷爱在网络上发声,热情、盲目、大方、思维活跃、产出量大,从不吝啬于购买偶像的代言产品。她们营造的浩大声势,是肖战商业价值的来源。
但水能载舟,亦能覆舟。畸形的爱有时候比盲目的恨更可怕。
同人作品的版权问题其实很复杂,不过即使在没有商业盈利的前提下,肖战本人选择去告那篇文章的作者,大概率也是会成功的。
但是同人文化盛行这么久,明星们在衍生的拉郎视频和小说里被塑造成各种黑白灰的人物,经历过各种酸甜苦辣的故事,却从来没有明星选择去告。
为什么?因为同人文化令他们受益良多。
现在的影视作品普遍水准较低,观众们未必会通过影视剧爱上一个明星,却有可能会在同人小说或者自制视频里喜欢上一个角色。因为那是年轻人自己创造的世界。
比如,粉丝自制的肖战迪丽热巴“主演”的《将门毒后》系列视频播放量很高,是b站知名作品。
明星如果要告,那么作品中侵犯他们的尺度和界限在哪里?什么情况下属于违法和侵权?这个口子一开,以后还会不会有创作者继续“为爱发电”?以后还能不能通过同人作品吸粉?
衡量之下,明星们选择了沉默。
如果某些同人文尺度过大,或者带有侮辱性的描写,粉丝接受不了怎么办呢?可以选择和微博或者LOFTER的平台管理员投诉。
集中举报之下,管理员至少会删除文章。而不是选择用大炮打蚊子,大张旗鼓的举报到网信办和扫黄打非办,将平台一锅端。
肖战和以往被大黑的明星们不同,他只有几部网剧作品,没有多部上星作品的累积,也没有发展出扎实的国民度。得罪了网络上的二次元用户,也就等于得罪了他的潜在受众群体。实在是一次愚蠢至极的举动。
以后的道路必将更加艰难,他将来可能得付出多十倍的努力,才有可能让这些网络上活跃又偏激的群体改观。但他也可能就此一蹶不振,从巅峰陨落。这得看肖战接下来的几部剧表现如何,制作方才好评估用他的风险。
本该是粉圈内部摩擦,为何闹得沸沸扬扬?事实上,举报在乌烟瘴气的明星粉圈内部非常常见,小到举报某条微博,大到举报某个品牌。
2018年初,陈伟霆传闻即将代言三草两木品牌,并参加了三草两木签约仪式合影。
粉丝嫌弃这个品牌太low,属于“三无微商”,各地后援会和官方后援会集体下场换了“立即毁约”的头像,大肆举报,妄图撕掉代言。
最后逼得品牌方发了律师函和各种资质证明书,证明自己并不是“三无微商”。
品牌方老总在直播时痛哭流涕,并终止了和陈伟霆的合作。
认为肖战粉丝从一开始就不该举报任何人的人当中,也有曾经在其他圈子里参加过其他举报行为的。
举报,本身只是一个毫无感情的工具,只不过旁人赋予了它或正义或卑劣的意义。
利用舆论和举报的手段来达成自己的目的,也不止存在于粉圈。
这几年,历史粉和明星黑粉大肆举报《赢天下》《霍去病》《长歌行》等电视剧的场景犹在眼前,美其名曰是电视剧胡编乱造、抹黑历史人物,为了避免观众学到错误的历史。
但历史人物不是平面的,他们也不是一味的高大全伟光正。所谓“抹黑人物”的标准在哪里?故事虚构的界限又该如何界定?由谁界定?尺度和标准在哪里?这一直是悬在诸多影视制作公司头上的利剑。
十多年前,不符合历史、“胡编乱造”的古装戏说电视剧数不胜数,诸如《寻秦记》《穿越时空的爱恋》《乌龙闯情关》《机灵小不懂》《大脚马皇后》《绝色双娇》等等。编剧们肆意放飞想象编造故事。
当然,这些剧都会在片头标明“本故事纯属虚构,请勿对号入座”。
最近几年,审核制度越来越严格,戏说剧也不复存在。但审核标准又模糊不清,似乎哪个部门都可以插手广电的工作。比如少数民族可能会投诉故事伤害民族感情,武当少林寺也会投诉武侠剧中本派的反面形象。
创作者们可以戴着镣铐跳舞,但这些镣铐是无形的,又是无处不在的,他们不知道哪里会踩到雷。
再往深层次想,如果有影视公司或演员的竞争对手,利用举报手段来诬陷别人呢?
几百人的剧组兢兢业业拍了大半年,因为“举报”,所有人的心血全废,还可能导致资金链断裂,公司倒闭,员工失业……这手段如何不让人又怕又恨?
去年开始,起点网大批历史小说、灵异小说纷纷下架,晋江耽美写手深海先生被举报入狱。“举报”二字,也是悬在网络写手心头上的刀。
所以,由肖战粉丝的举报行为而生出的轩然大波,已经不仅仅是小众圈子内的撕扯。
一句“干涉创作自由”,和粉丝们肆无忌惮的举报手段,点燃了影视圈和写手圈压抑了多年的悲愤、恐惧和怒火。
原本和饭圈无关、也和二次元无关的圈内导演编剧纷纷下场了。
被资本力捧的肖战,罪该万死吗?所谓的粉圈文化由来已久。流量形成于2014年,起始于归国四子和李易峰、杨洋等人。
流量粉群带着从日韩娱乐圈流传过来的畸形理念,在利益和个人私心的驱使下,借助微博这个公众平台,孕育出庞大的、嚣张跋扈、撒泼打滚的恶意。
可以说,路人苦粉丝久矣。
肖战的粉圈,不过是一个又一个流量前辈的缩影。他们所呈现出来的嚣张、癫狂、无知和暴戾,其实早已经在其他粉丝群里见识过了。只是前辈们都转型或过气了,粉群就试图甩脱恶霸形象,塑造温良谦恭让的形象。
肖战作为新晋流量,粉丝群体也才形成一年多。他们何德何能,能够成为这样的代表?承担如此严重的罪名?
所谓的为了和“资本”对抗,所以要抵制肖战——这种言论更是滑天下之大稽。
资本是错误的吗?是和群众对着干的魔鬼吗?
资本的天性是逐利,影视制作公司签约新人,再集中力量力捧成摇钱树,不是合乎常理的事吗?
只不过这些摇钱树,资质不一,有的获得群众认可,有的则成为强推之耻。
21岁的非科班艺人孙俪参加选秀获奖,签约海润,一出道就出演了海岩的《玉观音》。
24岁的非科班艺人刘诗诗,由唐人一路力捧,出演了《步步惊心》。
26岁的非科班艺人李易峰,由欢瑞力捧,找来众多大咖众星捧月出演了《古剑奇谭》。
肖战的经纪人是新丽公司副总,他出演新丽制作的影视剧,又有什么问题呢?为什么他就变成了罪恶的资本的代表,变成了和群众对着干的一手遮天的丑陋小人?
一开始我也为粉丝举报的事情愤怒,也怀着看热闹的心态,想看脑残粉们接受社会的毒打,得到教训。
但看各方下场撕扯了这么多天,如果说圈内人士还顾及到体面和素质,没有口出恶言,那么煽风点火、喊打喊杀的网友,早已让人不寒而栗。
外网谣言肆虐,盛传肖战去世,网友将其当做笑话发到论坛,排队哈哈哈。
集体批斗他成了政治正确。任何人披上一张“肖战粉丝”的皮,都可以要求肖战买单,所有的黑锅、经年累月被审查的怨恨统统甩到肖战的头上。如果不是快播时隔太久,那么快播被下架应该也是肖战的责任。
各方心怀鬼胎逼肖战出面受死。人人以践踏他为荣,挖黑历史、造谣、侮辱谩骂,恨不得将他立刻当众处以极刑,才能大快人心方显正义。
前两天肖战的外公去世,尽管只是同公司的小艺人发微博后秒删,但依然引来论坛屠版辱骂,骂他竟卑劣到借亲人来卖惨洗白。
我瞠目结舌,也毛骨悚然。他何罪至此?
事情的开篇,人们为AO3发声和强烈要求肖战管束粉圈、为此事道歉的时候,还可以说怒火控制在合理范围之内。但发酵到现在,已经超越了“抵制资本,反对举报,反对文化审查”的范围了。
抵制肖战的阵营内部出现了“意见领袖”,开始长篇大论目标精准地逐条列出了抵制肖战的指南,肖战代言的olay首当其冲:
没买过olay的也不要紧,宝洁旗下所有产品都可以去开发票。
其实公司有没有偷税漏税并不取决于消费者开不开纸质发票。而代言人的选择,也不由客服决定。纠集数量庞大的群体,在短时间内要求商家以邮寄方式开具纸质发票,只会加大公司财务和快递等部门的工作量。
何况在疫情艰难复工期间,国家提倡节约资源,建议使用电子发票,他们却非要纸质发票,还想让商家出邮寄费。不仅浪费了社会资源,折磨的也只是底层工作人员罢了。
开发票之外,还有其他各种找品牌麻烦的角度,越是刁钻,越能赢得追捧。
无论是科普同人作品存在的法律风险,还是表示看不懂这场闹剧,都会被一刀切为团队公关手段。
一切不和他们站在同一战线、或试图讲道理的人,都只会换来“他急了他急了他急了”“收钱洗白”之类的言论。
发展到现在,仿佛又是一个“屠龙少年终成恶龙”的故事,不允许不同意见存在的肖战粉圈倒下了,另一个战斗力更强大的粉圈站了起来,以正义为名的以暴制暴,代代循环,永不止息。
再看到这些言论,简直令人忍不住发笑。这些人抵制肖战的代言,不是为了教训粉丝,让粉丝心痛,而是为了让其他【没有舆论风险的流量】取而代之。为了让资本放弃肖战,转而去捧【其他更有潜力的新人】。
所以资本没有错,错的是资本看中了肖战去捧,却没有选择他们看中的新人。
所以即使AO3网站回来了,他们都坚持要把肖战打倒。
所谓“正义”的呐喊,到底是为了谁呢?
宁可花精力去网暴,也不愿意花精力去通过别的方式登录AO3。
失去AO3的受害者,还记得自己想要争取的是什么吗?
这些试图踩着肖战挤上位的人,究竟有没有想过,这件事之后,国际大品牌可能从此不会选择国内的流量明星代言。
因为这场风波并不是因肖战本人而起,而是因为粉丝。说明流量艺人的风险难以控制。这场莫名其妙的网络暴力不会让新人脱颖而出,却会让商家对流量敬而远之。
而利用粉丝斗倒偶像,又会是多简单好用的手段。
这些恶果,都将会由接下来上位的流量承担。
肖战应该为粉丝行为负责,彻底退圈吗?有几位患有抑郁症的ao3作者,在微博发遗书,说自己写作的地方没有了,不想活了,决定自杀。然后告诫父母不要买肖战的代言。
可是AO3还有一个镜像网址可以登陆,小说也都还在。没人阻止你们创作,只要花点钱买个翻墙软件就可以解决,为此增加的麻烦,可以靠骂肖战抵制肖战来泄愤,何以发展到要去死的地步?
还有患有抑郁症的肖战粉丝,也宣布要自杀,并且说自己就是被那些黑肖战的人害死的……
事到如今,我觉得双方的过激分子本质上都是一个样,AO3是写手的精神家园,肖战又何尝不是粉丝的精神家园?
难道人生就真的这么无聊,为了一个网站和一个明星就能够放弃生命?
这件事发生在新冠疫情期间,无数医护人员舍生忘死,无数卑微民众挣扎求生的场景犹在眼前。
对比来看,我只觉得可笑、可悲、可怜。
肖战该不该因为粉丝的行为和言论,付出这辈子事业断绝的代价?
我认为,没必要。
因为这件事本质和肖战没有关系。他没有打举报电话,也没有建立那堵墙。
一个明星除非触犯法律,涉及黄赌毒。否则他的事业发展,都应该由市场来做选择。如果肖战拍的戏全部扑街,无人关注,那么他糊退圈,是理所应当的。
肖战的粉丝以“爱他”和“维护他”之名做错了事,他承担大众的怒火,受到指责和抵制,也是在所难免的。
但是他没有必要背负粉丝的错误、背负长久以来文艺作品审查制度的罪名,主动退圈。
几十年前,张国荣和谭咏麟的粉丝当街殴打,被抓进警局。他俩需要负责吗?杨丽娟的父亲为了引起刘德华的注意,跳海自杀,影响恶劣。刘德华需要负责吗?
1981年,一个美国青年暗恋好莱坞女星朱迪•福斯特,为了引起偶像的注意,刺杀美国总统里根,白宫新闻发言人詹姆斯•布拉迪被子弹击中头部而终生瘫痪。朱迪需要为此负责吗?
很多人觉得,粉丝犯错,就必须要狠狠“教育”一下她的正主,这样才会让她有切肤之痛。但娱乐圈永远不缺流量,肖战糊了还会有下一个“好哥哥”,粉丝们换一个ID,又可以在新的粉群继续呼风唤雨。
而这群为偶像惹出了大祸的粉丝,是不是真的那么无可救药呢?在这次的疫情中,肖战粉丝一共捐献了近270万的物资款项。
他们为什么以偶像的名义捐款?归根到底,也是为了以善举传播偶像的美名。
举报AO3、在网上嚣张狂妄、横行霸道的肖战粉丝,以“为了偶像好”的名义做出的暴行,如果需要肖战本人为他们买单,那么这群为疫情捐款捐物的粉丝,又算什么呢?
她们或许和举报者是同一群人,也可能不是同一群。
关于偶像和粉丝关系的探讨攻击者认为,这次举报是出于肖战团队授意,是肖战急于洗刷自己的耽美咖形象,急于进入主流视野(可是他已经登上了春晚的舞台,还有比这更主流的地方吗?)。
这种揣测并没有什么依据。因为明星团队直接向新浪投诉,在微博删除文章就可以了,这种手段任何明星团队都能做到。举报外网对明星本人也没什么意义。
这次事件从2月24日文章发布在新浪微博开始,到26号粉丝内部开始了大规模举报,2月27日引起爆发。这段时间里,肖战团队本有无数次机会自救。
2月29日,AO3无法登陆。二次元用户们怒而抵制肖战代言,给他的影视剧刷一星。
3月1日,肖战粉丝和举报的大粉切割。一直到当天晚上,肖战工作室才姗姗来迟发布了一篇轻描淡写的声明……
在这6天里,肖战团队既没有公开的劝阻、安抚、道歉,也没有在粉群内部发表官方态度。
团队什么都不知道吗?并不是。
双方拉锯战的那几天,出现了#肖战粉丝举报ao3#话题被删、话题热度下降,热搜被撤等普通人难以实现的公关举措,说明团队一直在关注事态的发展,并且随时在和新浪沟通。
这些举措更加激起了大家对抗资本的愤怒。
遇到争端,就妄图把争端压下去,而非及时处理——其实是大部分组织常见的举动。但这种官腔十足、高高在上的态度,不仅体现了傲慢、迟钝、冷漠、推卸责任的心态,也体现了明星团队的愚蠢和落伍。
因为二次元网民互相交流的方式花样百出,极其迅速,并且一呼百应,他们从来不需要靠热搜传递消息。而且他们年轻气盛,你用堵住嘴巴的方式应对,就别怪他们逆反心起了。
所以肖战迎来了前所未见的舆论危机,极难收场。
这场危机公关的应对,肖战团队负分。
而肖战本人,也需要承担一定的责任。
肖战25岁从设计师转为爱豆,由于唱跳不突出,年纪偏大,在组合里并不占优势。他是靠粉丝投票才得以出道的。粉丝是他的衣食父母,所以他渴望并且讨好粉丝的心情,有迹可循。
肖战今年29岁,比起年轻鲜嫩的偶像们,红得太晚了。而他刚刚从选秀爱豆转为演员,陈情令是他第一次正儿八经地做男主角,心态也没来得及转换过来。他应该格外害怕失去,也不敢违拗粉丝的心情(不止是纯粉,也包括cp粉)。
作为流量明星,一举一动都被用放大镜紧紧盯着,肆意解读和曲解。明星因为写错字、用错词,被辱骂甚至网暴的事情并不少见。
但是对于偶像来说,不表达,就没有风险了吗?
流量粉丝掀起的声势太过巨大,路人不了解你,只会觉得粉丝代表的都是明星的态度。
而粉丝作为鱼龙混杂、素质参差不齐、又充满私心的短视的群体,如果缺乏正确引导,不仅会让路人群起而攻之,更会让明星遭到迁怒。
同为流量爱豆的蔡徐坤、陈立农、杨超越,都曾亲自下场劝阻过粉丝的偏激行为。
即使劝阻未必能使疯狂的粉丝清醒,哪怕你隐晦地表达不赞同的态度——至少你曾经劝过,撇清责任时也能更理直气壮些。一部分理智的路人可能不会因此而迁怒你。
但对粉丝的偏激行径视而不见、温和纵容,就是养虎为患。
你一言不发,就意味着把发声的权利交给了粉丝。
所以明星承担由此反噬的苦果,也是注定的,而肖战作为最当红的流量之一,所要承受的反噬,自然也是最严重的。
只是肖战承受的辱骂和攻击,未免太过了些。
事态拖延到现在,他既不能站出来支持AO3写手,这样岂不是和国家净网行动对着干?更不能声援粉丝,那意味着自杀。
骑虎难下,左右两难。
肖战这次遭遇的舆论危机,足以载入史册。
不知道几个明星团队会引以为戒,重视舆论和公关;有几个明星会猛然醒悟,勇敢表达自己的想法。
但我相信粉圈永远不会反省。因为热血沸腾的年轻人,总会有各种各样的原因,释放空余的激情。而明星粉圈,就是最容易在其中找到存在感和权力欲望的地方。
写在前面:就在昨天,豆酱的某乎在第二次15天禁言之后,又被有计划的禁言了15天,也就是说截止昨天(2020/3/27),豆酱因为之前的评论已经被禁言过7+15天,并将再加未来15天。可见这个并不是一时冲动的行为,而是有计划的。首先我相信某乎的公正性,也感谢做这个事情的人没对我的号做什么。 但是作为对豆酱昨天被禁言的回应,今天我的文章会调整一下。原计划是给大家科普自然语言处理(NLP)和文本分类,但今天我会先放出我B站视频展示的约600篇文章是如何爬取的技术文。
最后我想对那些不喜欢我的人说:我是个技术人,我开始尝试做内容是希望让大家展示好玩的技术,吸引大家学习知识。虽然我写的文章和视频引起了争议,但是我一直希望跟大家讲解的如何获得和爬取数据,如何分析,我的结论是如何获得的,希望大家喜欢这样探讨问题的方法。我虽然有自己的观点,我夫人也喜欢肖战,但我们并不想针对或死磕任何人。 你们正在使用你们所不齿的方法针对我们。 古话有云:己所不欲勿施于人。
文章无图有料,不懂技术的各位也应该仔细瞧瞧。
在之前的文章中,我已经和大家分享了如何直接爬取AO3的文章,那么如何找到文章的关联关系是一件比较头疼的问题。如果自己去写爬虫会比较浪费资源。最省事的方法就是借助搜索引擎进行资料获取。这里,我们就以 lofter 到 AO3 的外链为例。
加载的函数库还是与之前相同,这里我不再复述。
import sys
import re
import os
import time
from tqdm import tqdm
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from bs4 import BeautifulSoup
import random
这里和大家科普一下搜索引擎的高级搜索模式,平时大家使用搜索引擎,可能都是一整句话放进去搜索。但实际上搜索引擎是支持一定的高级语法以方便获取到更高级的内容。我们以谷歌为例:
“”精确匹配
使用引号来搜索一个完全匹配的字词或一组字词。在搜索歌词或文学作品中的一段文字时,此选项很实用。建议您只在查找非常确切的字词或词组时使用该功能,否则可能会无意中排除掉有用的搜索结果。
例如“见与不见” 搜索结果精确匹配“见与不见”,不能拆分成“见”与“不见”。
-排除字词
在某个字词前添加短横 (-) 可排除所有包含该字词的搜索结果。
例如:大熊猫 -百科 搜索结果中不出现“百科”
OR选择性字词搜索
选择性字词OR搜索结果匹配多个搜索字词中的任意一个。没有OR搜索结果中通常只会显示与多个字词都匹配的网页。
例如:奥运会 2014 OR 2018 搜索结果中会出现 “奥运会 2014”或者“奥运会 2018”的结果
site在特定网站或域名中搜索
在搜索中加入“site:”可以限定在某个特定网站中搜索信息
例如:LOFTER site:lofter.com
“site:”后面跟的站点域名,不要带“http://”。site:和站点名之间,不要带空格。
inurl在特定url链接中搜索
在搜索中加入“inurl:”可以限定在网站url链接中搜索网站信息
例如:auto视频教程 inurl:video
搜索词“auto视频教程”是可以出现在网页的任何位置,而“video”则必须出现在网页url中。
以上只是谷歌的部分高级搜索语法,百度也有类似的使用方法,大家可以自己去查查详细的使用方法。我们这里用到了 site: 标签 和 inurl: 标签 也就是:
site:lofter.com inurl:ao3
这条语句的含义是,在 lofter.com 中 搜索 含有 ao3 链接 的结果。这里需要注意,实际搜索过程中,"ao3" 需要换成该网站的实际域名。这里因为不想透露真实网站地址所以使用了 "ao3" 替代。
分析url 的思路我在 《我是怎样得到AO3内容的》 有介绍过,这里直接给结论。谷歌的url 由 search?后的内容构成:
hl=en 表示搜索语言为英文
q= 后跟搜索内容
safe= 跟的是是否为安全搜索,这里使用images参数关闭安全搜索也就是可以搜索到不好的信息~
num= 表示每页展示的搜索条数
start= 表示从第几条开始显示,所以翻页的计算方法为 start = page*num
这里说明一下,我确实专门搜索了语言为英文的页面,但搜索引擎的模糊性使得结果依然有大部分是中文文章。但是我可以证明两点:
之前有说在ao3 看英文或学英语是真实的;
我还没有开始做文本分析,但就我看过的几篇英文文章中,以我留过学的经历来衡量,文章中确实含有书本上一般学不到的东西和词汇;【手动狗头】
言归正传看代码:
#获谷歌取搜索页面
def make_google_search_url(page=0, num=100):
base_loc = 'https://www.google.com/search?hl=en&q=site:lofter.com+inurl:ao3&safe=images'
base_loc += "&num="+str(num)
base_loc += "&start="+str(page*num) #搜索页
return base_loc
获取链接的方法依然是 chrome 浏览器调试模式(F12)分析元素并用 BeautifulSoup 解析,这里不再复述,大家直接看代码。
#从谷歌获取文章链接
def get_url_from_search(html):
old_list = []
soup = BeautifulSoup(html, 'html.parser')
search_div = soup.find('div', attrs={'id': 'search'})
div_g_groups = search_div.findAll('div', attrs={'class': 'g'})
for g in div_g_groups:
div_r = g.find('div', attrs={'class': 'r'})
a_hurl = div_r.find('a')
old_list.append(a_hurl['href'])
return old_list
最后就是判断 lofter 的页面中是否含有 有效的 ao3 链接。按照之前的经验,判定含有 works 的 url 才考虑为有外链文章。但是在后来实践过程中 发现含有 users 的外链也非常有意思,就一并保存了。
保存的内容有: lofter 页面,本 lofter 页面中所有含有 ao3 外链的链接,所有涉及的 ao3 原文页面,ao3 用户介绍页(内含该用户所有文章)
注意,目前目前我只是保存了 ao3 用户介绍页(如果有)。并没有进行二次爬取或分析。
另外相比 《我是怎样得到AO3内容的》中的函数,这里进行了优化,当出现“Retry later”时,函数会自动重试,而不会想之前就直接把这一页放过不保存了。
代码中 ao3 站点地址我使用 xxx 代替。
def find_ao3_from_lofter(lofter_url_list, browser, path):
for url in lofter_url_list:
print(url)
dir_name = (
url.replace("http://", "")
.replace(".com/", "_")
.replace("/", "_")
.replace(".", "_")
)
dir_path = os.path.join(path, dir_name)
isExists = os.path.exists(dir_path)
if isExists:
print("Exists")
continue
# 判断结果
ao3_links = []
browser.get(url)
currurl = browser.current_url
if "xxx" in currurl and (
"/works/" in currurl or "/users/" in currurl
): # 如果url 直接跳转
ao3_links.append(currurl)
lhtml = ""
else: # 没有跳转
lhtml = browser.page_source
soup = BeautifulSoup(lhtml, "html.parser")
alink_groups = soup.findAll("a", attrs={"rel": "nofollow"})
for alink in alink_groups:
href_str = alink["href"]
if "xxx" in href_str and (
"/works/" in href_str or "/users/" in href_str
):
ao3_links.append(href_str)
if ao3_links:
# 判断路径是否存在
isExists = os.path.exists(dir_path)
# 如果不存在则创建目录
os.makedirs(dir_path)
links_str = url + "\n"
need_agree = True
for work_url in ao3_links: # 遍历ao3链接
links_str += work_url + "\n"
print(os.path.join(dir_path, "links.txt"))
fh = open(os.path.join(dir_path, "links.txt"), "w") # 保存页面
fh.write(links_str) # 写入内容
fh.close() # 关闭
print(os.path.join(dir_path, "lofter.html"))
fh = open(os.path.join(dir_path, "lofter.html"), "w") # 保存页面
fh.write(lhtml) # 写入内容
fh.close() # 关闭
for work_url in ao3_links:
browser.get(work_url)
if need_agree:
try:
time.sleep(3)
browser.find_element_by_id("tos_agree").click()
time.sleep(1)
browser.find_element_by_id("accept_tos").click()
time.sleep(1)
need_agree = False
except NoSuchElementException:
need_agree = False
work_html_text = browser.page_source # 获得页面代码
work_name = (
work_url.replace("https://", "")
.replace("http://", "")
.replace("xxx", "")
.replace(".com/", "")
.replace(".org/", "")
.replace("/", "_")
.replace(".", "_")
.replace("#", "_")
)
work_path = os.path.join(dir_path, work_name + ".html")
if (
'If you accept cookies from our site and you choose "Proceed"'
in work_html_text
): # 无法获取正文则点击Proceed
browser.find_element_by_link_text("Proceed").click()
time.sleep(1)
browser.get(work_url)
work_html_text = browser.page_source
if "Retry later" in work_html_text:
while "Retry later" in work_html_text:
print(work_path)
fh = open(work_path, "w") # 保存页面
fh.write("Need_to_reload") # 写入内容
fh.close() # 关闭
print("Retry Later")
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
browser.quit()
c_service.stop()
time.sleep(60)
c_service.start()
browser = webdriver.Chrome(
chrome_options=chrome_options
) # 调用Chrome浏览器
browser.get("https://xxx.org/")
time.sleep(5)
browser.find_element_by_id("tos_agree").click()
time.sleep(2)
browser.find_element_by_id("accept_tos").click()
time.sleep(3)
browser.get(work_url)
work_html_text = browser.page_source # 获得页面代码
if (
'If you accept cookies from our site and you choose "Proceed"'
in work_html_text
): # 无法获取正文则点击Proceed
browser.find_element_by_link_text("Proceed").click()
time.sleep(1)
browser.get(work_url)
work_html_text = browser.page_source
# if "" in work_html_text:
print(work_path)
fh = open(work_path, "w") # 保存页面
fh.write(work_html_text) # 写入内容
fh.close() # 关闭
time.sleep(float(random.randint(10, 50)) / 10) # 随机延时
return browser
设置起止页
start_p = 0
end_p = 4
如果平凡使用谷歌,谷歌会启动防机器人机制,这是函数会暂停等待我人工解锁的。
所以这里我也相当于解释了我为什么没有翻墙,因为如果我使用翻墙软件爬取,是会被谷歌发现并封杀掉的,而如何绕过呢?卖个关子,看看有没有懂行的朋友帮大家解释一下。
c_service = webdriver.chrome.service.Service("/usr/bin/chromedriver")
c_service.command_line_args()
c_service.start()
chrome_options = webdriver.ChromeOptions()
# chrome_options.add_argument('--proxy-server=socks5://localhost:1080')
auto_quit_cnt = 0
browser = webdriver.Chrome(chrome_options=chrome_options) # 调用Chrome浏览器
for page in range(start_p, end_p):
print("-" * 30)
print("Page: " + str(page))
print("-" * 30)
google_search_url = make_google_search_url(page)
browser.get(google_search_url)
html_text = browser.page_source # 获得页面代码
while "Our systems have detected unusual traffic" in html_text:
print("Google Robot!")
time.sleep(10)
html_text = browser.page_source # 获得页面代码
auto_quit_cnt += 1
if auto_quit_cnt > 30:
break
auto_quit_cnt = 0
lofter_list = get_url_from_search(html_text)
browser = find_ao3_from_lofter(lofter_list, browser, "lofter")
写在最后:
关于AO3这个系列,我还剩最后两篇文章:
基于深度学习的 NLP 文本分类器;
基于OpenCV 的图像视频制作.
这个话题做了快一个月了,我希望能够将我想讲的技术安安静静讲完。然后再带着大家探索其他有意思的编程技术,而不是揪着这个话题不放。
所以再次申明,我只是分析 AO3 其他事情我不做探讨和引申,也恳请大家理性思考和探讨。上文中我已经有限扩大了讨论范围。我的下一篇文章会按照我的规划来,我的下一个视频会是另一个好玩的技术。
我也希望即使你不喜欢我,也不要讨厌技术,不要讨厌学习。
在这段时间之前我是没有做Python数据分析的相关知识的;虽然同属深度学习,NLP不是我的专业,所以我也是第一次实践,但是通过这个热点,我收获了很多新知识,也有很多人给我点赞鼓励交流探讨。我收获了很多。
但是,
你收获了什么呢?